Progressiv rendering och avbrytning
HotPDF kan rendera en inläst sida över flera begränsade anrop och kan stoppa långkörande dokumentoperationer genom en delad avbrottstoken som ägs av anroparen
Progressiv sidrendering
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 accepterar en maximal förfluten tid i millisekunder, ett maximalt antal toppnivåoperatorer i sidinnehållet, eller båda; noll betyder obegränsat för den budgeten
Anropet avslutar minst en operator innan en tidsbudget som inte är noll tillämpas, så grafiktillståndet är alltid pausat vid en operatörsgräns
Bitmap exponerar den levande anroparen-läsbara delvisa bilden, medan TakeBitmap överför ägandet utan att kopiera efter att sessionen når prsCompleted eller prsCancelled
ObjectsProcessed och TotalObjects rapporterar operatorer på toppnivå från varje sidas /Contents-ström i källordning
Progressiv regionrendering
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;
De fyra regionkoordinaterna är PDF-points i användarrymden med ett nederst-vänster-origin och utdatabitmappen täcker exakt det fönstret vid den begärda DPI:n
Sessionen återanvänder den cachelagrade display-listan, behåller grafik- och texttillstånd över anrop och undertrycker dyra path-, text-, bild-, Form- och skuggningspaints vars konservativa gränser inte skär ROI:n
Tillståndsoperatorer och textframsteg körs fortfarande i källordning, så att cullera ett tidigare märke inte kan flytta eller omfärga ett senare synligt märke
RegionVisiblePaintObjects och RegionCulledPaintObjects exponerar display-list-urvalet, medan toppminnesreservationen följer regionmåtten i stället för hela sidan
Progressiva JPEG-skanningar
När THotPDF.ProgressiveJPEGScanDecoding är true, framstegs en berättigad progressiv DCTDecode-bild med en JPEG-skanning per begränsat ContinueRender-anrop, så att den levande bitmappen kan visa en tidig grov förhandsvisning före den slutliga skanningen
THotPDF.ProgressiveJPEGMaxScans begränsar varje bild till mellan 1 och 4096 skanningar, medan dokumentets avkodnings-byte-budget även täcker den justerade utdatabitmappen
THPDFLoadedPageRenderSession.ProgressiveJPEGScansDecoded och THPDFLoadedPageRenderSession.ProgressiveJPEGImagesDecoded rapporterar antalet slutförda skanningar och bilder; THPDFLoadedPageRenderSession.OnProgressiveJPEGScan tar emot en THPDFProgressiveJPEGScanEvent efter varje synlig skanning och kan avbryta sessionen
Enheten HPDFJpeg exponerar även THPDFJpegScanDecoder för råa THPDFJpegByteArray-indata, med THPDFJpegScanDecodeStatus-resultat och en valfri THPDFJpegCancellationCheck-återanropsfunktion för avbrytning på radnivå
Den inkrementella sökvägen accepterar helmål-DeviceRGB- eller DeviceGray-JPEG-bildpaints med standardopacitet och inga masker, transferfunktioner, halvtoner, övertryck eller transparensgrupptillstånd; alla andra paints använder helbildsavkodaren för att bevara renderingssemantiken
Att inaktivera alternativet, kräva codecisolering, överskrida en gräns eller stöta på felformaterad indata väljer också helbildssökvägen utan att exponera ett delvis misslyckat avkodningsresultat
Förloppsåteranrop
THPDFProgressiveRenderProgressEvent körs efter varje slutförd operator och tar emot bearbetade och totala antal plus förfluten renderingsexekveringstid
Ställ återanropsfunktionens Cancel-parameter på true för att avsluta den sessionen med prsCancelled utan att avbryta den delade token
En Form-XObject, ett mönster, en bildavkodning eller annan nästlad operation tillhör sin inneslutande toppnivåoperator och kan överskrida en liten tidsbudget innan kontrollen återvänder
Avbrytning av hela operationen
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 är trådsäker, one-shot och ägs av anroparen; Cancel begär avbrytning permanent och IsCancellationRequested exponerar tillståndet
ThrowIfCancellationRequested avger EHPDFOperationCancelled och bevarar operationsnamnet i OperationName
THotPDF.OperationCancellationToken gäller för inläsning, synkron rendering, progressiv rendering utan explicit token, OptimizeLoadedStreams, CreatePreflightReport och ValidatePDFVT
SignPDFWithPFX och SignPDFWithSystemCertificate erbjuder överlagringar som accepterar en token direkt
Regler för ägande och delresultat
- Dokumentet och token måste överleva varje
THPDFLoadedPageRenderSessionsom refererar till dem - En avbruten inläsning kan följas av en ny inläsning på samma dokumentinstans
- Strömoptimering är kooperativ snarare än transaktionell, så strömmar som slutförts före avbrytningen förblir optimerade
- En avbruten signeringsdestination kan innehålla delvis utdata och bör kasseras när atomisk leverans krävs
- Ett Windows-leverantörsanrop för privat nyckel kan inte avbrytas säkert, så avbrytning observeras omedelbart före och efter anropet