Progressive Darstellung und Abbruch
HotPDF kann eine geladene Seite über mehrere begrenzte Aufrufe darstellen und lang laufende Dokumentoperationen über ein gemeinsam genutztes, aufruferbesitzenes Abbruchtoken stoppen
Progressive Seitendarstellung
Für linearisierte Netzquellen trennt THPDFLinearizedPageRedrawScheduler die First-Paint-Bereiche von optionalen gemeinsamen Objektabhängigkeiten und fordert erst dann ein Neurendern an, wenn eine neu eingetroffene Abhängigkeit die Seite ändern kann
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 akzeptiert eine maximale verstrichene Zeit in Millisekunden, eine maximale Anzahl von Operatoren des Seiteninhalts auf oberster Ebene oder beides; Null bedeutet unbegrenzt für dieses Budget
Der Aufruf führt vor der Anwendung eines Zeitbudgets ungleich Null mindestens einen Operator aus, sodass der Grafikzustand immer an einer Operatorgrenze pausiert wird
Bitmap macht die live aufrufer-schreibgeschützte Teilbitmap zugänglich, während TakeBitmap das Eigentum überträgt, ohne zu kopieren, sobald die Sitzung prsCompleted oder prsCancelled erreicht
ObjectsProcessed und TotalObjects melden Inhaltsoperatoren der obersten Ebene aus jedem Seiten-/Contents-Stream in Quellreihenfolge
Progressive Bereichsdarstellung
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;
Die vier Bereichskoordinaten sind PDF-Benutzerraumpunkte mit einem Ursprung unten links, und die Ausgabebitmap deckt genau dieses Fenster mit der angeforderten DPI ab
Die Sitzung verwendet die gecachte Display-Liste erneut, behält Grafik- und Textzustand über Aufrufe hinweg bei und unterdrückt teure Pfad-, Text-, Bild-, Form- und Schattierungsausgaben, deren konservative Begrenzungen den ROI nicht schneiden
Zustandsoperatoren und Textfortschritt werden weiterhin in Quellreihenfolge ausgeführt, sodass das Entfernen einer früheren Markierung eine später sichtbare Markierung weder verschieben noch umfärben kann
RegionVisiblePaintObjects und RegionCulledPaintObjects machen die Auswahl der Display-Liste zugänglich, während die Spitzen-Speicherreservierung den Bereichsabmessungen statt der gesamten Seite folgt
Progressive JPEG-Scans
Wenn THotPDF.ProgressiveJPEGScanDecoding wahr ist, schreitet ein geeignetes progressives DCTDecode-Bild pro begrenztem ContinueRender-Aufruf um einen JPEG-Scan voran, sodass die Live-Bitmap vor dem letzten Scan eine frühe grobe Vorschau zeigen kann
THotPDF.ProgressiveJPEGMaxScans begrenzt jedes Bild auf zwischen 1 und 4096 Scans, während das Dekodier-Byte-Budget des Dokuments auch die ausgerichtete Ausgabebitmap abdeckt
THPDFLoadedPageRenderSession.ProgressiveJPEGScansDecoded und THPDFLoadedPageRenderSession.ProgressiveJPEGImagesDecoded melden abgeschlossene Scan- und Bildzahlen; THPDFLoadedPageRenderSession.OnProgressiveJPEGScan empfängt nach jedem sichtbaren Scan ein THPDFProgressiveJPEGScanEvent und kann die Sitzung abbrechen
Die Unit HPDFJpeg macht außerdem THPDFJpegScanDecoder für rohe THPDFJpegByteArray-Eingaben zugänglich, mit THPDFJpegScanDecodeStatus-Ergebnissen und einem optionalen THPDFJpegCancellationCheck-Callback für den Abbruch auf Zeilenebene
Der inkrementelle Pfad akzeptiert Vollziel-DeviceRGB- oder DeviceGray-JPEG-Bildausgaben mit Standarddeckkraft und ohne Masken, Transferfunktionen, Halftones, Überdrucken oder Transparenzgruppen-Zustand; alle anderen Ausgaben verwenden den Dekoder für vollständige Bilder, um die Darstellungssemantik zu erhalten
Das Deaktivieren der Option, das Erfordernis von Codec-Isolation, das Überschreiten eines Grenzwerts oder das Auftreten fehlerhafter Eingaben wählt ebenfalls den Pfad für vollständige Bilder, ohne eine partielle fehlgeschlagene Dekodierung offenzulegen
Fortschritts-Callbacks
THPDFProgressiveRenderProgressEvent läuft nach jedem abgeschlossenen Operator und empfängt verarbeitete und gesamte Zähler sowie die verstrichene Render-Ausführungszeit
Setzen Sie den Cancel-Parameter des Callbacks auf wahr, um diese Sitzung in prsCancelled zu beenden, ohne das gemeinsame Token abzubrechen
Ein Form-XObject, Muster, eine Bilddekodierung oder andere verschachtelte Operation gehören zu ihrem umschließenden Operator der obersten Ebene und können ein kleines Zeitbudget überschreiten, bevor die Kontrolle zurückkehrt
Operationweiter Abbruch
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 ist threadsicher, einmalig und vom Aufrufer besessen; Cancel fordert permanent einen Abbruch an und IsCancellationRequested macht den Zustand zugänglich
ThrowIfCancellationRequested wirft EHPDFOperationCancelled und bewahrt den Operationsnamen in OperationName auf
THotPDF.OperationCancellationToken gilt für Laden, synchrones Rendern, progressives Rendern ohne explizites Token, OptimizeLoadedStreams, CreatePreflightReport und ValidatePDFVT
SignPDFWithPFX und SignPDFWithSystemCertificate bieten Überladungen, die ein Token direkt akzeptieren
Regeln für Eigentum und Teilergebnisse
- Das Dokument und das Token müssen jede
THPDFLoadedPageRenderSession, die auf sie verweist, überleben - Einem abgebrochenem Laden kann ein neues Laden auf derselben Dokumentinstanz folgen
- Die Stream-Optimierung ist kooperativ statt transaktional, sodass vor dem Abbruch abgeschlossene Streams optimiert bleiben
- Ein abgebrochenes Signierziel kann partielle Ausgabe enthalten und sollte verworfen werden, wenn eine atomare Zustellung erforderlich ist
- Ein Aufruf eines Windows-Private-Key-Providers kann nicht sicher unterbrochen werden, sodass der Abbruch unmittelbar vor und nach diesem Aufruf beobachtet wird