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

Zugehörige APIs