HotPDF ispisuje učitani PDF na fizički pisač, bilo koji Windows kontekst uređaja ili u međuspremnik putem tri poziva: PrintLoadedDocument upravlja VCL-om TPrinter, RenderLoadedPageToDC iscrtava stranicu izravno u bilo koji HDC, a RenderLoadedPageToClipboard kopira stranicu kao bitmapu ili vektorsku metapodatkovnu datoteku (metafile). HotPDF je izvorna VCL PDF komponenta za Delphi i C++Builder, a ova prvorazredna putanja ispisa dodana je u v2.331.0 i poboljšana u v2.348.0, tako da više ne morate ručno povezivati petlju TPrinter oko bitmap iscrtavača. Sva tri poziva iscrtavaju vektorski sadržaj stranice izravno tamo gdje je to važno, pa ispis ostaje oštar onoliko koliko to pisač može prikazati
Zašto crtati PDF stranicu izravno u pisač umjesto u bitmapu?
PDF stranica je program vektorskih operatora crtanja — putanja, teksta i slika koje se izvode u skladu s ISO 32000-1 grafičkim modelom — a ne mreža piksela. Očit način za ispis je rasterizacija stranice u bitmapu i njezino crtanje na platno pisača, i to radi, ali odbacuje ono u čemu je pisač najbolji. Moderni laserski pisač razlučuje 600 or 1200 DPI; bitmapa rasterizirana na 150 ili 300 DPI koja se potom rastegne kako bi stala, ispada mutna, s nazubljenim rubovima teksta i vidljivom interpolacijom. RenderLoadedPageToDC koristi bolji put: reproducira tok sadržaja stranice kao GDI pozive upućene izravno u ciljni kontekst uređaja, pa vektorski tekst i linijski crteži stižu do pisača kao vektori i rasteriziraju se samo jednom, od strane pisača, u vlastitoj razlučivosti pisača
Kako ispisati učitani PDF na fizički pisač u Delphiju?
HotPDF ispisuje učitani dokument s PrintLoadedDocument(Printer, Options), koji prima dodijeljeni VCL TPrinter i zapis THPDFPrintOptions, ispisuje odabrane stranice i vraća broj poslanih stranica. Najprije postavite Printer.PrinterIndex kako biste odabrali uređaj, ispunite zapis opcija — funkcija klase THPDFPrintOptions.Default daje vam razumne vrijednosti — i pozovite je jednom. Knjižnica otvara posao s Printer.BeginDoc, prolazi kroz raspon stranica ispuštajući Printer.NewPage između njih i zatvara ga s Printer.EndDoc, tako da nikada ne morate ručno upravljati životnim ciklusom posla ispisa
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;
Kako DPI i FitPage određuju mjerilo ispisa?
Interakciju između FitPage i DPI opcija vrijedi razumjeti prije slanja na ispis. Kada je FitPage postavljen na True — što je zadano — HotPDF čita MediaBox svake stranice, skalira ga na Printer.PageWidth i Printer.PageHeight čuvajući omjer širine i visine te ga iscrtava u mjerilu koje omogućuje da stranica ispuni papir. U tom je načinu rada Options.DPI zapravo nadjačan mjerilom prilagodbe, jer izlaz mora odgovarati fizičkim dimenzijama stranice pisača. Kada je FitPage postavljen na False, HotPDF iscrtava svaku stranicu u omjeru 1:1 točno na Options.DPI, mapirajući 72 PDF jedinice na DPI piksele uređaja, što je ono što želite kada su izvorna stranica i papir već iste veličine i stalo vam je do točne razlučivosti. Posegnite za opcijom FitPage kada se veličina izvorne stranice i ladice razlikuju; odaberite 1:1 kada se podudaraju i želite determinističko skaliranje
Dvije opcije dodane u v2.348.0 popravljaju ispis koji izgleda gotovo ispravno. Svaki fizički pisač ima fiksnu marginu — neispisivi obrub koji hardver ne može dosegnuti — i prema zadanim postavkama ishodište stranice pada unutar njega, pa stranica bez margina (full-bleed) gubi traku s dva ruba. Postavite IgnoreHardMargin na True i HotPDF ispituje printerove PHYSICALOFFSETX i PHYSICALOFFSETY vrijednosti, a zatim pomiče ishodište uređaja kako bi poništio taj pomak, tako da se ishodište stranice mapira na stvarni kut papira. Druga opcija, AutoRotate, uključena je prema zadanim postavkama: čita MediaBox svake stranice i, kada je stranica šira nego što je visoka, okreće pisač u vodoravni položaj (landscape) kako bi se široka stranica ispisala neobrezana umjesto da bude odrezana u okomitom položaju (portrait). AutoRotate se povlači onog trenutka kada izričito postavite Orientation, pa namjerni odabir orijentacije uvijek pobjeđuje
Kako iscrtati PDF stranicu u bilo koji kontekst uređaja?
RenderLoadedPageToDC(PageIndex, DC, DPI, W, H) je primitivna funkcija ispod petlje ispisa i korisna je sama po sebi. PrintLoadedDocument je poziva jednom po stranici za platno pisača, ali cilj može biti bilo koji Windows HDC: izvanzaslonski memorijski DC, platno kontrole u prilagođenom pregledniku ili površina za pregled ispisa. PageIndex počinje od nule, W i H su jedinice uređaja ciljne površine, a iscrtavač prolazi kroz /Contents stranice i šalje GDI pozive u vaš DC. Vrijedi znati jedno namjerno ponašanje: ne crta ispunu pozadine. Pozivatelj posjeduje površinu, pa ako želite bijeli papir iza stranice, sami ispunjavate DC prije iscrtavanja, što je upravo ono što vam omogućuje slaganje stranice 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;
Kako zalijepiti PDF stranicu u Word ili uređivač slika?
RenderLoadedPageToClipboard(PageIndex, DPI, AsMetafile) postavlja jednu stranicu u Windows međuspremnik, spremnu za lijepljenje u Word, PowerPoint, e-poštu ili uređivač slika. Zastavica AsMetafile odabire format, a taj je odabir važniji nego što se čini. Ako proslijedite False, HotPDF postavlja 24-bitnu bitmapu uređaja (CF_BITMAP) iscrtana na vašem DPI — fiksnu mrežu piksela koja se može zalijepiti bilo kamo, ali se pikselizira kada je primatelj poveća. Ako proslijedite True, postavlja se poboljšana metapodatkovna datoteka (CF_ENHMETAFILE) u kojoj tekst stranice i vektorska grafika putuju kao GDI GDI naredbe za crtanje, pa zalijepljeni rezultat ostaje oštar pri svakom zumiranju i prilagođava se bilo kojoj veličini koju mu ciljni dokument odredi
// 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);
Gdje se zaustavlja putanja ispisa
Sve na ovoj stranici odnosi se samo na Windows, i to vrijedi jasno reći. PrintLoadedDocument, RenderLoadedPageToDC i RenderLoadedPageToClipboard izgrađeni su na TPrinter, GDI modelu konteksta uređaja, Windows međuspremniku i poboljšanim metapodatkovnim datotekama — što su sve Win32 i Win64 konstrukcije. Na drugim platformama ostatak HotPDF-a i dalje stvara, uređuje i čita PDF, ali ova GDI-podržana površina za ispis i međuspremnik nije dostupna. Iscrtavač također cilja na uobičajeni podskup teksta, putanja i slika u dokumentu, pa se dizajnerski predlošci bogati gradijentima i boje upravljane ICC profilima ispisuju kao vjerni pregledi, a ne kao kolorimetrijski dokazi, što je isto ograničenje koje ima i bitmap iscrtavač
Za serijski ispis u više datoteka, učitajte i ispišite svaki dokument redom te pratite potrošnju memorije: PrintLoadedDocument iscrtava jednu po jednu stranicu, ali sam graf učitanog dokumenta ostaje u memoriji tijekom cijelog posla. Kada upravljate redom ispisa za stotine velikih datoteka, protočni Direct File API za radne tijekove s velikim PDF-ovima dobro se nadopunjuje s putanjom ispisa — najprije podijelite, spojite ili odaberite potrebne stranice na disku, a potom učitajte samo taj tanki rezultat za ispis. Tako se PrintLoadedDocument, RenderLoadedPageToDC i RenderLoadedPageToClipboard isporučuju kao dio komponente HotPDF Component za Delphi i C++Builder — izvorne VCL knjižnice bez vanjskih DLL ovisnosti koja pokriva stvaranje, uređivanje, izdvajanje teksta i iscrtavanje PDF-a, a sada i ispis izravno na TPrinter, bilo koji kontekst uređaja ili u međuspremnik