HotPDF natisne naložen PDF na fizični tiskalnik, v kateri koli kontekst naprave Windows ali na odložišče prek treh klicev: PrintLoadedDocument upravlja VCL-jev TPrinter, RenderLoadedPageToDC naslika stran neposredno v kateri koli HDC, RenderLoadedPageToClipboard pa kopira stran kot bitno sliko ali vektorsko datoteko meta. HotPDF je domača komponenta VCL PDF za Delphi in C++Builder in je to prvorazredno pot tiskanja dodala v različici v2.331.0 ter jo izboljšala v v2.348.0, tako da vam ni več treba ročno pisati zanke TPrinter okoli upodabljalnika bitnih slik. Vsi trije klici rišejo vektorsko vsebino strani neposredno tam, kjer je to pomembno, tako da natisnjen dokument ostane tako oster, kot ga tiskalnik lahko izriše
Zakaj risati stran PDF neposredno v tiskalnik namesto bitne slike?
Stran PDF je program vektorskih risalnih operatorjev — poti, besedila in slik, izvedenih glede na grafični model ISO 32000-1 —, in ne mreža slikovnih pik. Očiten način za tiskanje takšne strani je, da jo rastrirate v bitno sliko in to sliko prenesete na tiskalno platno, kar deluje, vendar zavrže edino stvar, v kateri je tiskalnik dober. Sodoben laserski tiskalnik loči 600 or 1200 DPI; bitna slika, rastrirana pri 150 ali 300 DPI in nato raztegnjena, da ustreza, pride mehka, z nazobčanimi robovi besedila in vidno interpolacijo. RenderLoadedPageToDC izbere boljšo pot: ponovno izvede tok vsebine strani kot klice GDI, oddane neposredno v ciljni kontekst naprave, tako da vektorsko besedilo in črtna umetnost dosežejo tiskalnik kot vektorji in se rastrirata le enkrat, s strani tiskalnika, pri njegovi lastni ločljivosti
Kako natisniti naložen PDF na fizični tiskalnik v Delphi?
HotPDF natisne naložen dokument s PrintLoadedDocument(Printer, Options), ki vzame dodeljen VCL TPrinter in zapis THPDFPrintOptions, natisne izbrane strani in vrne število poslanih strani. Najprej nastavite Printer.PrinterIndex, da izberete napravo, izpolnite zapis možnosti — funkcija razreda THPDFPrintOptions.Default vam da razumne vrednosti — in jo enkrat pokličete. Knjižnica odpre posel s Printer.BeginDoc, prehodi obseg strani in med njimi odda Printer.NewPage ter ga zapre s Printer.EndDoc, tako da vam nikoli ni treba ročno upravljati življenjskega cikla tiskalnega posla
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;
Niz PageRange je 1-indeksiran in se bere tako kot pogovorno okno za tiskanje: '1,3-5' natisne stran 1 in strani od 3 do 5, prazen niz pa natisne celoten dokument. Copies se neposredno preslika v Printer.Copies. Bodite pa pošteni do sebe glede Collate: ker VCL razkriva zlaganje nedosledno med različicami Delphi, HotPDF nastavi število kopij in zlaganje prepusti privzeti nastavitvi gonilnika tiskalnika, tako da ko potrebujete zajamčen vrstni red zlaganja, ga nastavite na gonilniku prek TPrinterSetupDialog, namesto da bi zaupali zastavici, da ga bo prenesla
Kako ločljivost DPI in FitPage določata merilo tiskanja?
Pri FitPage na True — kar je privzeto — HotPDF prebere MediaBox vsake strani, jo skalira na Printer.PageWidth in Printer.PageHeight ob ohranitvi razmerja stranic ter jo izriše v merilu, ki omogoča, da stran zapolni papir. V tem načinu se Options.DPI dejansko preglasi z ustreznim merilom prilagajanja, saj se mora izhod ujemati s fizičnimi dimenzijami strani tiskalnika. Pri FitPage na False HotPDF izriše vsako stran 1:1 pri natanko Options.DPI, pri čemer preslika 72 enot PDF v DPI slikovnih pik naprave, wat je tisto, kar želite, ko sta izvorna stran in papir že enake velikosti in vam je pomembna natančna ločljivost. Posezite po FitPage, ko se velikost izvorne strani in velikost pladnja razlikujeta; posezite po 1:1, ko se ujemata in želite deterministično skaliranje
Dve možnosti, dodani v v2.348.0, popravljata natise, ki so videti skoraj pravilno. Vsak fizični tiskalnik ima trd rob — nenatisljiv rob, ki ga strojna oprema ne more doseči — in privzeto izhodišče strani pristane znotraj njega, zato stran s polnim tiskom izgubi trak z dveh robov. Nastavite IgnoreHardMargin na True in HotPDF poizve o tiskalnikovih PHYSICALOFFSETX in PHYSICALOFFSETY ter nato premakne izhodišče naprave, da prekliče ta odmik, tako da se izhodišče strani preslika v pravi kot papirja. Druga možnost, AutoRotate, je privzeto vklopljena: prebere MediaBox vsake strani in, ko je stran širša kot je visoka, preklopi tiskalnik v ležečo usmerjenost, tako da se široka stran natisne neobrezana, namesto da bi bila obrezana v pokončno usmerjenost. AutoRotate se umakne v trenutku, ko eksplicitno nastavite Orientation, tako da namerna izbira usmerjenosti vedno zmaga
Kako upodobiti stran PDF v kateri koli kontekst naprave?
RenderLoadedPageToDC(PageIndex, DC, DPI, W, H) je primitiv pod tiskalno zanko in je uporaben sam po sebi. PrintLoadedDocument ga pokliče enkrat na stran proti tiskalnemu platnu, toda cilj je lahko kateri koli Windows HDC: pomnilniški DC izven zaslona, platno kontrolnika v pregledovalniku po meri ali površina za predogled tiskanja. PageIndex je 0-indeksiran, W in H sta enoti naprave ciljne površine, upodabljalnik pa prehodi /Contents strani in odda klic GDI v vaš DC. Ena namerna lastnost je vredna vedenja: ne riše nobenega polnila ozadja. Klicatelj ima v lasti površino, tako da če želite bel papir za stranjo, sami napolnite DC pred upodabljanjem, kar je natanko tisto, kar vam omogoča sestavo strani čez obstoječe platno, ko to želite
// 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;
Ko potrebujete le končan TBitmap — sličico, izvoz slike, predogled, ki ga boste predpomnili —, raje posezite po RenderLoadedPageToBitmap, ki je zajet v spremnem članku o upodabljanju strani PDF v bitno sliko. Razlika je v tem, kdo ima v lasti površino: klic bitne slike dodeli in vrne medpomnilnik slikovnih pik, medtem ko RenderLoadedPageToDC riše v kontekst naprave, ki ga že imate, kar je natanko tisto, kar vam predajo tiskalno platno ali klicatelji slikanja. Oba si delita isti tolmač toka vsebine in motor vgrajenih glifov, tako da besedilo v obeh primerih pride z natančnimi vgrajenimi obrisi
Kako prilepiti stran PDF v Word ali urejevalnik slik?
RenderLoadedPageToClipboard(PageIndex, DPI, AsMetafile) postavi eno stran na odložišče Windows, pripravljeno za lepljenje v Word, PowerPoint, e-pošto ali urejevalnik slik. Zastavica AsMetafile izbere format, in ta izbira je pomembnejša, kot je videti. Če prenesete False, HotPDF postavi 24-bitno bitno sliko naprave (CF_BITMAP), upodobljeno pri vaši ločljivosti DPI — fiksno mrežo slikovnih pik, ki jo je mogoče prilepiti kamor koli, vendar postane pikselizirana, ko jo prejemnik poveča. Če prenesete True, postavi izboljšano datoteko meta (CF_ENHMETAFILE), v kateri besedilo in vektorska umetnost strani potujeta kot risalni ukazi GDI, so prilepljen rezultat ostane oster pri katerem koli zoomu in se prilagaja kateri koli velikosti, ki jo ciljni dokument ponuja
Pravilo palca je preprosto. Če bo človek stran prilepil v dokument in jo morda spremenil po velikosti — slika v poročilu, člen, spuščen v osnutek pogodbe —, uporabite datoteko meta, saj se vektorsko besedilo tiska in povečuje čisto. Če cilj razume le rastrske podatke ali če posebej želite zamrznjen posnetek pri znani ločljivosti, uporabite bitno sliko. Za vlečenje besed iz strani namesto njihove slike pa gre za povsem drugo delo, ki ga opravlja API za ekstrakcijo besedila, ki vrne znake in njihove položaje namesto upodobljene slike
Kje se tiskalna pot ustavi
Vse na tej strani je namenjeno le za Windows in to je vredno odkrito zapisati. PrintLoadedDocument, RenderLoadedPageToDC in RenderLoadedPageToClipboard so zgrajeni na TPrinter, modelu konteksta naprav GDI, odložišču Windows in izboljšanih datotekah meta — vsi so konstrukcije Win32 in Win64. Na drugih ciljih preostali del HotPDF še vedno ustvarja, ureja in bere PDF, vendar ta tiskalna in odložiščna površina s podlogo GDI ni na voljo. Upodabljalnik cilja tudi na običajno podmnožico dokumentov z besedilom, potmi in slikami, tako da se modeli z močnimi prelivi in barve pod upravljanjem ICC natisnejo kot zvest predogled in ne kot kolorimetrični dokaz, kar je enaka meja, kot jo ima upodabljalnik bitnih slik
Za paketno tiskanje čez veliko datotek nalagajte in tiskajte vsak dokument po vrsti ter spremljajte porabo pomnilnika: PrintLoadedDocument upodablja eno stran naenkrat, vendar graf naloženega dokumenta sam živi v pomnilniku celoten čas dela. Ko upravljate tiskalno vrsto čez stotine velikih datotek, se pretočni Direct File API za poteke dela z velikimi PDF-ji dobro ujema s tiskalno potjo — najprej na disku razdelite, združite ali izberite strani, ki jih potrebujete, nato pa naložite le vitek rezultat za tiskanje. Tako se PrintLoadedDocument, RenderLoadedPageToDC in RenderLoadedPageToClipboard dobavljajo kot del komponente HotPDF Component za Delphi in C++Builder — domače knjižnice VCL brez zunanjih odvisnosti DLL, ki pokriva ustvarjanje PDF-jev, urejanje, ekstrakcijo besedila, upodabljanje in zdaj tiskanje neposredno v TPrinter, kateri koli kontekst naprave ali odložišče