Article technique

Delphi HotPDF Hello World : Votre premier programme PDF

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.

Delphi 中 Composant HotPDF生成的包含多语言 Hello World 文本的 PDF 示例

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

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. Compression := 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 TextOut qui en dépend, et doit être réappelé après chaque AddPage 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 SetFont 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 DEFAULT_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