HotPDF štampa učitani PDF na fizički štampač, bilo koji Windows kontekst uređaja (device context) ili privremenu memoriju (clipboard) kroz tri poziva: PrintLoadedDocument upravlja VCL komponentom TPrinter, RenderLoadedPageToDC iscrtava stranicu direktno u bilo koji HDC, a RenderLoadedPageToClipboard kopira stranicu kao bitmapu ili vektorsku metadatoteku (metafile). HotPDF je izvorna VCL PDF komponenta za Delphi i C++Builder, i dodala je ovaj prvoklasni put štampanja u verziji v2.331.0, poboljšavajući ga u verziji v2.348.0, tako da više ne morate ručno da pišete petlju TPrinter oko bitmap renderera. Sva tri poziva crtaju vektorski sadržaj stranice direktno tamo gde je važno, tako da štampani materijal ostaje oštar onoliko koliko štampač može da ga renderuje
Zašto crtati PDF stranicu direktno na štampač umesto na bitmapu?
PDF stranica je program vektorskih operatora za crtanje — putanja, teksta i slika koji se izvršavaju u odnosu na grafički model ISO 32000-1 — a ne mreža piksela. Očigledan način da se ona odštampa jeste da se stranica rasterizuje u bitmapu i ta bitmapa prenese na platno (canvas) štampača. To radi, ali se time odbacuje jedina stvar u kojoj je štampač dobar. Moderan laserski štampač ima rezoluciju od 600 ili 1200 DPI. Bitmapa rasterizovana na 150 ili 300 DPI, a zatim rastegnuta da popuni stranicu, postaje mutna, sa iskrzanim ivicama teksta i vidljivom interpolacijom. Metoda RenderLoadedPageToDC ide boljim putem: ona ponavlja tok sadržaja stranice kao GDI pozive emitovane direktno u ciljni kontekst uređaja, tako da vektorski tekst i linijska grafika stižu do štampača kao vektori i bivaju rasterizovani samo jednom, od strane samog štampača, na njegovoj sopstvenoj rezoluciji
Kako odštampati učitani PDF na fizički štampač u Delphi-ju?
HotPDF štampa učitani dokument pomoću metode PrintLoadedDocument(Printer, Options), koja uzima dodeljeni VCL TPrinter i zapis THPDFPrintOptions, štampa izabrane stranice i vraća broj poslatih stranica. Prvo podesite Printer.PrinterIndex tako da se izabere uređaj, popunite zapis opcija — funkcija klase THPDFPrintOptions.Default daje vam razumne vrednosti — i pozovite je jednom. Biblioteka otvara posao pomoću Printer.BeginDoc, prolazi kroz opseg stranica emitujući Printer.NewPage između njih, i zatvara posao pomoću Printer.EndDoc, tako da nikada ne morate ručno da upravljate životnim ciklusom posla štampanja
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;
String PageRange je u bazi od 1 i čita se na način na koji to radi dijalog za štampanje: '1,3-5' štampa stranicu 1 i stranice od 3 do 5, a prazan string štampa ceo dokument. Svojstvo Copies se mapira direktno u Printer.Copies. Ipak, budite iskreni prema sebi kada je u pitanju Collate (slaganje): pošto VCL prikazuje slaganje nekonzistentno kroz verzije Delphi-ja, HotPDF podešava broj kopija i prepušta slaganje podrazumevanim podešavanjima drajvera štampača, pa kada vam je potreban zagarantovan redosled slaganja, podesite ga na drajveru preko TPrinterSetupDialog umesto da se oslanjate na to da će zastavica to odraditi sama
Kako DPI i FitPage određuju razmeru štampe?
Opcije FitPage i DPI međusobno deluju na način koji vredi razumeti pre isporuke softvera. Sa FitPage podešenim na True — što je podrazumevano — HotPDF čita MediaBox svake stranice, skalira ga na Printer.PageWidth i Printer.PageHeight čuvajući razmeru (aspect ratio) i renderuje u razmeri koja čini da stranica popuni papir. U tom režimu, Options.DPI je efektivno pregažen razmerom uklapanja, jer izlaz mora da odgovara fizičkim dimenzijama stranice štampača. Sa FitPage podešenim na False, HotPDF renderuje svaku stranicu 1:1 na tačno Options.DPI, mapirajući 72 PDF jedinice u DPI piksele uređaja, što je ono što želite kada su izvorna stranica i papir već iste veličine i stalo vam je do tačne rezolucije. Koristite FitPage kada se veličina izvorne stranice i veličina kasete za papir razlikuju. Opredelite se za 1:1 kada se one podudaraju i želite determinističko skaliranje
Dve opcije dodate u verziji v2.348.0 rešavaju problem sa otiscima koji izgledaju skoro dobro. Svaki fizički štampač ima čvrstu marginu (hard margin) — neštampajuću ivicu koju hardver ne može da dohvati — i po defaultu početak koordinata stranice pada unutar nje, pa stranica bez margina gubi traku sa dve ivice. Postavite IgnoreHardMargin na True i HotPDF će zatražiti od štampača vrednosti PHYSICALOFFSETX i PHYSICALOFFSETY, a zatim pomeriti koordinatni početak uređaja da poništi taj ofset, tako da se početak koordinata stranice mapira na stvarni ugao papira. Druga opcija, AutoRotate, podrazumevano je uključena: ona čita MediaBox svake stranice i, kada je stranica šira nego što je visoka, prebacuje štampač u landscape režim kako bi se široka stranica odštampala neisečena umesto da bude skraćena na uspravni (portrait) format. Opcija AutoRotate se povlači onog trenutka kada eksplicitno podesite Orientation, tako da nameran izbor orijentacije uvek ima prednost
Kako renderovati PDF stranicu u bilo koji kontekst uređaja?
Metoda RenderLoadedPageToDC(PageIndex, DC, DPI, W, H) je primitiv koji se nalazi ispod petlje štampanja, i koristan je sam po sebi. PrintLoadedDocument ga poziva jednom po stranici u odnosu na platno štampača, ali cilj može biti bilo koji Windows HDC: memorijski DC van ekrana, platno kontrole u prilagođenom pregledaču ili površina za pregled pre štampe. PageIndex koristi bazu 0, W i H su jedinice uređaja ciljne površine, a renderer prolazi kroz /Contents stranice i emituje GDI pozive u vaš DC. Vredi znati jedno namerno ponašanje: ne crta se nikakvo popunjavanje pozadine. Pozivalac je vlasnik površine, pa ako želite beli papir iza stranice, sami popunjavate DC pre renderovanja, što je upravo ono što vam omogućava da kombinujete stranicu preko postojećeg platna kada 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;
Kada vam je samo potrebna gotova TBitmap — sličica (thumbnail), izvoz slike ili pregled koji ćete keširati — umesto toga upotrebite RenderLoadedPageToBitmap, što je pokriveno u pratećem članku o renderovanju PDF stranica u bitmapu. Razlika je u tome ko je vlasnik površine: poziv bitmape alocira i vraća bafer piksela, dok RenderLoadedPageToDC crta u kontekstu uređaja koji već držite, što je upravo ono što vam platno štampača ili hendler za iscrtavanje predaju. Oba načina dele isti interpreter toka sadržaja i mehanizam za ugrađene glifove, tako da tekst u oba slučaja izlazi sa tačnim ugrađenim konturama
Kako kopirati PDF stranicu u Word ili uređivač slika?
Metoda RenderLoadedPageToClipboard(PageIndex, DPI, AsMetafile) postavlja jednu stranicu u Windows privremenu memoriju (clipboard), spremnu za lepljenje (paste) u Word, PowerPoint, e-poštu ili uređivač slika. Zastavica AsMetafile bira format, i taj izbor je važniji nego što na prvi pogled izgleda. Prosledite False i HotPDF će postaviti 24-bitnu bitmapu uređaja (CF_BITMAP) renderovanu na vašem DPI-ju — fiksnu mrežu piksela koja se lepi bilo gde, ali gubi na kvalitetu (pixelates) kada je primalac uveća. Prosledite True i on će postaviti poboljšani metafajl (CF_ENHMETAFILE) u kojem tekst i vektorska grafika stranice putuju kao GDI komande za crtanje, tako da nalepljeni rezultat ostaje oštar pri bilo kom zumiranju i prilagođava se veličini koju mu odredišni dokument dodeli
// Copy page 2 as a scalable vector metafile for pasting into Word
Pdf.RenderLoadedPageToClipboard(1, 300, True);
// Copy the same page as a fixed 300-DPI bitmap instead
Pdf.RenderLoadedPageToClipboard(1, 300, False);
Pravilo je jednostavno. Ako će čovek zalepiti stranicu u dokument i možda joj menjati veličinu — slika u izveštaju, klauzula ubačena u nacrt ugovora — koristite metafajl, jer se vektorski tekst štampa i zooms (zumira) čisto. Ako odredište razume samo rasterske podatke ili specifično želite zamrznut snimak na poznatoj rezoluciji, koristite bitmapu. Za izvlačenje reči iz stranice umesto slike o njima, to je sasvim drugačiji posao, kojim upravlja API za ekstrakciju teksta, koji vraća karaktere i njihove pozicije umesto renderovane slike
Gde se putanja štampanja zaustavlja
Sve na ovoj stranici je rezervisano samo za Windows, i to vredi jasno reći. Metode PrintLoadedDocument, RenderLoadedPageToDC i RenderLoadedPageToClipboard izgrađene su na TPrinter-u, GDI modelu konteksta uređaja, Windows clipboard-u i poboljšanim metafajlovima — što su sve Win32 i Win64 koncepti. Na drugim platformama ostatak HotPDF-a i dalje kreira, menja i čita PDF, ali ova GDI-podržana površina za štampu i clipboard nije dostupna. Izlazni renderer takođe cilja uobičajeni podskup dokumenata koji čine tekst, putanje i slike, tako da se dizajnerski dokazi sa mnogo gradijenata i ICC-upravljane boje štampaju kao verna vizuelna reprezentacija pre nego kao kolorimetrijski dokaz, što je ista granica koju nosi i bitmap renderer
Za grupno štampanje na velikom broju datoteka, učitavajte i štampajte svaki dokument redom i pratite potrošnju memorije: PrintLoadedDocument renderuje jednu po jednu stranicu, ali stablo samog učitanog dokumenta ostaje u memoriji tokom celog posla. Kada upravljate redom za štampanje preko stotina velikih datoteka, strimujući Direct File API za radne tokove sa velikim PDF-ovima dobro se slaže sa putanjom štampanja — prvo podelite, spojite ili izaberite stranice koje su vam potrebne na disku, a zatim učitajte samo taj manji rezultat za štampanje. Na taj način se PrintLoadedDocument, RenderLoadedPageToDC i RenderLoadedPageToClipboard isporučuju kao deo HotPDF komponente za Delphi i C++Builder — izvorne VCL biblioteke bez spoljnih DLL zavisnosti koja pokriva kreiranje, izmenu, ekstrakciju teksta, renderovanje PDF-a i sada štampanje direktno na TPrinter, bilo koji kontekst uređaja ili clipboard