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:

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.

Flerspråklig Hello World PDF produsert av HotPDF-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 Component for Delphi og C++Builder