HotPDF tiskne načtené PDF na fyzickou tiskárnu, do jakéhokoli kontextu zařízení Windows nebo do schránky pomocí tří volání: `PrintLoadedDocument` ovládá VCL `TPrinter`, `RenderLoadedPageToDC` vykresluje stránku přímo do libovolného `HDC` a `RenderLoadedPageToClipboard` kopíruje stránku jako bitmapu nebo vektorový metasoubor. HotPDF je nativní komponenta VCL PDF pro Delphi a C++Builder a tuto prvotřídní tiskovou cestu přidala ve verzi v2.331.0, přičemž ji vylepšila ve verzi v2.348.0, takže už nemusíte ručně psát smyčku `TPrinter` kolem bitmapového vykreslovače sami. Všecha tři volání kreslí vektorový obsah stránky přímo tam, kde na tom záleží, takže výtisk zůstává tak ostrý, jak jen jej tiskárna dokáže vykreslit
Proč kreslit stránku PDF přímo do tiskárny namísto bitmapy?
Stránka PDF je program vektorových kreslicích operátorů — cest, textu a obrázků spouštěných proti grafickému modelu ISO 32000-1 — nikoli mřížka pixelů. Zřejmým způsobem, jak ji vytisknout, je rastrovat stránku do bitmapy a tuto bitmapu přenést na plátno tiskárny, což sice funguje, ale zahazuje to jedinou věc, ve které je tiskárna dobrá. Moderní laserová tiskárna rozlišuje 600 nebo 1200 DPI; bitmapa rastrována při 150 nebo 300 DPI a poté roztažená tak, aby odpovídala rozměrům, dorazí neostrá, se zubatými okraji textu a viditelnou interpolací. `RenderLoadedPageToDC` volí lepší cestu: přehrává tok obsahu stránky jako volání GDI emitovaná přímo do cílového kontextu zařízení, takže vektorový text a čárová grafika dorazí do tiskárny jako vektory a jsou rastrovány pouze jednou, tiskárnou, v jejím vlastním rozlišení
Jak vytisknout načtené PDF na fyzickou tiskárnu v Delphi?
HotPDF tiskne načtený dokument pomocí `PrintLoadedDocument(Printer, Options)`, což přijímá přiřazený VCL `TPrinter` a záznam `THPDFPrintOptions`, vytiskne vybrané stránky a vrátí počet odeslaných stránek. Nejprve nastavte `Printer.PrinterIndex`, aby bylo vybráno zařízení, vyplňte záznam možností (třídní funkce `THPDFPrintOptions.Default` vám poskytne rozumné výchozí hodnoty) a zavolejte metodu jednou. Knihovna otevře tiskovou úlohu pomocí `Printer.BeginDoc`, prochází rozsah stránek a mezi stránkami volá `Printer.NewPage`, načež ji uzavře pomocí `Printer.EndDoc`, takže životní cyklus tiskové úlohy nikdy nespravujete ručně
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 vybere výchozí tiskárnu
Opts := THPDFPrintOptions.Default; // všechny stránky, 300 DPI, FitPage, barevně
Opts.PageRange := '1,3-5'; // indexováno od 1; prázdný řetězec vytiskne všechny stránky
Opts.Copies := 2;
Pdf.PrintLoadedDocument(Printer, Opts);
end;
finally
Pdf.Free;
end;
end;
Řetězec `PageRange` je indexován od jedné a čte se stejně jako v tiskovém dialogu: `'1,3-5'` vytiskne stránku 1 a stránky 3 až 5, přičemž prázdný řetězec vytiskne celý dokument. `Copies` se mapuje přímo na `Printer.Copies`. Buďte k sobě však upřímní ohledně `Collate` (snášení): protože VCL vystavuje snášení v různých verzích Delphi nekonzistentně, HotPDF nastaví počet kopií a ponechá snášení na výchozím nastavení ovladače tiskárny. Pokud tedy potřebujete zaručené pořadí snášení, nastavte jej na ovladači prostřednictvím dialogu `TPrinterSetupDialog`, místo abyste se spoléhali na to, že to zařídí tento příznak
Jak DPI a FitPage určují měřítko tisku?
`FitPage` a `DPI` spolupracují způsobem, který stojí za to pochopit před nasazením. Pokud je `FitPage` nastaveno na True — což je výchozí hodnota —, HotPDF načte `MediaBox` každé stránky, změní jeho velikost na `Printer.PageWidth` a `Printer.PageHeight` při zachování poměru stran a vykreslí jej v měřítku, díky kterému stránka vyplní papír. V tomto režimu je `Options.DPI` efektivně potlačeno měřítkem přizpůsobení, protože výstup musí odpovídat fyzickým rozměrům stránky tiskárny. S `FitPage` nastaveným na False vykresluje HotPDF každou stránku v poměru 1:1 přesně při `Options.DPI`, přičemž mapuje 72 jednotek PDF na `DPI` pixelů zařízení, což je to, co chcete, když jsou zdrojová stránka a papír již stejně velké a záleží vám na přesném rozlišení. Po FitPage sáhněte, když se velikost zdrojové stránky a velikost zásobníku liší; po 1:1 sáhněte, když se shodují a požadujete deterministické škálování
Dvě možnosti přidané ve verzi v2.348.0 opravují výtisky, které vypadají téměř správně. Každá fyzická tiskárna má pevný okraj — netisknutelný okraj, na který hardware nedosáhne — a ve výchozím nastavení počátek stránky končí uvnitř něj, takže stránka bez okrajů (full-bleed) ztratí pruh ze dvou hran. Nastavte `IgnoreHardMargin` na True a HotPDF se dotáže tiskárny na hodnoty `PHYSICALOFFSETX` a `PHYSICALOFFSETY`, načež posune počátek zařízení, aby tento offset zrušilo, takže se počátek stránky namapuje na skutečný roh papíru. Druhá možnost, `AutoRotate`, je ve výchozím nastavení zapnutá: čte `MediaBox` každé stránky a v případě, že je stránka širší než vyšší, přepne tiskárnu na šířku (landscape), takže se široká stránka vytiskne neoříznutá, místo aby byla oříznuta na výšku (portrait). `AutoRotate` ustoupí stranou v momentě, kdy nastavíte `Orientation` explicitně, takže záměrná volba orientace má vždy přednost
Jak vykreslit PDF stránku do jakéhokoli kontextu zařízení?
`RenderLoadedPageToDC(PageIndex, DC, DPI, W, H)` je primitivní operací pod tiskovou smyčkou a je užitečná i sama o sobě. `PrintLoadedDocument` ji volá jednou pro každou stránku proti plátnu tiskárny, avšak cílem může být jakékoli Windows `HDC`: mimoobrazovkový paměťový DC, plátno komponenty ve vlastním prohlížeči nebo plocha náhledu tisku. `PageIndex` je indexován od nuly, `W` a `H` jsou jednotky zařízení cílového povrchu a vykreslovač prochází `/Contents` stránky a emituje volání GDI do vašeho DC. Stojí za to znát jedno záměrné chování: nevykresluje žádnou výplň pozadí. Volající vlastní povrch, takže pokud chcete pod stránkou bílý papír, musíte DC před vykreslením sami vyplnit, což je přesně to, co vám umožňuje složit stránku přes existující plátno, pokud si to přejete
// Vykreslit stránku 1 na mimoobrazovkový 24bitový povrch při 150 DPI
var
Surface: TBitmap;
begin
Surface := TBitmap.Create;
try
Surface.PixelFormat := pf24bit;
Surface.SetSize(1275, 1650); // 8,5 x 11 palců při 150 DPI
Surface.Canvas.Brush.Color := clWhite;
Surface.Canvas.FillRect(Surface.Canvas.ClipRect); // volající vykreslí pozadí
Pdf.RenderLoadedPageToDC(0, Surface.Canvas.Handle, 150, Surface.Width, Surface.Height);
// Povrch nyní drží složenou stránku, připravenou k blitování nebo uložení
finally
Surface.Free;
end;
end;
Když potřebujete pouze hotový `TBitmap` — náhled, export obrázku, náhled, který uložíte do mezipaměti —, sáhněte namísto toho po `RenderLoadedPageToBitmap`, kterým se zabývá doprovodný článek o vykreslování stránek PDF do bitmapy. Rozdíl je v tom, kdo vlastní povrch: volání bitmapy alokuje a vrací pixelovou vyrovnávací paměť (buffer), zatímco `RenderLoadedPageToDC` kreslí do kontextu zařízení, který již držíte, což je přesně to, co vám předá plátno tiskárny nebo obsluha kreslení. Obě metody sdílejí stejný interpret toku obsahu a engine pro vložené znaky, takže text v obou případech vychází s přesnými vloženými obrysy
Jak vložit stránku PDF do Wordu nebo editoru obrázků?
`RenderLoadedPageToClipboard(PageIndex, DPI, AsMetafile)` umístí jednu stránku do schránky Windows, připravenou k vložení do Wordu, PowerPointu, e-mailu nebo editoru obrázků. Příznak `AsMetafile` vybírá formát a tato volba má větší význam, než se zdá. Předejte False a HotPDF umístí 24bitovou bitmapu zařízení (`CF_BITMAP`) vykreslenou při vašem `DPI` — pevnou mřížku pixelů, kterou lze vložit kamkoli, ale při zvětšení příjemcem pixelovatí. Předejte True a umístí rozšířený metasoubor (`CF_ENHMETAFILE`), ve kterém text stránky a vektorové umění putují jako kreslicí příkazy GDI, takže vložený výsledek zůstává ostrý při jakémkoli přiblížení a přizpůsobí se libovolné velikosti, kterou mu cílový dokument dá
// Zkopírovat stránku 2 jako škálovatelný vektorový metasoubor pro vložení do Wordu
Pdf.RenderLoadedPageToClipboard(1, 300, True);
// Namísto toho zkopírovat stejnou stránku jako pevnou 300-DPI bitmapu
Pdf.RenderLoadedPageToClipboard(1, 300, False);
Základní pravidlo je jednoduché. Pokud bude člověk stránku vkládat do dokumentu a mohl by změnit její velikost — obrázek v reportu, klauzule vložená do návrhu smlouvy —, použijte metasoubor, protože vektorový text se tiskne a zvětšuje čistě. Pokud cíl rozumí pouze rastrovým datům, nebo konkrétně chcete zmrazený snímek v definovaném rozlišení, použijte bitmapu. Pro vytažení slov ze stránky namísto jejich obrázku se jedná o zcela jinou úlohu, kterou řeší API pro extrakci textu, které namísto vykresleného obrázku vrací znaky a jejich pozice
Kde tisková cesta končí
Vše na této stránce je pouze pro Windows, což stojí za to uvést na rovinu. `PrintLoadedDocument`, `RenderLoadedPageToDC` a `RenderLoadedPageToClipboard` jsou postaveny na `TPrinter`, modelu kontextu zařízení GDI, schránce Windows a rozšířených metasouborech — což jsou všechno konstrukty Win32 a Win64. Na ostatních cílových platformách zbytek HotPDF stále vytváří, upravuje a čte PDF, ale tato tisková plocha a schránka zálohovaná GDI nejsou k dispozici. Vykreslovač také cílí na běžnou podmnožinu textu, cest a obrázků v dokumentu, takže designové nátisky s vysokým obsahem přechodů a barvy spravované pomocí ICC se vytisknou jako věrný náhled, spíše než jako kolorimetrický nátisk, což je stejná hranice, jakou nese bitmapový vykreslovač
Při hromadném tisku napříč mnoha soubory načtěte a vytiskněte každý dokument postupně a sledujte nároky na paměť: `PrintLoadedDocument` vykresluje jednu stránku po druhé, avšak samotný graf načteného dokumentu žije v paměti po celou dobu úlohy. Když řídíte tiskovou frontu nad stovkami velkých souborů, streamovací API Direct File pro pracovní postupy s velkými PDF se s tiskovou cestou dobře doplňuje — nejprve rozdělte, sloučte nebo vyberte stránky, které potřebujete, na disku a poté načtěte pouze štíhlý výsledek k tisku. Takto se `PrintLoadedDocument`, `RenderLoadedPageToDC` a `RenderLoadedPageToClipboard` dodávají jako součást HotPDF Component pro Delphi a C++Builder — nativní knihovny VCL bez externích závislostí na DLL, která pokrývá vytváření, úpravy, extrakci textu, vykreslování a nyní i tisk PDF přímo do `TPrinter`, jakéhokoli kontextu zařízení nebo schránky