Toute bibliothèque PDF livre son "hello world", et celui de HotPDF mérite qu'on ralentisse, car le plus petit programme qui fasse quoi que ce soit impose déjà deux décisions que vous répéterez dans tous les documents suivants : quelle police poser, et où le texte atterrit sur la page. Réussissez ces deux-là et le reste de l'API n'est que variations sur un thème. Le voici en entier, un programme console qui écrit une page unique saluant le lecteur dans près d'une douzaine de langues :
program HelloWorld;
{$APPTYPE CONSOLE}
uses
Winapi.Windows, // pour DEFAULT_CHARSET ; avant XE2, utilisez simplement Windows
HPDFDoc; // unité principale de HotPDF
procedure CreateHelloWorld(const FileName: string);
var
Pdf: THotPDF;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := FileName;
Pdf.Compression := cmFlateDecode; // réduire les flux de contenu
Pdf.FontEmbedding := True; // incorporer la police pour un rendu identique partout
Pdf.BeginDoc;
// Une seule police couvrant de nombreuses écritures. Le 4e argument est le charset Windows ;
// DEFAULT_CHARSET laisse le système choisir les glyphes selon la chaîne.
Pdf.CurrentPage.SetFont('Arial Unicode MS', [], 14, DEFAULT_CHARSET);
// TextOut mesure depuis le coin INFÉRIEUR GAUCHE, en points, Y croissant vers le haut.
Pdf.CurrentPage.TextOut(72, 760, 0, 'Hello, Delphi PDF world!'); // anglais
Pdf.CurrentPage.TextOut(72, 730, 0, 'Hola, mundo Delphi PDF!'); // espagnol
Pdf.CurrentPage.TextOut(72, 700, 0, 'Hallo, Delphi PDF Welt!'); // allemand
Pdf.CurrentPage.TextOut(72, 670, 0, 'Bonjour, monde PDF Delphi!'); // français
Pdf.CurrentPage.TextOut(72, 640, 0, 'Ciao, mondo Delphi PDF!'); // italien
Pdf.CurrentPage.TextOut(72, 610, 0, 'Olá, mundo Delphi PDF!'); // portugais
Pdf.CurrentPage.TextOut(72, 580, 0, 'Здравствуйте, Delphi PDF мир!'); // russe
Pdf.CurrentPage.TextOut(72, 550, 0, 'こんにちは、Delphi PDFの世界!'); // japonais
Pdf.CurrentPage.TextOut(72, 520, 0, 'Merhaba, Delphi PDF dünyası!'); // turc
Pdf.CurrentPage.TextOut(72, 490, 0, '你好,Delphi PDF世界'); // chinois
Pdf.CurrentPage.TextOut(72, 460, 0, '여보세요, Delphi PDF 세계!'); // coréen
Pdf.EndDoc;
finally
Pdf.Free;
end;
end;
begin
CreateHelloWorld('HelloWorld.pdf');
Writeln('Wrote HelloWorld.pdf');
end.

Voilà tout l'exemple. Le THotPDF.Create(nil) associé à try/finally ... Free est le schéma ordinaire de propriété en Delphi, et le PDF n'y change rien. Ce qui mérite attention, c'est la colonne vertébrale en quatre temps à l'intérieur : poser les propriétés, BeginDoc, dessiner, EndDoc. L'ordre n'est pas interchangeable
Posez les propriétés du document avant BeginDoc
BeginDoc est le moment où HotPDF fige la structure du document, si bien que tout ce qui affecte le fichier entier doit être posé avant lui. Compression := cmFlateDecode active FlateDecode pour les flux de contenu, ce qui fait la différence entre un fichier compact et un fichier inutilement gonflé. FontEmbedding := True range la police avec laquelle vous dessinez dans le fichier, si bien qu'il a la même allure sur une machine qui n'a jamais eu Arial Unicode MS installé que sur la vôtre. Affectez l'une ou l'autre après BeginDoc et elle ne fait silencieusement rien au document déjà en cours, sans la moindre erreur pour vous avertir
SetFont, puis TextOut, et attention à l'origine
Deux choses à propos des appels de dessin attrapent 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 à un saut de page. La seconde est le système de coordonnées. TextOut mesure depuis le coin inférieur gauche de la page, pas depuis le coin supérieur gauche, avec Y croissant à mesure que l'on monte, en points (1/72 de pouce). Voilà pourquoi les lignes descendent ici vers le bas à partir de 760, chacune 30 points sous la précédente. Quiconque arrive du graphisme à l'écran suppose l'inverse et écrit la première ligne juste hors du bord inférieur
Une police, de nombreuses écritures
La raison pour laquelle un seul SetFont peut porter du latin, du cyrillique, du japonais et du chinois sur la même page tient à la police elle-même : Arial Unicode MS rassemble dans un seul fichier des glyphes pour presque toutes les écritures. Le quatrième argument de SetFont est le jeu de caractères Windows, et passer DEFAULT_CHARSET laisse le système choisir les glyphes selon la chaîne au lieu de tout épingler à une page de codes héritée. Deux réserves accompagnent cette commodité. La police doit être présente sur la machine qui construit le PDF, car HotPDF incorpore ce que le système résout à partir du nom ; si Arial Unicode MS manque, Windows glisse discrètement une police de remplacement et votre texte CJK peut sortir en carrés vides. Et elle ne couvre pas toutes les écritures également : pour les écritures de droite à gauche comme l'arabe et l'hébreu, ou pour tout ce qui demande une mise en forme complexe, vous vous tournerez vers une police dédiée chargée par RegisterUnicodeTTF et vers les appels de texte de droite à gauche, ce qui est un sujet en soi
Lancez-le et vous obtenez HelloWorld.pdf dans le répertoire de travail : une page, quelques lignes de texte multilingue, compressées, avec la police incorporée. Les étapes suivantes évidentes sont de donner à ce texte une taille, un style et une rotation, et de placer délibérément plus d'un bloc, deux points que traite l'exemple TextOut. Quand vous voudrez tracer des filets, des cadres et des images plutôt que du seul texte, le même objet page porte aussi ces appels
Les appels TextOut, SetFont et de document présentés ici font partie du composant HotPDF pour Delphi, pour Delphi et C++Builder