Progressive Rendering and Cancellation
HotPDF dokáže renderovať načítanú stránku cez viacero ohraničených volaní a zastaviť dlho bežiace operácie dokumentu cez zdieľaný token zrušenia vo vlastníctve volajúceho
Progresívne renderovanie strán
Pre linearizované sieťové zdroje THPDFLinearizedPageRedrawScheduler oddeľuje rozsahy prvého vykreslenia od voliteľných závislostí zdieľaných objektov a vyžaduje prekreslenie až potom, keď novo doručená závislosť môže zmeniť stránku
Session := PDF.BeginLoadedPageProgressiveRender(0, 144);
try
repeat
Status := Session.ContinueRender(8, 128);
Preview.Assign(Session.Bitmap);
until Status in [prsCompleted, prsCancelled];
if Status = prsCompleted then
FinalBitmap := Session.TakeBitmap;
finally
Session.Free;
end;
ContinueRender prijíma maximálny uplynulý čas v milisekundách, maximálny počet operátorov obsahu stránky najvyššej úrovne alebo oboje; nula znamená bez limitu pre daný rozpočet
Volanie dokončí aspoň jeden operátor skôr, než aplikuje nenulový časový rozpočet, takže grafický stav sa vždy pozastaví na hranici operátora
Bitmap sprístupňuje živý čiastočný bitmap len na čítanie volajúcim, zatiaľ čo TakeBitmap prevedie vlastníctvo bez kopírovania, keď relácia dosiahne prsCompleted alebo prsCancelled
ObjectsProcessed a TotalObjects hlásia operátory obsahu najvyššej úrovne z každého streamu /Contents stránky v zdrojovom poradí
Progresívne renderovanie oblastí
Session := PDF.BeginLoadedPageProgressiveRegionRender(
0, 72, 144, 360, 432, 144);
try
repeat
Status := Session.ContinueRender(6, 96);
until Status in [prsCompleted, prsCancelled];
finally
Session.Free;
end;
Štyri súradnice oblasti sú body PDF user space s pôvodom v ľavom dolnom rohu a výstupný bitmap pokrýva presne toto okno pri požadovanom DPI
Relácia znovu používa cacheovaný display list, drží grafický a textový stav naprieč volaniami a potláča drahé kreslenia ciest, textu, obrázkov, Form a shadingov, ktorých konzervatívne hranice nepretínajú ROI
Stavové operátory a posuvy textu sa stále vykonávajú v zdrojovom poradí, takže vyradenie skoršej značky nemôže presunúť alebo prefarbiť neskoršiu viditeľnú značku
RegionVisiblePaintObjects a RegionCulledPaintObjects sprístupňujú výber display listu, zatiaľ čo rezervácia špičkovej pamäti nasleduje rozmery oblasti namiesto celej stránky
Progresívne JPEG skeny
Keď je THotPDF.ProgressiveJPEGScanDecoding true, spôsobilý progresívny obrázok DCTDecode postúpi o jeden JPEG sken na ohraničené volanie ContinueRender, takže živý bitmap môže ukázať skorý hrubý náhľad pred finálnym skenom
THotPDF.ProgressiveJPEGMaxScans obmedzuje každý obrázok na 1 až 4096 skenov, zatiaľ čo rozpočet dekódovaných bajtov dokumentu pokrýva aj zarovnaný výstupný bitmap
THPDFLoadedPageRenderSession.ProgressiveJPEGScansDecoded a THPDFLoadedPageRenderSession.ProgressiveJPEGImagesDecoded hlásia počty dokončených skenov a obrázkov; THPDFLoadedPageRenderSession.OnProgressiveJPEGScan prijíma THPDFProgressiveJPEGScanEvent po každom viditeľnom skene a môže reláciu zrušiť
Jednotka HPDFJpeg tiež sprístupňuje THPDFJpegScanDecoder pre surové vstupy THPDFJpegByteArray s výsledkami THPDFJpegScanDecodeStatus a voliteľným spätným volaním THPDFJpegCancellationCheck pre rušenie na úrovni riadkov
Inkrementálna cesta prijíma obrazové kreslenia JPEG s plným cieľom DeviceRGB alebo DeviceGray s predvoleným krytím a bez masiek, prenosových funkcií, poltónov, overprint alebo stavu transparency skupiny; všetky ostatné kreslenia používajú dekodér kompletného obrázku, aby sa zachovala sémantika renderovania
Vypnutie voľby, vyžiadanie izolácie kodeku, prekročenie limitu alebo stretnutie s poškodeným vstupom tiež vyberie cestu kompletného obrázka bez odhalenia čiastočného zlyhaného dekódovania
Spätné volania priebehu
THPDFProgressiveRenderProgressEvent beží po každom dokončenom operátore a prijíma počty spracovaných a celkových plus uplynulý čas vykonávania renderovania
Nastavte parameter Cancel spätného volania na true, aby sa táto relácia dokončila v prsCancelled bez zrušenia zdieľaného tokenu
Form XObject, vzorka, dekódovanie obrázku alebo iná vnorená operácia patrí k svojmu obklopujúcemu operátorovi najvyššej úrovne a môže prekročiť malý časový rozpočet skôr, než sa vráti kontrola
Rušenie naprieč operáciou
Token := THPDFCancellationToken.Create;
try
PDF.OperationCancellationToken := Token;
Worker.Start;
// Call Token.Cancel from another thread when the operation should stop
finally
PDF.OperationCancellationToken := nil;
Token.Free;
end;
THPDFCancellationToken je bezpečné pre vlákna, jednorazové a vo vlastníctve volajúceho; Cancel natrvalo vyžiada rušenie a IsCancellationRequested sprístupňuje stav
ThrowIfCancellationRequested vyvolá EHPDFOperationCancelled a zachová názov operácie v OperationName
THotPDF.OperationCancellationToken sa aplikuje na načítanie, synchronné renderovanie, progresívne renderovanie bez explicitného tokenu, OptimizeLoadedStreams, CreatePreflightReport a ValidatePDFVT
SignPDFWithPFX a SignPDFWithSystemCertificate poskytujú preťaženia, ktoré prijímajú token priamo
Vlastníctvo a pravidlá čiastočných výsledkov
- Dokument aj token musia prežiť každý
THPDFLoadedPageRenderSession, ktorý na ne odkazuje - Po zrušenom načítaní môže nasledovať čerstvé načítanie na tej istej inštancii dokumentu
- Optimalizácia streamov je kooperatívna, nie transakčná, takže streamy dokončené pred zrušením zostávajú optimalizované
- Zrušený podpisový cieľ môže obsahovať čiastočný výstup a pri požiadavke atomického dodania by sa mal zahodiť
- Volanie providera súkromného kľúča Windows nemožno bezpečne prerušiť, takže rušenie sa sleduje bezprostredne pred a po tomto volaní