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
- Le document et le jeton doivent survivre à chaque
THPDFLoadedPageRenderSessionqui s'y réfère - Un chargement annulé peut être suivi d'un nouveau chargement sur la même instance de document
- L'optimisation de flux est coopérative plutôt que transactionnelle, de sorte que les flux terminés avant l'annulation restent optimisés
- Une destination de signature annulée peut contenir une sortie partielle et doit être écartée lorsqu'une livraison atomique est exigée
- Un appel de fournisseur de clé privée Windows ne peut pas être interrompu en toute sécurité, de sorte que l'annulation est observée immédiatement avant et après cet appel