Tekninen artikkeli

Delphin HotPDF Hello World: ensimmäinen PDF-ohjelma

Jokaisessa PDF-kirjastossa on "hello world" -esimerkki, mutta HotPDFin pienin toimiva ohjelma tekee jo kaksi valintaa, jotka toistuvat kaikissa myöhemmissä asiakirjoissa: käytettävä fontti ja tekstin sijainti sivulla. Kun nämä ovat oikein, muu API laajentaa samaa mallia. Alla oleva täydellinen konsoliohjelma luo yhden sivun ja tervehtii lukijaa lähes tusinalla kielellä:

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.

Delphissä olevan HotPDF-komponentin tuottama monikielinen Hello World PDF -asiakirja

Siinä on koko esimerkki. THotPDF.Create(nil) yhdistettynä rakenteeseen try/finally ... Free on tavallinen Delphin omistajamalli, eikä PDF muuta sitä. Huomiota ansaitsee sen sisällä oleva nelivaiheinen runko: aseta ominaisuudet, BeginDoc, piirrä, EndDoc. Järjestystä ei voi vaihtaa keskenään

Asiakirjan ominaisuuksien asettaminen ennen BeginDoc-kutsua

BeginDoc on hetki, jolloin HotPDF sitoo asiakirjan rakenteen, joten kaikki, mikä vaikuttaa koko tiedostoon, on asetettava sitä ennen. Compression := cmFlateDecode ottaa käyttöön FlateDecode-pakkauksen sisältövirroille, mikä on ero kompaktin ja tarpeettoman paisuneen tiedoston välillä. FontEmbedding := True pakkaa piirtämiseen käyttämäsi fontin tiedostoon, joten se näyttää samalta koneella, johon ei ole koskaan asennettu Arial Unicode MS:ää, kuin omallasi. Määritä jompikumpi BeginDoc-kutsun jälkeen, niin se ei hiljaisesti tee mitään jo käynnissä olevalle asiakirjalle, eikä virhe varoita sinua

SetFont, sitten TextOut, ja tarkkaile origoa

Kaksi asiaa piirtokutsuissa yllättää kaikki heidän ensimmäisellä sivullaan. Ensimmäinen on järjestys: SetFont on suoritettava ennen mitään TextOut-kutsua, joka riippuu siitä, ja se on toistettava jokaisen AddPage-kutsun jälkeen, koska nykyinen fontti ei säily sivunvaihdon yli. Toinen on koordinaatisto. TextOut mittaa sivun vasemmasta alakulmasta, ei vasemmasta yläkulmasta, jolloin Y kasvaa ylöspäin siirryttäessä, pisteinä (1/72 tuumaa). Siksi tässä olevat rivit etenevät alaspäin 760:stä, kukin 30 pistettä edellisen alapuolella. Kuka tahansa ruutugrafiikasta saapuva olettaa päinvastaista ja kirjoittaa ensimmäisen rivin suoraan ulos alareunasta

Yksi fontti, monta kirjoitusjärjestelmää

Syy siihen, miksi yksittäinen SetFont voi kantaa latinalaista, kyrillistä, japanilaista ja kiinalaista tekstiä samalla sivulla, on itse kirjasin (face): Arial Unicode MS niputtaa lähes jokaisen kirjoitusjärjestelmän glyyfit yhteen tiedostoon. Neljäs argumentti menetelmälle SetFont on Windowsin merkistö (character set), ja arvon DEFAULT_CHARSET välittäminen antaa järjestelmän valita glyyfit merkkijonoa kohden sen sijaan, että kaikki kiinnitettäisiin yhteen vanhaan koodisivuun (code page). Tämän mukavuuden mukana tulee kaksi varoitusta. Fontin on oltava koneella, joka rakentaa PDF:n, koska HotPDF upottaa sen, mihin käyttöjärjestelmä ratkaisee nimen; jos Arial Unicode MS puuttuu, Windows vaihtaa hiljaisesti tilalle korvaavan fontin ja CJK-tekstisi (kiina, japani, korea) voi tulla ulos tyhjinä laatikkoina. Eikä se kata jokaista kirjoitusjärjestelmää yhtä lailla: oikealta vasemmalle kirjoitettavaan tekstiin, kuten arabiaan ja hepreaan, tai mihin tahansa, joka tarvitsee monimutkaista muotoilua (complex shaping), otat käyttöön erillisen fontin, joka on ladattu kutsulla RegisterUnicodeTTF, sekä oikealta vasemmalle -tekstikutsut, mikä on aivan oma aiheensa

Suorita se ja saat tiedoston HelloWorld.pdf työhakemistoon: yksi sivu, muutama rivi monikielistä tekstiä, pakattuna ja fontti upotettuna. Ilmeiset seuraavat vaiheet ovat antaa tekstille koko, tyyli ja kääntö sekä sijoittaa useampi kuin yksi sen lohko harkitusti, jotka molemmat käsitellään TextOut-esimerkissä. Kun haluat piirtää viivoja (rules), laatikoita ja kuvia pelkän tekstin sijaan, samassa sivuobjektissa on myös ne kutsut

Tässä näytetyt TextOut-, SetFont- ja asiakirjakutsut ovat osa HotPDF-komponenttia Delphille ja C++Builderille