Chaque bibliothèque PDF est livrée avec un exemple "Hello World", et celui de HotPDF mérite d'être étudié de près. Même le programme le plus minimal réalisant la fonctionnalité la plus basique vous oblige à prendre deux décisions qui se répéteront dans chaque document ultérieur : quelle police configurer et où placer le texte sur la page. Une fois ces deux questions traitées, le reste de l'API n'est qu'une variante sur cette base. Voici le code complet, un programme console qui écrit une seule page saluant le lecteur dans près d'une douzaine de langues :
Code source
program HelloWorld;
{$APPTYPE CONSOLE}
uses
Winapi.Windows, // for DEFAULT_CHARSET; on pre-XE2 Delphi use plain Windows
HPDFDoc; // HotPDF main unit
procedure CreateHelloWorld(const FileName: string);
var
Pdf: THotPDF;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := FileName;
Pdf.Compression := cmFlateDecode; // shrink the content streams
Pdf.FontEmbedding := True; // embed the face so it renders anywhere
Pdf.BeginDoc;
// One face covering many scripts. The 4th argument is the Windows charset;
// DEFAULT_CHARSET lets the system pick glyphs per string.
Pdf.CurrentPage.SetFont('Arial Unicode MS', [], 14, DEFAULT_CHARSET);
// TextOut measures from the BOTTOM-LEFT corner, in points, Y growing upward.
Pdf.CurrentPage.TextOut(72, 760, 0, 'Hello, Delphi PDF world!'); // English
Pdf.CurrentPage.TextOut(72, 730, 0, 'Hola, mundo Delphi PDF!'); // Spanish
Pdf.CurrentPage.TextOut(72, 700, 0, 'Hallo, Delphi PDF Welt!'); // German
Pdf.CurrentPage.TextOut(72, 670, 0, 'Bonjour, monde PDF Delphi!'); // French
Pdf.CurrentPage.TextOut(72, 640, 0, 'Ciao, mondo Delphi PDF!'); // Italian
Pdf.CurrentPage.TextOut(72, 610, 0, 'Olá, mundo Delphi PDF!'); // Portuguese
Pdf.CurrentPage.TextOut(72, 580, 0, 'Здравствуйте, Delphi PDF мир!'); // Russian
Pdf.CurrentPage.TextOut(72, 550, 0, 'こんにちは、Delphi PDFの世界!'); // Japanese
Pdf.CurrentPage.TextOut(72, 520, 0, 'Merhaba, Delphi PDF dünyası!'); // Turkish
Pdf.CurrentPage.TextOut(72, 490, 0, '你好,Delphi PDF世界'); // Chinese
Pdf.CurrentPage.TextOut(72, 460, 0, '여보세요, Delphi PDF 세계!'); // Korean
Pdf.EndDoc;
finally
Pdf.Free;
end;
end;
begin
CreateHelloWorld('HelloWorld.pdf');
Writeln('Wrote HelloWorld.pdf');
end.

Voici l'exemple complet. THotPDF.Create(nil) combiné avec try/finally ... Free est le modèle d'appartenance d'objet standard de Delphi, la génération du PDF ne modifiant pas cet aspect. Notez le processus principal en quatre étapes internes : configurer les propriétés, BeginDoc, dessiner, EndDoc. Cet ordre n'est pas interchangeable
Définir les propriétés du document avant BeginDoc
est le moment où HotPDF valide la structure du document, de sorte que toute configuration affectant l'ensemble du fichier doit être effectuée avant celle-ci. BeginDocCompression := cmFlateDecode active la compression FlateDecode pour les flux de contenu, ce qui détermine si le fichier généré est compact ou inutilement volumineux. FontEmbedding := True encapsule les polices utilisées lors du tracé du texte dans le fichier, de sorte que le PDF s'affiche de la même manière sur une machine où Arial Unicode MS n'a jamais été installée que sur votre machine de développement. Si vous configurez l'une ou l'autre de ces propriétés après BeginDoc, elle n'aura aucun effet sur le document en cours de génération, et ce sans aucun avertissement
D'abord SetFont, puis TextOut, et attention à l'origine des coordonnées
Concernant les appels de dessin, il y a deux aspects sur lesquels les nouveaux développeurs peuvent facilement trébucher. Le premier est l'ordre : SetFont doit être exécuté avant tout qui en dépend, et doit être réappelé après chaque TextOutAddPage car la configuration actuelle de la police ne persiste pas d'une page à l'autre. Le second est le système de coordonnées. TextOut mesure à partir du coin inférieur gauche de la page (et non du coin supérieur gauche), l'axe Y augmentant vers le haut, en points (1/72 de pouce). C'est pourquoi les lignes de texte ici sont disposées de 760 vers le bas, chaque ligne étant inférieure de 30 points à la précédente. Les personnes habituées à la programmation graphique sur écran pensent généralement l'inverse, écrivant la première ligne de texte directement au-delà du bord inférieur
Une seule police, plusieurs scripts linguistiques
Sur une même page, un seul permet d'afficher simultanément du latin, du cyrillique, du japonais et du chinois grâce à la police elle-même : Arial Unicode MS regroupe les glyphes de presque tous les scripts dans un seul fichier. Le quatrième paramètre de SetFont correspond au jeu de caractères Windows, et transmettre SetFontDEFAULT_CHARSET permet au système de sélectionner les glyphes pour chaque chaîne au lieu de lier le tout à une page de code traditionnelle. Cependant, cette commodité s'accompagne de deux réserves. Premièrement, la police doit être présente sur la machine générant le PDF, car HotPDF intègre la police résolue sous ce nom par le système d'exploitation ; en l'absence d'Arial Unicode MS, Windows la remplacera silencieusement, transformant vos textes CJK en carrés vides. Deuxièmement, elle ne couvre pas tous les scripts de manière optimale : pour les écritures de droite à gauche comme l'arabe et l'hébreu, ou tout script nécessitant une mise en forme complexe, vous devez enregistrer une police dédiée avec RegisterUnicodeTTF et utiliser les appels de dessin de droite à gauche, ce qui constitue un sujet distinct
Exécutez le programme et vous obtiendrez HelloWorld.pdf dans votre répertoire de travail : une page unique, quelques lignes de texte multilingue compressées et des polices incorporées. L'étape suivante consiste naturellement à attribuer une taille, un style et un angle de rotation au texte, et à positionner délibérément plusieurs blocs de texte, deux sujets détaillés dans l'exemple de TextOut. Lorsque vous souhaitez dessiner des lignes, des boîtes et des images en plus du texte, le même objet page fournit des appels pour ces méthodes
Les appels de TextOut, SetFont et de manipulation de documents présentés dans cet article font partie du composant HotPDF pour Delphi et C++Builder