Articol tehnic

HotPDF Hello World în Delphi: primul dumneavoastră PDF

Fiecare bibliotecă PDF livrează un „hello world”, iar cel din HotPDF merită parcurs pe îndelete, pentru că cel mai mic program care face ceva vă impune deja două decizii pe care le veți repeta în fiecare document de după: ce font să setați și unde pe pagină aterizează textul. Nimeriți-le pe acestea două și restul API-ului este doar variațiuni pe aceeași temă. Iată tot programul, o aplicație de consolă care scrie o singură pagină ce salută cititorul în aproape o duzină de limbi:

Diagramă a fluxului programului HotPDF Hello World în Delphi, format din patru apeluri, cu originea PDF în stânga jos și două capcane tăcute evidențiate
Creare, început, desenare, încheiere este toată coloana vertebrală, iar originea din stânga jos explică de ce liniile ulterioare folosesc valori Y mai mici
program HelloWorld;

{$APPTYPE CONSOLE}

uses
  Winapi.Windows,   // pentru DEFAULT_CHARSET; pe Delphi anterior XE2 folosiți Windows simplu
  HPDFDoc;          // unitatea principală HotPDF

procedure CreateHelloWorld(const FileName: string);
var
  Pdf: THotPDF;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := FileName;
    Pdf.Compression := cmFlateDecode;   // micșorează fluxurile de conținut
    Pdf.FontEmbedding := True;          // încorporează fontul, ca să se randeze oriunde
    Pdf.BeginDoc;

    // Un singur font care acoperă multe scrieri. Al 4-lea argument este setul de caractere Windows;
    // DEFAULT_CHARSET lasă sistemul să aleagă glifele pentru fiecare șir.
    Pdf.CurrentPage.SetFont('Arial Unicode MS', [], 14, DEFAULT_CHARSET);

    // TextOut măsoară din colțul din STÂNGA JOS, în puncte, cu Y crescând în sus.
    Pdf.CurrentPage.TextOut(72, 760, 0, 'Hello, Delphi PDF world!');     // engleză
    Pdf.CurrentPage.TextOut(72, 730, 0, 'Hola, mundo Delphi PDF!');      // spaniolă
    Pdf.CurrentPage.TextOut(72, 700, 0, 'Hallo, Delphi PDF Welt!');      // germană
    Pdf.CurrentPage.TextOut(72, 670, 0, 'Bonjour, monde PDF Delphi!');   // franceză
    Pdf.CurrentPage.TextOut(72, 640, 0, 'Ciao, mondo Delphi PDF!');      // italiană
    Pdf.CurrentPage.TextOut(72, 610, 0, 'Olá, mundo Delphi PDF!');       // portugheză
    Pdf.CurrentPage.TextOut(72, 580, 0, 'Здравствуйте, Delphi PDF мир!'); // rusă
    Pdf.CurrentPage.TextOut(72, 550, 0, 'こんにちは、Delphi PDFの世界!');    // japoneză
    Pdf.CurrentPage.TextOut(72, 520, 0, 'Merhaba, Delphi PDF dünyası!');  // turcă
    Pdf.CurrentPage.TextOut(72, 490, 0, '你好,Delphi PDF世界');           // chineză
    Pdf.CurrentPage.TextOut(72, 460, 0, '여보세요, Delphi PDF 세계!');      // coreeană

    Pdf.EndDoc;
  finally
    Pdf.Free;
  end;
end;

begin
  CreateHelloWorld('HelloWorld.pdf');
  Writeln('Wrote HelloWorld.pdf');
end.

PDF Hello World multilingv produs de componenta HotPDF pentru Delphi

Acesta este tot exemplul. Perechea THotPDF.Create(nil) cu try/finally ... Free este tiparul obișnuit de proprietate din Delphi, iar PDF-ul nu îl schimbă. Ce merită atenție este coloana vertebrală în patru pași din interior: setați proprietățile, BeginDoc, desenați, EndDoc. Ordinea nu este interschimbabilă

Setați proprietățile documentului înainte de BeginDoc

BeginDoc este momentul în care HotPDF fixează structura documentului, așa că orice afectează întregul fișier trebuie setat înaintea lui. Compression := cmFlateDecode pornește FlateDecode pentru fluxurile de conținut, ceea ce face diferența dintre un fișier compact și unul umflat inutil. FontEmbedding := True împachetează în fișier fontul cu care desenați, așa că arată la fel pe o mașină pe care nu a fost instalat niciodată Arial Unicode MS ca pe a dumneavoastră. Atribuiți oricare dintre ele după BeginDoc și nu face nimic, în tăcere, documentului deja început, fără vreo eroare care să vă avertizeze

SetFont, apoi TextOut, și fiți atent la origine

Două lucruri legate de apelurile de desenare prind pe toată lumea la prima pagină. Primul este ordinea: SetFont trebuie să ruleze înaintea oricărui TextOut care depinde de el și trebuie repetat după fiecare AddPage, pentru că fontul curent nu supraviețuiește unei schimbări de pagină. Al doilea este sistemul de coordonate. TextOut măsoară din colțul din stânga jos al paginii, nu din stânga sus, cu Y crescând pe măsură ce urcați, în puncte (1/72 dintr-un inch). De aceea liniile de aici coboară în jos de la 760, fiecare cu 30 de puncte sub cea dinainte. Oricine vine dinspre grafica de ecran presupune inversul și scrie prima linie direct dincolo de marginea de jos

Un singur font, multe scrieri

Motivul pentru care un singur SetFont poate purta latină, chirilică, japoneză și chineză pe aceeași pagină este chiar fontul: Arial Unicode MS adună într-un singur fișier glife pentru aproape orice scriere. Al patrulea argument al lui SetFont este setul de caractere Windows, iar transmiterea lui DEFAULT_CHARSET lasă sistemul să aleagă glifele pentru fiecare șir, în loc să lege totul de o singură pagină de coduri moștenită. Două rezerve vin la pachet cu această comoditate. Fontul trebuie să fie prezent pe mașina care construiește PDF-ul, pentru că HotPDF încorporează ceea ce rezolvă sistemul de operare din numele dat; dacă Arial Unicode MS lipsește, Windows pune discret un înlocuitor, iar textul dumneavoastră CJK poate ieși ca niște casete goale. Și nu acoperă toate scrierile la fel: pentru scrierea de la dreapta la stânga, precum araba și ebraica, sau pentru orice are nevoie de modelare complexă, apelați la un font dedicat, încărcat cu RegisterUnicodeTTF, și la apelurile de text de la dreapta la stânga, ceea ce este un subiect în sine

Rulați-l și obțineți HelloWorld.pdf în directorul de lucru: o pagină, câteva linii de text multilingv, comprimate, cu fontul încorporat. Pașii următori evidenți sunt să dați textului dimensiune, stil și rotație și să plasați intenționat mai mult de un bloc de text, ambele fiind parcurse în exemplul TextOut. Când vreți să desenați linii, casete și imagini, nu doar text, același obiect pagină găzduiește și acele apeluri

Apelurile TextOut, SetFont și cele de document prezentate aici fac parte din HotPDF Delphi Component pentru Delphi și C++Builder