Bonjour à toutes et à tous,
Suite de mes tribulations pour produire du PDF sous FMX.
J'ai réussi ! Enfin presque...
J'ai repris le portage pour Free Pascal fait par Jean Patrick à partir de la classe PHP FPDF de Olivier PLATHEY...
J'en ai retiré tout ce qui concerne les images car elles utilisent les librairies équivalentes à la VCL (LCL) qui ne compile pas sous FMX, je m'y attaquerai après.
Pour l'instant, j'ai un autre soucis, le codage du fichier de sortie. Voici grosso modo le code permettant de créer le fichier :
Le contenu (ce qui sera sauvé dans le fichier PDF) est défini come ça :
la focntion permettant d'ajouter du texte est définie comme ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part buffer: TMemoryStream;
et l'enregistremenet :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 procedure TJPFpdf._out(sText: string); begin //Add a line to the document if (Self.state = 2) then Self.pages[Self.page] += sText + #10 else begin sText := sText + #10; Self.buffer.Write(Pointer(sText)^, Length(sText) * SizeOf(char)); end; end;
de ce que j'ai pu comprendre, la propriété "state" vaut "1" lors de la création du doc (quand on appelle "_BeginDoc" qui écrit la première ligne _out('%PDF-1.7'); ), "3" après la fin de la constitution du doc (appel de "_EndDoc" : _out('%%EOF'); ) et donc vaudrait "2" en cours de remplissage du document...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 procedure TJPFpdf.SaveToFile(vFile: string); begin if (Self.state < 3) then begin Close; end; //Save file locally try Self.buffer.SaveToFile(vFile); except Error('Unable to create output file: ' + vFile); end; end;
A ce stade, ca fonctionne sauf que :
lorsque je tente d'ouvrir le fichier pdf produit (avec juste un texte "Texte épuré"), j'ai une erreur de Adobe quime dit que le format n'est pas reconnu, et pour cause, il semble que chaque caractère soit suivi d'un espace (genre encodage en Unicode sur 20 octets...
Si j'ouvre le fichier sous Notepad++, les espaces n'apparaissent pas, mais aucun encodage n'est sélectionné. Si je sélectionne un encodage ANSI et que je sauve, ça marche le fichier est reconnu par Adobe reader.
J'avoue completement sécher sur cette notion d'unicode, d'UTF-8 et UTF16 et tout ça.
J'ai cru lire dans les (rares) docs embarcadero que Delphi gérait en interne totues ses chaines en unicode (le format String serait une dérivation d'un formati Wide string en unicode 16 apparemment.
D'où ma question : comment je fais pour avoir un fichier directement produit en UTF-8 ou ANSI ou je sais pas trop quoi, mais qui puisse contenir des caractères accentués (je vous raconte pas comment est sorti "épuré") et qui soit lisible...
la page de site ou on peut télécharger le code complet :
http://fpdf.org/, ensuite "télécharger" poru al versino PHP? et dans la section "liens" pour Free Pascal .
Merci à tous !
Partager