Teknisk artikkel

Delphi HotPDF Hello World: Ditt første PDF-program

Hvert PDF-bibliotek leveres med et "hello world", og HotPDF sitt er verdt å stoppe opp ved, fordi det minste programmet som gjør noe som helst, allerede tvinger frem to beslutninger du vil gjenta i hvert dokument etterpå: hvilken skrifttype du skal sette, og hvor på siden teksten lander. Gjør du disse to riktig, er resten av API-et variasjoner over et tema. Her er hele greia, et konsollprogram som skriver en enkelt side som hilser leseren på nesten et dusin språk:

Diagram over den firekalls HotPDF Hello World-programflyten i Delphi med PDF-origo nede til venstre og to stille fallgruver uthevet
Opprett, begynn, tegn, avslutt er hele ryggraden, og origo nede til venstre forklarer hvorfor senere linjer bruker mindre Y-verdier
program HelloWorld;

{$APPTYPE CONSOLE}

uses
  Winapi.Windows,   // for DEFAULT_CHARSET; bruk vanlig Windows på Delphi før XE2
  HPDFDoc;          // HotPDF-hovedmodul

procedure CreateHelloWorld(const FileName: string);
var
  Pdf: THotPDF;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := FileName;
    Pdf.Compression := cmFlateDecode;   // krymp innholdsstrømmene
    Pdf.FontEmbedding := True;          // bygg inn skrifttypen så den gjengis overalt
    Pdf.BeginDoc;

    // Én skrifttype som dekker mange skriftsystemer. Det fjerde argumentet er Windows-tegnsettet
    // DEFAULT_CHARSET lar systemet velge glyfer per streng
    Pdf.CurrentPage.SetFont('Arial Unicode MS', [], 14, DEFAULT_CHARSET);

    // TextOut måler fra NEDRE VENSTRE-hjørnet, i punkter, med Y som øker oppover
    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.

Flerspråklig Hello World PDF produsert av HotPDF-Delphi-komponenten i Delphi

Det er hele eksemplet. THotPDF.Create(nil) parret med try/finally ... Free er det vanlige eierskapsmønsteret i Delphi, og PDF endrer ikke på dette. Det som fortjener oppmerksomhet, er den fire-trinns ryggraden på innsiden: angi egenskaper, BeginDoc, tegn, EndDoc. Rekkefølgen kan ikke byttes om

Angi dokumentegenskaper før BeginDoc

BeginDoc er øyeblikket HotPDF forplikter seg til dokumentets struktur, så alt som påvirker hele filen må settes før det. Compression := cmFlateDecode slår på FlateDecode for innholdsstrømmene, noe som er forskjellen på en kompakt fil og en unødvendig oppblåst en. FontEmbedding := True pakker skrifttypen du tegner med inn i filen, slik at den ser lik ut på en maskin som aldri har hatt Arial Unicode MS installert som den gjør på din. Tildeler du noen av dem etter BeginDoc, gjør den stille ingenting med dokumentet som allerede er i gang, uten noen feilmelding for å advare deg

SetFont, deretter TextOut, og pass på origo

To ting med tegnekallene fanger alle på deres første side. Det første er rekkefølgen: SetFont må kjøres før noe TextOut som avhenger av det, og det må gjentas etter hver AddPage, fordi den gjeldende skrifttypen ikke overlever et sideskift. Det andre er koordinatsystemet. TextOut måler fra nederste venstre hjørne av siden, ikke øverste venstre, hvor Y øker når du beveger deg oppover, i punkter (1/72 tomme). Det er grunnen til at linjene her marsjerer nedover fra 760, hver og en 30 punkter under den forrige. Alle som kommer fra skjermgrafikk antar det motsatte, og skriver den første linjen rett ut av den nederste kanten

Én skrifttype, mange skriftspråk

Grunnen til at én enkelt SetFont kan bære latin, kyrillisk, japansk og kinesisk på samme side er selve skriftsnittet: Arial Unicode MS samler glyffer for nesten hvert skriftspråk i én fil. Det fjerde argumentet til SetFont er Windows-tegnsettet, og å sende DEFAULT_CHARSET lar systemet velge glyffer per streng i stedet for å låse alt til en foreldet kodeside. To forbehold følger med denne bekvemmeligheten. Skrifttypen må være til stede på maskinen som bygger PDF-en, fordi HotPDF bygger inn det operativsystemet løser navnet til; hvis Arial Unicode MS mangler, bytter Windows den stille ut med en erstatning, og din CJK-tekst kan ende opp som tomme bokser. Og den dekker ikke hvert skriftspråk like godt: for skriving fra høyre til venstre, som arabisk og hebraisk, eller noe som krever kompleks forming, velger du en dedikert skrifttype lastet med RegisterUnicodeTTF og tekstkallene for høyre-til-venstre, noe som er et tema for seg selv

Kjør det, og du får HelloWorld.pdf i arbeidskatalogen: én side, noen få linjer med flerspråklig tekst, komprimert, med skrifttypen innebygd. De åpenbare neste trinnene er å gi den teksten størrelse, stil og rotasjon, og å plassere mer enn én blokk av den bevisst, noe begge deler gås gjennom i TextOut-eksemplet. Når du vil tegne streker, bokser og bilder i stedet for bare tekst, inneholder det samme sideobjektet disse kallene også

TextOut-, SetFont- og dokumentkallene som vises her, er en del av HotPDF Delphi Component for Delphi og C++Builder