Rendering Progressivo e Cancellazione
HotPDF può renderizzare una pagina caricata su più chiamate limitate e può fermare le operazioni di documento di lunga durata tramite un cancellation token condiviso di proprietà del chiamante
Rendering progressivo della pagina
Per le sorgenti network linearizzate, THPDFLinearizedPageRedrawScheduler separa gli intervalli del primo paint dalle dipendenze opzionali sugli oggetti condivisi e richiede il redraw solo dopo che una dipendenza appena arrivata può cambiare la pagina
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 accetta un tempo massimo trascorso in millisecondi, un numero massimo di operatori del contenuto di pagina di primo livello, o entrambi; zero significa illimitato per quel budget
La chiamata completa almeno un operatore prima di applicare un budget di tempo non nullo, così lo stato grafico resta sempre in pausa al confine di un operatore
Bitmap espone la bitmap parziale live in sola lettura per il chiamante, mentre TakeBitmap trasferisce la proprietà senza copia dopo che la sessione ha raggiunto prsCompleted o prsCancelled
ObjectsProcessed e TotalObjects riportano gli operatori di contenuto di primo livello di ogni stream /Contents della pagina in ordine di sorgente
Rendering progressivo di regioni
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;
Le quattro coordinate della regione sono punti nello spazio utente PDF con origine in basso a sinistra, e la bitmap di output copre esattamente quella finestra al DPI richiesto
La sessione riusa la display list in cache, conserva lo stato grafico e di testo tra le chiamate, e sopprime le pitture costose di percorsi, testo, immagini, Form e shading i cui bounds conservativi non intersecano la ROI
Gli operatori di stato e l'avanzamento del testo vengono comunque eseguiti in ordine di sorgente, quindi scartare un mark precedente non può spostare o ricolorare un mark visibile successivo
RegionVisiblePaintObjects e RegionCulledPaintObjects espongono la selezione della display list, mentre la riserva del picco di memoria segue le dimensioni della regione invece della pagina completa
Scan progressivi JPEG
Quando THotPDF.ProgressiveJPEGScanDecoding è true, un'immagine DCTDecode progressiva idonea avanza di una scan JPEG per ogni chiamata limitata a ContinueRender, così la bitmap live può mostrare un'anteprima grossolana anticipata prima della scan finale
THotPDF.ProgressiveJPEGMaxScans limita ogni immagine tra 1 e 4096 scan, mentre il budget dei byte decodificati del documento copre anche la bitmap di output allineata
THPDFLoadedPageRenderSession.ProgressiveJPEGScansDecoded e THPDFLoadedPageRenderSession.ProgressiveJPEGImagesDecoded riportano i conteggi di scan e immagini completate; THPDFLoadedPageRenderSession.OnProgressiveJPEGScan riceve un THPDFProgressiveJPEGScanEvent dopo ogni scan visibile e può cancellare la sessione
L'unità HPDFJpeg espone anche THPDFJpegScanDecoder per input raw THPDFJpegByteArray, con risultati THPDFJpegScanDecodeStatus e una callback opzionale THPDFJpegCancellationCheck per la cancellazione a livello di riga
Il percorso incrementale accetta pitture di immagini JPEG DeviceRGB o DeviceGray a bersaglio completo con opacità predefinita e senza mask, transfer function, halftone, overprint o stato di transparency group; tutte le altre pitture usano il decoder a immagine completa per preservare la semantica del rendering
Disattivare l'opzione, richiedere l'isolamento del codec, superare un limite o incontrare input malformato seleziona anch'esso il percorso a immagine completa senza esporre una decodifica parziale fallita
Callback di avanzamento
THPDFProgressiveRenderProgressEvent gira dopo ogni operatore completato e riceve i conteggi di elaborati e totali più il tempo trascorso di esecuzione del rendering
Impostare a true il parametro Cancel della callback per chiudere quella sessione in prsCancelled senza cancellare il token condiviso
Un Form XObject, un pattern, un decoding di immagine o altra operazione annidata appartiene al suo operatore di primo livello che la contiene e può superare un piccolo budget di tempo prima che il controllo torni
Cancellazione a livello di operazione
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 è thread-safe, one-shot e di proprietà del chiamante; Cancel richiede permanentemente la cancellazione e IsCancellationRequested espone lo stato
ThrowIfCancellationRequested solleva EHPDFOperationCancelled e conserva il nome dell'operazione in OperationName
THotPDF.OperationCancellationToken si applica a load, rendering sincrono, rendering progressivo senza token esplicito, OptimizeLoadedStreams, CreatePreflightReport e ValidatePDFVT
SignPDFWithPFX e SignPDFWithSystemCertificate offrono overload che accettano un token direttamente
Proprietà e regole sui risultati parziali
- Il documento e il token devono sopravvivere a ogni
THPDFLoadedPageRenderSessionche li riferisce - A un load cancellato può seguire un load nuovo sulla stessa istanza del documento
- L'ottimizzazione degli stream è cooperativa e non transazionale, quindi gli stream completati prima della cancellazione restano ottimizzati
- Una destinazione di firma cancellata può contenere output parziale e andrebbe scartata quando serve una consegna atomica
- Una chiamata a un provider di chiavi private Windows non può essere interrotta in sicurezza, quindi la cancellazione viene osservata immediatamente prima e dopo quella chiamata