Progressive Rendering and Cancellation
Aplikace HotPDF umí vykreslit načtenou stránku v mnoha omezených voláních a dokáže zastavit dlouhotrvající operace s dokumentem prostřednictvím sdíleného tokenu zrušení ve vlastnictví volajícího
Progressive page rendering
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 přijímá maximální uplynulý čas v milisekundách, maximální počet operátorů obsahu stránky na nejvyšší úrovni, nebo obojí; nula znamená pro daný rozpočet neomezeno
Volání dokončí alespoň jeden operátor před použitím nenulového časového rozpočtu, takže stav grafiky je vždy pozastaven na hranici operátoru
Bitmap vystavuje živou částečnou bitmapu určenou pouze pro čtení volajícím, zatímco TakeBitmap přenáší vlastnictví bez kopírování poté, co relace dosáhne prsCompleted nebo prsCancelled
ObjectsProcessed a TotalObjects hlásí operátory obsahu na nejvyšší úrovni z každého streamu /Contents stránky v pořadí zdroje
Progressive region rendering
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;
Čtyři souřadnice regionu jsou body uživatelského prostoru PDF s počátkem vlevo dole a výstupní bitmapa pokrývá přesně toto okno při požadovaném DPI
Relace znovu používá cacheovaný display list, uchovává stav grafiky a textu napříč voláními a potlačuje nákladné malby cest, textu, obrazu, Form a stínování, jejichž konzervativní ohraničení neprotíná ROI
Stavové operátory a postup textu se stále provádějí v pořadí zdroje, takže vyřazení dřívější značky nemůže posunout ani přebarvit pozdější viditelnou značku
RegionVisiblePaintObjects a RegionCulledPaintObjects vystavují výběr display listu, zatímco rezervace špičkové paměti sleduje rozměry regionu místo celé stránky
Progressive JPEG scans
Když je THotPDF.ProgressiveJPEGScanDecoding nastaveno na true, vhodný progresivní obraz DCTDecode postupuje o jeden scan JPEG na každé omezené volání ContinueRender, takže živá bitmapa může zobrazit raný hrubý náhled před posledním scanem
THotPDF.ProgressiveJPEGMaxScans omezuje každý obraz na 1 až 4096 scanů, zatímco rozpočet bajtů dekódování dokumentu také pokrývá zarovnanou výstupní bitmapu
THPDFLoadedPageRenderSession.ProgressiveJPEGScansDecoded a THPDFLoadedPageRenderSession.ProgressiveJPEGImagesDecoded hlásí počty dokončených scanů a obrazů; THPDFLoadedPageRenderSession.OnProgressiveJPEGScan přijímá THPDFProgressiveJPEGScanEvent po každém viditelném scanu a může relaci zrušit
Jednotka HPDFJpeg také vystavuje THPDFJpegScanDecoder pro surové vstupy THPDFJpegByteArray s výsledky THPDFJpegScanDecodeStatus a volitelným zpětným voláním THPDFJpegCancellationCheck pro zrušení na úrovni řádků
Inkrementální cesta přijímá malby obrazů JPEG DeviceRGB nebo DeviceGray v plném cíli s výchozí neprůhledností a bez masek, přenosových funkcí, polotónů, overprintu nebo stavu průhlednosti; všechny ostatní malby používají dekodér kompletního obrazu, aby se zachovala sémantika vykreslování
Zakázání možnosti, vyžadování izolace kodeku, překročení limitu nebo výskyt chybného vstupu rovněž volí cestu kompletního obrazu bez vystavení částečného neúspěšného dekódování
Progress callbacks
THPDFProgressiveRenderProgressEvent běží po každém dokončeném operátoru a přijímá počty zpracovaných a celkových operátorů plus uplynulý čas provádění vykreslování
Nastavte parametr Cancel zpětného volání na true, aby relace skončila v prsCancelled bez zrušení sdíleného tokenu
Form XObject, vzor, dekódování obrazu nebo jiná vnořená operace patří svému obklopujícímu operátoru na nejvyšší úrovni a může překročit malý časový rozpočet, než se vrátí řízení
Operation-wide cancellation
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ý pro vlákna, jednorázový a ve vlastnictví volajícího; Cancel trvale požaduje zrušení a IsCancellationRequested vystavuje stav
ThrowIfCancellationRequested vyvolává EHPDFOperationCancelled a zachovává název operace v OperationName
THotPDF.OperationCancellationToken se vztahuje na načítání, synchronní vykreslování, progresivní vykreslování bez explicitního tokenu, OptimizeLoadedStreams, CreatePreflightReport a ValidatePDFVT
SignPDFWithPFX a SignPDFWithSystemCertificate poskytují přetížení, která přijímají token přímo
Ownership and partial-result rules
- Dokument a token musí přežít každou
THPDFLoadedPageRenderSession, která na ně odkazuje - Po zrušeném načítání může na stejné instanci dokumentu následovat nové načítání
- Optimalizace streamu je kooperativní spíše než transakční, takže streamy dokončené před zrušením zůstávají optimalizované
- Cíl zrušeného podpisu může obsahovat částečný výstup a měl by být zahozen, když je vyžadováno atomické doručení
- Volání poskytovatele soukromého klíče Windows nelze bezpečně přerušit, takže zrušení je pozorováno bezprostředně před a po tomto volání