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

API correlate