Technical Article

Delphi HotPDF Hello World: Vaš prvi program PDF

Vsaka knjižnica PDF vsebuje primer »hello world« in HotPDF-jev je vreden podrobnejše obravnave. Že najmanjši program, ki naredi karkoli, vas namreč prisili v dve odločitvi, ki ju boste ponovili v vsakem naslednjem dokumentu: katero pisavo nastaviti in kje na strani naj se besedilo izpiše. Če pravilno nastavite ti dve zadevi, je preostanek vmesnika API le variacija na to temo. Tukaj je celotna koda, konzolni program, ki ustvari eno stran z pozdravom bralcu v skoraj ducatu jezikih:

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.

Večjezični Hello World PDF, ki ga ustvari komponenta HotPDF v Delphi

To je celoten primer. Povezava THotPDF.Create(nil) z try/finally ... Free je običajen vzorec lastništva v Delphi in PDF tega ne spreminja. Pozornost si zasluži predvsem ogrodje iz štirih korakov: nastavitev lastnosti, BeginDoc, risanje in EndDoc. Vrstni red ni zamenljiv.

Nastavite lastnosti dokumenta pred klicem BeginDoc

BeginDoc je trenutek, ko HotPDF potrdi strukturo dokumenta, zato je treba vse, kar vpliva na celotno datoteko, nastaviti pred tem. Lastnost Compression := cmFlateDecode vklopi stiskanje FlateDecode za toke vsebine, kar predstavlja razliko med kompaktno datoteko in nepotrebno preveliko datoteko. Lastnost FontEmbedding := True zapakira pisavo, s katero rišete, v datoteko, tako da je dokument videti enako na računalniku, ki nima nameščene pisave Arial Unicode MS, kot na vaši napravi. Če katerokoli od teh lastnosti določite po klicu BeginDoc, to tiho ne bo imelo učinka na že začeti dokument, brez kakršnegakoli opozorila o napaki.

SetFont, nato TextOut in pazite na izhodišče

Dve stvari pri klicih za risanje presenetita vsakogar na njegovi prvi strani. Prva je vrstni red: SetFont se mora izvesti pred vsakim klicem TextOut, ki je odvisen od njega, in ga je treba ponoviti po vsakem klicu AddPage, saj trenutna pisava ne preživi preloma strani. Druga stvar je koordinatni sistem. Klic TextOut meri od spodnjega levega kota strani in ne od zgornjega levega, pri čemer se Y povečuje navzgor, v točkah (1/72 palca). Zato se vrstice tukaj pomikajo navzdol od 760, pri čemer je vsaka 30 točk pod prejšnjo. Vsakdo, ki prihaja iz sveta zaslonske grafike, predpostavlja nasprotno in izpiše prvo vrstico naravnost čez spodnji rob.

Ena pisava, več pisnih sistemov

Razlog, da lahko en sam klic SetFont podpira latinico, cirilico, japonščino in kitajščino na isti strani, je sama pisava: Arial Unicode MS združuje glife za skoraj vsak pisni sistem v eni datoteki. Četrti argument za SetFont je nabor znakov Windows in prenos vrednosti DEFAULT_CHARSET omogoča sistemu, da izbere glife za vsak niz posebej, namesto da bi vse vezal na eno zastarelo kodno tabelo. Ta priročnost pa prinaša dve opozorili. Pisava mora biti prisotna na računalniku, ki gradi PDF, saj HotPDF vgradi tisto pisavo, ki jo operacijski sistem poveže s tem imenom; če pisave Arial Unicode MS ni, Windows tiho uporabi nadomestek, vaše besedilo CJK pa se lahko izpiše kot prazni kvadratki. Prav tako ne podpira vseh pisav enako: za pisanje od desne proti levi, kot sta arabščina in hebrejščina, ali za karkoli, kar zahteva kompleksno oblikovanje besedila, morate uporabiti namensko pisavo, naloženo z RegisterUnicodeTTF, in klicati funkcije za besedilo od desne proti levi, kar je tema zase.

Zaženite program in v delovnem imeniku boste prejeli datoteko HelloWorld.pdf: ena stran, nekaj vrstic večjezičnega besedila, stisnjeno in z vgrajeno pisavo. Očitni naslednji koraki so določanje velikosti, sloga in rotacije tega besedila ter načrtna postavitev več blokov besedila, kar obravnava vzorec TextOut. Ko želite namesto samega besedila risati črte, okvirje in slike, isti objekt strani vsebuje tudi te klice.

Klici TextOut, SetFont in klici dokumenta, prikazani tukaj, so del komponente HotPDF Component za Delphi in C++Builder.