Technical Article

Delphi HotPDF Hello World: Vaš prvi PDF program

Svaka biblioteka za PDF dolazi s "hello world" primjerom, a HotPDF-ov je vrijedan detaljnijeg proučavanja jer najmanji program koji radi bilo što već zahtijeva dvije odluke koje ćete ponavljati u svakom dokumentu nakon toga: koji font postaviti i gdje na stranici smjestiti tekst. Ako to dvoje ispravno postavite, ostatak API-ja samo su varijacije na temu. Evo cijelog koda, konzolnog programa koji ispisuje jednu stranicu s pozdravom čitatelju na gotovo desetak jezika:

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 mir!'); // 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.

Višejezični Hello World PDF stvoren pomoću HotPDF komponente u Delphiju

To je cijeli primjer. THotPDF.Create(nil) u kombinaciji s try/finally ... Free predstavlja uobičajeni Delphi obrazac upravljanja vlasništvom, a PDF ga ne mijenja. Ono što zaslužuje pozornost je struktura od četiri koraka unutar koda: postavljanje svojstava, BeginDoc, crtanje i EndDoc. Redoslijed se ne može mijenjati.

Postavite svojstva dokumenta prije poziva BeginDoc

BeginDoc je trenutak kada HotPDF definira strukturu dokumenta, tako da se sve što utječe na cijelu datoteku mora postaviti prije toga. Compression := cmFlateDecode uključuje FlateDecode za tokove sadržaja, što čini razliku između kompaktne datoteke i nepotrebno prevelike datoteke. FontEmbedding := True ugrađuje font kojim crtate u samu datoteku, pa ona izgleda jednako na računalu koje nikada nije imalo instaliran Arial Unicode MS kao i na vašem. Ako bilo koje od ovih svojstava dodijelite nakon BeginDoc, to neće imati utjecaja na dokument koji je već u izradi, i to bez ikakve poruke o pogrešci.

Pozovite SetFont, zatim TextOut i pazite na ishodište

Dvije stvari kod poziva za crtanje zbunjuju svakoga na njihovoj prvoj stranici. Prva je redoslijed: SetFont se mora pokrenuti prije bilo kojeg poziva TextOut koji ovisi o njemu, te se mora ponoviti nakon svakog poziva AddPage, jer trenutni font ne preživljava prijelom stranice. Druga je koordinatni sustav. TextOut mjeri udaljenost od donjeg lijevog kuta stranice, a ne od gornjeg lijevog, pri čemu se Y povećava prema gore, u točkama (1/72 inča). Zato se linije ovdje pomiču prema dolje od 760, svaka 30 točaka ispod prethodne. Svatko tko dolazi iz svijeta grafike na zaslonu pretpostavlja suprotno i piše prvu liniju izvan donjeg ruba.

Jedan font, mnogo pisama

Razlog zašto jedan poziv SetFont može podržati latinicu, ćirilicu, japansko i kinesko pismo na istoj stranici leži u samom fontu: Arial Unicode MS objedinjuje glifove za gotovo svako pismo u jednoj datoteci. Četvrti argument za SetFont je Windows skup znakova, a prosljeđivanje vrijednosti DEFAULT_CHARSET omogućuje sustavu odabir glifova po nizu znakova umjesto vezanja svega uz jednu zastarjelu kodnu stranicu. Dvije napomene prate ovu pogodnost. Font mora biti prisutan na računalu koje gradi PDF, jer HotPDF ugrađuje ono što operacijski sustav razriješi pod tim nazivom; ako Arial Unicode MS nedostaje, Windows će tiho postaviti zamjenski font pa bi se vaš CJK tekst mogao prikazati kao prazni kvadratići. Također, to ne pokriva svako pismo podjednako: za pisanje zdesna nalijevo poput arapskog i hebrejskog, ili bilo što što zahtijeva složeno oblikovanje, trebat ćete namjenski font učitan pomoću RegisterUnicodeTTF i pozive za tekst zdesna nalijevo, što je tema za sebe.

Pokrenite ga i dobit ćete HelloWorld.pdf u radnom direktoriju: jedna stranica, nekoliko redaka višejezičnog teksta, sažeto, s ugrađenim fontom. Očigledni sljedeći koraci su dodavanje veličine, stila i rotacije tom tekstu, te namjerno postavljanje više blokova teksta, što je detaljno opisano u TextOut primjeru. Kada želite crtati crte, okvire i slike umjesto samog teksta, isti objekt stranice sadrži i te pozive.

Pozivi TextOut, SetFont i dokumenti prikazani ovdje dio su HotPDF komponente za Delphi i C++Builder.