Műszaki cikk

Delphi HotPDF Hello World: Az Ön első PDF programja

Minden PDF könyvtár szállít egy „hello world”-öt, és a HotPDF-nél érdemes lelassítani, mert a legkisebb program, amely csinál valamit, már két olyan döntésre kényszeríti Önt, amelyeket a későbbiekben minden dokumentumban meg fog ismételni: melyik betűtípust (font) állítsa be, és hol landoljon a szöveg az oldalon. Ha ezt a kettőt jól eltalálja, az API többi része már csak variációk egy témára. Itt van az egész, egy konzolprogram, amely egyetlen oldalt ír, közel tucatnyi nyelven üdvözölve az olvasót:

Diagram a négycsapásos HotPDF Hello World programfolyamatról Delphi-ben, a bal alsó PDF origóval és két csendes csapdával kiemelve
Létrehozás, kezdés, rajzolás, befejezés — ez az egész gerinc, és a bal alsó origó magyarázza meg, miért használnak a későbbi sorok kisebb Y értékeket
program HelloWorld;

{$APPTYPE CONSOLE}

uses
  Winapi.Windows,   // a DEFAULT_CHARSET-hez; XE2 előtti Delphi esetén használja a sima Windowst
  HPDFDoc;          // HotPDF főegység

procedure CreateHelloWorld(const FileName: string);
var
  Pdf: THotPDF;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := FileName;
    Pdf.Compression := cmFlateDecode;   // a tartalomfolyamok zsugorítása
    Pdf.FontEmbedding := True;          // ágyazza be a betűváltozatot, hogy bárhol renderelhető legyen
    Pdf.BeginDoc;

    // Egy betűváltozat sok írásrendszerhez. A 4. argumentum a Windows karakterkészlete
    // A DEFAULT_CHARSET lehetővé teszi, hogy a rendszer karakterlánconként válasszon glifákat
    Pdf.CurrentPage.SetFont('Arial Unicode MS', [], 14, DEFAULT_CHARSET);

    // A TextOut a BOTTOM-LEFT saroktól mér pontokban, a Y felfelé növekszik
    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.

A HotPDF Delphi komponens által Delphi-ben készített többnyelvű Hello World PDF

Ez a teljes példa. A try/finally ... Free párossal ellátott THotPDF.Create(nil) a szokásos Delphi tulajdonosi (ownership) minta, és a PDF ezen nem változtat. Ami figyelmet érdemel, az a belső négy lépésből álló gerinc: tulajdonságok beállítása, BeginDoc, rajzolás, EndDoc. A sorrend nem felcserélhető

Dokumentumtulajdonságok beállítása a BeginDoc előtt

A BeginDoc az a pillanat, amikor a HotPDF rögzíti a dokumentum szerkezetét, így bármit, ami a teljes fájlt érinti, ezelőtt kell beállítani. A Compression := cmFlateDecode bekapcsolja a FlateDecode tömörítést a tartalomfolyamoknál (content streams), ami a különbséget jelenti egy kompakt és egy feleslegesen felfújt fájl között. A FontEmbedding := True bepakolja a fájlba azt a betűtípust, amellyel rajzol, így ugyanúgy fog kinézni egy olyan gépen, amelyre soha nem telepítették az Arial Unicode MS-t, mint az Önén. Ha bármelyiket a BeginDoc után rendeli hozzá, az csendben semmit sem tesz a már folyamatban lévő dokumentummal, és hiba sem figyelmezteti Önt

SetFont, majd TextOut, és figyeljen az origóra

Két dolog a rajzolási hívásokkal kapcsolatban mindenkit meglep az első oldalán. Az első a sorrend: a SetFont-nak le kell futnia minden olyan TextOut előtt, amely függ tőle, és meg kell ismételni minden AddPage után, mert az aktuális betűtípus nem éli túl az oldaltörést (page break). A második a koordináta-rendszer. A TextOut az oldal bal alsó sarkától mér, nem a bal felsőtől, az Y pedig felfelé haladva növekszik, pontokban (1/72 hüvelyk). Ezért haladnak itt a sorok lefelé 760-tól, mindegyik 30 ponttal az előző alatt. Bárki, aki a képernyőgrafika felől érkezik, az ellenkezőjét feltételezi, és az első sort egyenesen az alsó peremen (bottom edge) kívülre írja

Egy betűtípus, sok írásmód

Az ok, amiért egyetlen SetFont hordozni tud latint, cirillt, japánt és kínait ugyanazon az oldalon, maga a betűkészlet: az Arial Unicode MS szinte minden írásmód (script) glifáit (glyphs) egyetlen fájlba csomagolja. A SetFont negyedik argumentuma a Windows karakterkészlet, és a DEFAULT_CHARSET átadása lehetővé teszi, hogy a rendszer karakterlánconként (string) válasszon glifákat, ahelyett, hogy mindent egy régi kódlaphoz (code page) rögzítene. Két kikötés jár ezzel a kényelemmel. A betűtípusnak jelen kell lennie a PDF-et készítő gépen, mert a HotPDF azt ágyazza be, amire az operációs rendszer a nevet feloldja; ha az Arial Unicode MS hiányzik, a Windows csendben beletesz egy helyettesítőt, és a CJK szövege üres dobozokként jelenhet meg. És nem fed le egyenlően minden írásmódot: az olyan jobbról balra (right-to-left) tartó írásokhoz, mint az arab és a héber, vagy bármihez, ami komplex alakítást (shaping) igényel, egy dedikált, a RegisterUnicodeTTF segítségével betöltött betűtípushoz és a jobbról balra tartó szöveghívásokhoz kell nyúlnia, ami egy külön téma

Futtassa le, és megkapja a HelloWorld.pdf-et a munkakönyvtárban: egyetlen oldal, néhány sor többnyelvű szöveg, tömörítve, beágyazott betűtípussal. A kézenfekvő következő lépések a szöveg méretének, stílusának és forgatásának beállítása, valamint egynél több blokkjának szándékos elhelyezése, amelyeket a TextOut példa mind végigvesz. Ha szöveg helyett vonalakat (rules), dobozokat és képeket szeretne rajzolni, ugyanaz az oldalobjektum tartalmazza ezeket a hívásokat is

A TextOut, a SetFont és az itt bemutatott dokumentumhívások a HotPDF Delphi Component részét képezik Delphi-hez és C++Builder-hez