HotPDF skriver ut en innlastet PDF til en fysisk skriver, hvilken som helst Windows-enhetskontekst (device context), eller til utklippstavlen via tre kall: PrintLoadedDocument styrer en VCL TPrinter, RenderLoadedPageToDC tegner en side direkte inn i hvilken som helst HDC, og RenderLoadedPageToClipboard kopierer en side som et punktgrafikkbilde (bitmap) eller en vektor-metafil. HotPDF er en innfødt VCL PDF-komponent for Delphi og C++Builder, og den la til denne førsteklasses utskriftsbanen i v2.331.0, og forbedret den i v2.348.0, slik at du ikke lenger trenger å skrive en TPrinter-løkke rundt en punktgrafikk-rendrer manuelt selv. Alle tre kallene tegner sidens vektorinnhold direkte der det teller, slik at en utskrift forblir så skarp som skriveren kan rendre den
Hvorfor tegne en PDF-side direkte til skriveren i stedet for et punktgrafikkbilde?
En PDF-side er et program av vektortegneoperatorer — stier, tekst og bilder utført mot ISO 32000-1-grafikkmodellen — ikke et rutenett av piksler. Den åpenbare måten å skrive ut en side på er å rasterisere siden til et punktgrafikkbilde og kopiere (blit) dette punktgrafikkbildet over på skriverens lerret (canvas), og det fungerer, men det kaster bort den ene tingen en skriver er god på. En moderne laserskriver har en oppløsning på 600 eller 1200 DPI; a punktgrafikkbilde som er rasterisert ved 150 or 300 DPI og deretter strukket for å passe, blir uskarpt, med taggete tekstkanter og synlig interpolering. RenderLoadedPageToDC tar den bedre veien: den spiller av sidens innholdsstrøm som GDI-kall sendt direkte inn i målenhetens kontekst, slik at vektortekst og strekkunst når skriveren som vektorer og rasteriseres én gang av skriveren, ved skriverens egen oppløsning
Hvordan skriver du ut en innlastet PDF til en fysisk skriver i Delphi?
HotPDF skriver ut et innlastet dokument med PrintLoadedDocument(Printer, Options), som tar en tildelt VCL TPrinter og en THPDFPrintOptions-post (record), skriver ut de valgte sidene, og returnerer antallet sider som ble sendt. Sett Printer.PrinterIndex først slik at en enhet er valgt, fyll ut en alternativpost (options record) — klassefunksjonen THPDFPrintOptions.Default gir deg fornuftige verdier — og kall den én gang. Biblioteket åpner jobben med Printer.BeginDoc, går gjennom sideområdet og sender en Printer.NewPage mellom sidene, og lukker den med Printer.EndDoc, slik at du aldrig trenger å administrere utskriftsjobbens livssyklus manuelt
uses Printers;
var
Pdf: THotPDF;
Opts: THPDFPrintOptions;
begin
Pdf := THotPDF.Create(nil);
try
if Pdf.LoadFromFile('invoice.pdf') > 0 then
begin
Printer.PrinterIndex := -1; // -1 selects the default printer
Opts := THPDFPrintOptions.Default; // all pages, 300 DPI, FitPage, colour
Opts.PageRange := '1,3-5'; // one-based; empty prints every page
Opts.Copies := 2;
Pdf.PrintLoadedDocument(Printer, Opts);
end;
finally
Pdf.Free;
end;
end;
Hvordan bestemmer DPI og FitPage utskriftsskaleringen?
FitPage og DPI samhandler på en måte som er verdt å forstå før du distribuerer programvaren. Med FitPage satt til True — som er standard — leser HotPDF hver sides MediaBox, skalerer den til Printer.PageWidth og Printer.PageHeight mens sideforholdet bevares, og rendrer ved den skalaen som gjør at siden fyller papiret. I denne modusen blir Options.DPI i praksis overstyrt av tilpasningsskalaen, fordi utdataene må samsvare med skriverens fysiske sidedimensjoner. Med FitPage satt til False, rendrer HotPDF hver side 1:1 at nøyaktig Options.DPI, og kartlegger 72 PDF-enheter til DPI-enhetspiksler, noe som er det du ønsker når kildesiden og papiret allerede har samme størrelse og du bryr deg om en nøyaktig oppløsning. Bruk FitPage når kildesidestørrelsen og skuffstørrelsen er forskjellige; bruk 1:1 når de samsvarer og du ønsker deterministisk skalering
Alternativer lagt til i v2.348.0 løser utskriftene som ser nesten riktige ut. Hver fysiske skriver har en hard marg — en ikke-utskrivbar kant maskinvaren ikke kan nå — og som standard havner sideorigo innenfor den, slik at en side som går helt ut til kanten (full-bleed) mister en stripe på to av sidene. Sett IgnoreHardMargin til True og HotPDF forespør skriverens PHYSICALOFFSETX og PHYSICALOFFSETY, og forskyver deretter enhetsorigo for å oppheve denne forskyvningen slik at sideorigo kartlegges til det sanne papirhjørnet. Det andre alternativet, AutoRotate, er på som standard: det leser hver sides MediaBox, og når en side er bredere enn den er høy, snur den skriveren til liggende retning (landscape) slik at en bred side skrives ut uten avklipping i stedet for å bli beskåret til stående retning (portrait). AutoRotate viker til side i det øyeblikket du setter Orientation eksplisitt, så et bevisst retningsvalg vinner alltid
Hvordan rendrer du en PDF side inn i hvilken som helst enhetskontekst?
RenderLoadedPageToDC(PageIndex, DC, DPI, W, H) er primitiven under utskriftsløkken, og den er nyttig i seg selv. PrintLoadedDocument kaller den én gang per side mot skriverens lerret (canvas), men målet kan være en hvilken som helst Windows-HDC: en minne-DC utenfor skjermen, et kontrollelements lerret i en egendefinert visningsprogramvare, eller en forhåndsvisningsflate for utskrift. PageIndex er nullbasert, W og H er enhetsenhetene til målflaten, og rendreren går gjennom sidens /Contents og sender GDI-kall inn i din DC. Én bevisst oppførsel er verdt å kjenne til: den tegner ingen bakgrunnsfyll. Oppkalleren eier overflaten, så hvis du vil ha hvitt papir bak siden, fyller du DC-en selv før rendring, noe som er akkurat det som lar deg sette sammen en side over et eksisterende lerret når du ønsker det
// Draw page 1 into an off-screen 24-bit surface at 150 DPI
var
Surface: TBitmap;
begin
Surface := TBitmap.Create;
try
Surface.PixelFormat := pf24bit;
Surface.SetSize(1275, 1650); // 8.5 x 11 in at 150 DPI
Surface.Canvas.Brush.Color := clWhite;
Surface.Canvas.FillRect(Surface.Canvas.ClipRect); // caller paints the background
Pdf.RenderLoadedPageToDC(0, Surface.Canvas.Handle, 150, Surface.Width, Surface.Height);
// Surface now holds the composited page, ready to blit or save
finally
Surface.Free;
end;
end;
Hvordan limer du en PDF-side inn i Word eller et bilderedigeringsprogram?
RenderLoadedPageToClipboard(PageIndex, DPI, AsMetafile) plasserer én side på Windows-utklippstavlen, klar til å limes inn i Word, PowerPoint, en e-post eller et bilderedigeringsprogram. AsMetafile-flagget velger formatet, og valget betyr mer enn det ser ut til. Send inn False, og HotPDF plasserer et 24-biters enhetspunktgrafikkbilde (CF_BITMAP) rendret ved din DPI — et fast rutenett av piksler som kan limes inn hvor som helst, men som blir pikselert når mottakeren skalerer det opp. Send inn True, og den plasserer en forbedret metafil (CF_ENHMETAFILE) der sidens tekst og vektorkunst overføres som GDI-tegnekommandoer, slik at det limte resultatet forblir skarpt ved enhver zoom og tilpasser seg størrelsen som måldokumentet gir det
Hvor utskriftsbanen stopper
Alt på denne siden er kun for Windows, og det er verdt å si tydelig. PrintLoadedDocument, RenderLoadedPageToDC og RenderLoadedPageToClipboard er bygget på TPrinter, GDI-enhetskontekstmodellen, Windows-utklippstavlen og forbedrede metafiler — alle Win32- og Win64-konstruksjoner. På andre plattformer vil resten av HotPDF fremdeles opprette, redigere og lese PDF, men denne GDI-støttede utskrifts- og utklippsoverflaten er ikke tilgjengelig. Rendreren retter seg også mot den vanlige dokumentdelmengden av tekst, stier og bilder, so gradienttunge designutkast og ICC-administrerte farger skrives ut som en trofast forhåndsvisning snarere enn et fargenøyaktig prøvetrykk, den samme grensen som punktgrafikk-rendreren har
For bunkeutskrift (batch printing) over mange filer, last inn og skriv ut hvert dokument etter tur, og hold øye med minnebruken: PrintLoadedDocument rendrer én side om gangen, men selve den innlastede dokumentgrafen forblir i minnet under hele jobben. Når du driver en utskriftskø over hundrevis av store filer, fungerer det strømmende Direct File API for store PDF-arbeidsflyter godt sammen med utskriftsbanen — del, slå sammen, eller velg sidene du trenger på disken først, og last deretter kun inn det slankede resultatet for utskrift. Det er slik PrintLoadedDocument, RenderLoadedPageToDC og RenderLoadedPageToClipboard leveres som en del av HotPDF Component for Delphi og C++Builder — et innfødt VCL-bibliotek uten eksterne DLL-avhengigheter som dekker PDF-oppretting, redigering, tekstuttrekk, rendring, og nå utskrift direkte til TPrinter, hvilken som helst enhetskontekst, eller utklippstavlen