PDF súbor, ktorého hlavička obsahuje prechodové pozadie v štýle Wordu alebo Excelu, sa po vykreslení do obrázka zvykol vracať s prázdnym bielym obdĺžnikom tam, kde mala byť zmes farieb. Vykresľovač stránok HotPDF teraz rešpektuje PDF operátor sh (tieňovanie) pre axiálne prechody typu 2 (Type 2 axial) a radiálne prechody typu 3 (Type 3 radial): vyhodnocuje funkciu tieňovania pozdĺž osi prechodu a vykresľuje zmes farieb, zatiaľ čo predchádzajúce verzie tento operátor potichu zahadzovali a oblasť ponechávali bielu ako papier. Dva typy tieňovania, ktoré pokrývajú takmer každý prechod v kancelárskych dokumentoch, sú podporované; sieťové typy (mesh) nie, a tento článok úprimne hovorí o tom, kde táto čiara leží
Prečo sa PDF prechod vykresľuje ako biely box?
PDF prechod je vektorová konštrukcia, nie bitmapa, ktorú môže vykresľovač preniesť (blit). Slovník tieňovania (ISO 32000-1 §8.7.4.5) opisuje geometriu — os alebo dvojicu kružníc v poli Coords — a farebnú funkciu, a operátor sh vykresľuje toto tieňovanie cez aktuálnu oblasť orezania, čo je rovnaký grafický model, aký HotPDF vystavuje, keď kreslíte cesty a výplne na plátno stránky. Vykresľovač stránok HotPDF prechádza tok obsahu operátor po operátore a akýkoľvek operátor, pre ktorý nemá kód, preskočí, takže zvyšok stránky sa stále vykreslí. Pred verziou v2.335.0 patril sh do tejto preskakovanej množiny: prechod v hlavičke alebo na celej stránke neprispel k výstupu ničím, takže pozadie presvitalo ako biele. Súbor nebol nikdy poškodený. Vykresľovač jednoducho nemal obsluhu pre tento jeden operátor a biely box je presne to, ako vyzerá chýbajúca obsluha
Reťazec vyhodnocovania funkcií za tieňovaním
Tieňovanie nie je možné vykresliť, kým sa nevyhodnotí jeho funkcia, takže tento mechanizmus musel prísť ako prvý. Axiálne tieňovania typu 2 a radiálne tieňovania typu 3 nesú /Function, ktorá mapuje parametrickú pozíciu pozdĺž prechodu na farbu (ISO 32000-1 §7.10), a vyhodnocovač funkcií HotPDF rozlišuje FunctionType a podľa neho odosiela prácu. Exponenciálna interpolácia typu 2 (§7.10.3) počíta C0 + t^N * (C1 - C0) s obmedzením Domain a Range; vzorkované funkcie typu 0 (§7.10.2) čítajú mriežku 8-, 16- alebo 32-bitových vzoriek a vyberajú najbližšiu cez mapa Encode, čo je prípad podrobne popísaný v našom sprievodcovi vzorkovaným vyhľadávaním farieb typu 0; spájacie (stitching) funkcie typu 3 (§7.10.4) vyberajú podfunkciu podľa poľa Bounds a rekurzívne do nej vstupujú. PostScript kalkulačné funkcie typu 4 (§7.10.5) sa nevyhodnocujú — degradujú hladko na neúspešné vyhodnotenie a nie na nesprávnu farbu, čo zodpovedá konzervatívnemu prístupu, ktorý HotPDF uplatňuje v celej vykresľovacej ceste. Tento vyhodnocovač prišiel vo verzii v2.334.0, jedno vydanie pred samotným operátorom, pretože vykresľovač tieňovania je len taký dobrý, aká dobrá je funkcia pod ním
Ako HotPDF premieňa spojitý prechod na pixely?
HotPDF aproximuje spojité miešanie konečným počtom jednofarebných pásov. Vykresľovač tieňovania prechádza os prechodu, rozdeľuje ju až na 64 pásov — menej, keď je os krátka v pixeloch zariadenia —, vyhodnocuje funkciu na parametrickej pozícii každého pásu a vypĺňa obdĺžnik kolmý na os plným štetcom. Kompromisom je počet pásov voči hladkosti: viac pásov sleduje zmes presnejšie, ale stojí viac výplní, a 64 je zámerný strop. Keďže počet sa tiež škáluje s dĺžkou osi v pixeloch zariadenia, na rozlíšení záleží. Vykreslenie rovnakej stránky pri vyššom DPI predlžuje os, takže krátky prechod získa viac pásov a jeho pásy zmäknú, až kým sa nedosiahne strop
// The shading discretizer uses up to 64 color bands along the gradient
// axis, but never more than the axis is long in device pixels. Rendering
// the same page at a higher DPI lengthens that axis, so a short gradient
// gains bands and the banding softens until the 64-band ceiling is hit.
Thumb := Pdf.RenderLoadedPageToBitmap(PageIndex, 96); // coarser bands
Proof := Pdf.RenderLoadedPageToBitmap(PageIndex, 300); // up to 64 bands
Vykreslenie tieňovanej stránky do bitmapy
Verejný vstupný bod je nezmenený: RenderLoadedPageToBitmap prijíma index stránky od nuly a hodnotu DPI, vracia 24-bitovú bitmapu vlastnenú volajúcim a v prípade zlyhania vracia nil namiesto vyvolania výnimky, takže podpora tieňovania je transparentná pre kód, ktorý už máte. Stránka, ktorej prechodová hlavička sa predtým vykresľovala ako prázdna, teraz vracia rovnakú bitmapu s vykreslenou zmesou farieb a na jej získanie nie je potrebná žiadna zmena API. Jediná vec, ktorú si treba pamätať, je vlastníctvo: volajúci uvoľňuje vrátenú bitmapu. Celá vykresľovacia pipeline — interpretácia toku obsahu, zabudované glyfy a ukladanie stránok do vyrovnávacej pamäte — je opísaná v sprievodcovi vykresľovaním PDF stránok do bitmapy v Delphi
var
Pdf: THotPDF;
Bmp: TBitmap;
begin
Pdf := THotPDF.Create(nil);
try
if Pdf.LoadFromFile('quarterly-report.pdf') > 0 then
begin
// Page 1 (zero-based) at 150 DPI. A gradient-filled header that
// used to come back blank now carries its color blend.
Bmp := Pdf.RenderLoadedPageToBitmap(0, 150);
if Assigned(Bmp) then
try
Bmp.SaveToFile('page1.bmp');
finally
Bmp.Free;
end;
end;
finally
Pdf.Free;
end;
end;
Rýchla ochrana proti regresii vyplýva z rovnakého volania. Vykreslite stránku, odoberte vzorku pixelu tam, kam patrí pás prechodu, a overte, že už nie je biely ako papier, čo bola pôvodná núdzová farba vykresľovača — jednoradková kontrola, ktorá zachytí tichý návrat k starému správaniu bez akejkoľvek operácie (no-op):
Bmp := Pdf.RenderLoadedPageToBitmap(0, 150);
if Assigned(Bmp) then
try
// True when the sh operator painted; False if the region fell back to white.
HeaderPainted := Bmp.Canvas.Pixels[Bmp.Width div 2, 8] <> clWhite;
finally
Bmp.Free;
end;
Čo HotPDF nekreslí: sieťové tieňovania (mesh shadings) a okraje orezania
Štyri typy sieťového tieňovania (mesh shading) sú mimo rozsahu a vývojár by to mal pred začiatkom vedieť. Voľné Gouraudove trojuholníkové siete (typ 4), mriežkové Gouraudove siete (typ 5), Coonsove plošné siete (Coons patch meshes, typ 6) a tensorovo-produktové plošné siete (typ 7), definované v ISO 32000-1 §8.7.4.5.5 až §8.7.4.5.8, sa nevykresľujú. Stránka, ktorá ich používa, sa stále vykreslí, avšak táto konkrétna oblasť zostane nezmenená. Stojí za to jasne uviesť ďalšie dva hraničné prípady. Obdĺžniky pásov pokrývajú pás prechodu namiesto toho, aby boli orezané presne podľa aktuálnej cesty orezania, takže prechod maskovaný do zaobleného alebo nepravidelného tvaru sa vykreslí ako jeho ohraničujúci pás, kým v neskoršom kole nepríde presné orezávanie oblastí. HotPDF tiež predpokladá, že výstupom funkcie je RGB alebo odtiene sivej, takže tieňovanie vytvorené v CMYK alebo exotickom farebnom priestore sa len aproximuje a nepoužíva sa správa farieb. Pre dokumenty, ktoré väčšina tímov Delphi a C++Builder v skutočnosti spracováva — správy, faktúry, výpisy a prezentácie exportované do PDF —, axiálne a radiálne tieňovanie pokrýva v podstate každý prechod, s ktorým sa stretnete, a dizajnové nátlačky s hustými sieťami sú prípadom, s ktorým by sa malo zaobchádzať skôr ako s náhľadom než s presným nátlačkom
Vykresľovač stránok HotPDF, tu popísaná podpora operátora sh a vyhodnocovač funkcií typu 0/2/3 pod ním sa dodávajú ako súčasť komponentu HotPDF Component pre Delphi and C++Builder — natívnej VCL knižnice bez externých závislostí na DLL, ktorá pokrýva vytváranie, úpravu, extrakciu textu a vykresľovanie stránok PDF v jednom balíku