Toute bibliothèque PDF livre un « hello world », et celui de HotPDF mérite qu'on s'y attarde, car le programme le plus minimal qui fait quelque chose impose déjà deux décisions que vous répéterez dans chaque document par la suite : quelle police choisir, et où le texte se positionnera sur la page. Maîtrisez ces deux points et le reste de l'API n'est que variations sur le même thème. Voici l'intégralité du programme, un exemple console qui accueille le lecteur dans près d'une douzaine de langues :
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.

C'est l'intégralité de l'exemple. Le THotPDF.Create(nil) couplé à try/finally ... Free correspond au modèle habituel de possession des objets Delphi, et le PDF n'y change rien. Ce qui mérite l'attention, c'est la colonne vertébrale en quatre étapes à l'intérieur : définir les propriétés, BeginDoc, dessiner, EndDoc. L'ordre n'est pas interchangeable.
Définir les propriétés du document avant BeginDoc
BeginDoc est le moment où HotPDF valide la structure du document ; tout ce qui concerne le fichier entier doit donc être défini avant. Compression := cmFlateDecode active le FlateDecode pour les flux de contenu, ce qui fait la différence entre un fichier compact et un fichier inutilement gonflé. FontEmbedding := True intègre dans le fichier la police avec laquelle vous dessinez, de sorte que le rendu est identique sur une machine qui n'a jamais eu Arial Unicode MS installé. Affectez l'un ou l'autre après BeginDoc et il ne fera silencieusement rien sur le document déjà en cours, sans aucune erreur pour vous prévenir.
SetFont, puis TextOut, et attention à l'origine
Deux choses dans les appels de dessin surprennent tout le monde à la première page. La première est l'ordre : SetFont doit s'exécuter avant tout TextOut qui en dépend, et doit être répété après chaque AddPage, car la police courante ne survit pas au saut de page. La seconde est le système de coordonnées. TextOut mesure depuis l'angle inférieur gauche de la page, et non depuis l'angle supérieur gauche, avec Y croissant vers le haut, en points (1/72 pouce). C'est pourquoi les lignes progressent vers le bas à partir de 760, chacune 30 points en dessous de la précédente. Quiconque arrive des graphiques écran présuppose l'inverse et écrit la première ligne hors du bord inférieur de la page.
Une seule police, de nombreuses écritures
Si un seul SetFont peut transporter du latin, du cyrillique, du japonais et du chinois sur la même page, c'est grâce à la police elle-même : Arial Unicode MS regroupe des glyphes pour presque toutes les écritures dans un seul fichier. Le quatrième argument de SetFont est le jeu de caractères Windows, et passer DEFAULT_CHARSET laisse le système choisir les glyphes par chaîne plutôt que de tout épingler sur un unique héritage de page de code. Deux mises en garde accompagnent cette commodité. La police doit être présente sur la machine qui produit le PDF, car HotPDF intègre ce que le système d'exploitation résout sous ce nom ; si Arial Unicode MS est absente, Windows substitue silencieusement une autre police et le texte CJK peut apparaître sous forme de cases vides. Et elle ne couvre pas toutes les écritures également : pour les textes de droite à gauche comme l'arabe et l'hébreu, ou tout ce qui nécessite un shaping complexe, on fait appel à une police dédiée chargée avec RegisterUnicodeTTF et aux appels de texte de droite à gauche, sujet qui mérite son propre article.
Exécutez-le et vous obtenez HelloWorld.pdf dans le répertoire de travail : une page, quelques lignes de texte multilingue, compressé, avec la police intégrée. Les étapes suivantes évidentes sont de donner à ce texte une taille, un style et une rotation, et de placer plusieurs blocs de texte de manière intentionnelle — ce que l'exemple TextOut développe. Lorsque vous souhaitez tracer des règles, des cadres et des images plutôt que du simple texte, le même objet page offre également ces appels.
Les appels TextOut, SetFont et de document présentés ici font partie du HotPDF Component pour Delphi et C++Builder.