Rendu progressif et annulation

HotPDF peut rendre une page chargée sur plusieurs appels bornés et peut arrêter des opérations de document de longue durée via un jeton d'annulation partagé appartenant à l'appelant

Rendu de page progressif

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 accepte un temps écoulé maximal en millisecondes, un nombre maximal d'opérateurs de contenu de page de niveau supérieur, ou les deux ; zéro signifie illimité pour ce budget

L'appel termine au moins un opérateur avant d'appliquer un budget de temps non nul, de sorte que l'état graphique est toujours suspendu à une frontière d'opérateur

Bitmap expose le bitmap partiel vivant en lecture seule pour l'appelant, tandis que TakeBitmap transfère la propriété sans copie après que la session atteint prsCompleted ou prsCancelled

ObjectsProcessed et TotalObjects signalent les opérateurs de contenu de niveau supérieur de chaque flux /Contents de page dans l'ordre de source

Rendu de région progressif

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;

Les quatre coordonnées de région sont des points d'espace utilisateur PDF avec une origine en bas à gauche et le bitmap de sortie couvre exactement cette fenêtre à la DPI demandée

La session réutilise la liste d'affichage en cache, conserve l'état graphique et de texte entre les appels et supprime les peintures coûteuses de chemins, textes, images, Forms et fondus dont les limites prudentes ne croisent pas le ROI

Les opérateurs d'état et l'avancement du texte s'exécutent toujours dans l'ordre de source, de sorte que l'élimination d'une marque antérieure ne peut pas déplacer ni recolorer une marque visible ultérieure

RegionVisiblePaintObjects et RegionCulledPaintObjects exposent la sélection de la liste d'affichage, tandis que la réservation de mémoire de pointe suit les dimensions de la région au lieu de la page complète

Analyses JPEG progressives

Lorsque THotPDF.ProgressiveJPEGScanDecoding est vrai, une image DCTDecode progressive éligible avance d'une analyse JPEG par appel ContinueRender borné afin que le bitmap vivant puisse montrer un aperçu grossier précoce avant l'analyse finale

THotPDF.ProgressiveJPEGMaxScans limite chaque image entre 1 et 4096 analyses, tandis que le budget d'octets de décodage du document couvre également le bitmap de sortie aligné

THPDFLoadedPageRenderSession.ProgressiveJPEGScansDecoded et THPDFLoadedPageRenderSession.ProgressiveJPEGImagesDecoded signalent les décomptes d'analyses et d'images terminés ; THPDFLoadedPageRenderSession.OnProgressiveJPEGScan reçoit un THPDFProgressiveJPEGScanEvent après chaque analyse visible et peut annuler la session

L'unité HPDFJpeg expose également THPDFJpegScanDecoder pour les entrées brutes THPDFJpegByteArray, avec des résultats THPDFJpegScanDecodeStatus et un rappel facultatif THPDFJpegCancellationCheck pour l'annulation au niveau des lignes

Le chemin incrémental accepte les peintures d'images JPEG DeviceRGB ou DeviceGray à cible complète avec une opacité par défaut et sans masques, fonctions de transfert, trames, surimpression ni état de groupe de transparence ; toutes les autres peintures utilisent le décodeur d'images complètes pour préserver la sémantique de rendu

Désactiver l'option, exiger l'isolation de codec, dépasser une limite ou rencontrer une entrée malformée sélectionne également le chemin d'images complètes sans exposer un décodage partiel en échec

Rappels de progression

THPDFProgressiveRenderProgressEvent s'exécute après chaque opérateur terminé et reçoit les décomptes traités et totaux plus le temps d'exécution de rendu écoulé

Définissez le paramètre Cancel du rappel sur true pour terminer cette session dans prsCancelled sans annuler le jeton partagé

Un Form XObject, un motif, un décodage d'image ou une autre opération imbriquée appartient à son opérateur de niveau supérieur englobant et peut dépasser un petit budget de temps avant que le contrôle ne retourne

Annulation à l'échelle de l'opération

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 est thread-safe, à usage unique et appartient à l'appelant ; Cancel demande une annulation permanente et IsCancellationRequested expose l'état

ThrowIfCancellationRequested déclenche EHPDFOperationCancelled et préserve le nom de l'opération dans OperationName

THotPDF.OperationCancellationToken s'applique au chargement, au rendu synchrone, au rendu progressif sans jeton explicite, à OptimizeLoadedStreams, à CreatePreflightReport et à ValidatePDFVT

SignPDFWithPFX et SignPDFWithSystemCertificate fournissent des surcharges qui acceptent un jeton directement

Propriété et règles de résultats partiels

API associées