Optionale Dokumenthandler
THPDFDocumentHandlerRegistry wählt austauschbare Handler anhand des untersuchten Inhalts vor schwachen Erweiterungs- oder MIME-Hinweisen aus und wandelt die gewählte Quelle dann in einen unveränderlichen PDF-Cache um, der von Export und Wiedergabe gemeinsam genutzt wird
Integrierte optionale Handler
- XPS und OpenXPS bewahren Abmessungen fester Seiten und visuelle Reihenfolge, konvertieren selbstschließende oder eigenschaftstragende abgekürzte
Path-Geometrie zu nativen PDF-Vektoren, bewahren einfarbige Pinsel aus Attributen und Eigenschaftselementen, mehrstufigeLinearGradientBrush- und elliptischeRadialGradientBrush-Shading-Patterns und füllen Pfade über paketbasierte JPEG-, PNG-, TIFF- oder JPEG-XR-ImageBrush-Ressourcen mitTileMode=None - XPS-Bildfüllungen unterstützen absolute oder auf
RelativeToBoundingBoxbezogeneViewbox- undViewport-Zuordnung, die KachelmodiNone,Tile,FlipX,FlipYundFlipXY, natives Pfad- und Platzierungs-Clipping, endliche sechsparametrigeTransform-Attribute oderImageBrush.Transform-MatrixTransform-Elemente, Pinsel- und Pfad-Deckkraft, PNG-Soft-Mask-Alpha, Bild-DPI sowie Paketressourcen-Caching - XPS-
Path.OpacityMaskunterstützt einfarbige, mehrstufig lineare oder elliptisch radiale Gradienten sowie PNG-ImageBrush-Masken, einschließlich wiederholter und gespiegelter Bildzellen; gleichmäßiges Alpha wird in bestehende Grafikzustände eingefaltet, während variables Alpha begrenzte native DeviceGray-Transparenzgruppen nutzt, die sich Shading-Patterns und Bild-Soft-Mask-Streams teilen - XPS-Canvas-
OpacityundCanvas.OpacityMaskkomponieren sich überlappende Nachfahren einmal über isolierte DeviceRGB-Form-XObjects, statt jedes Kind einzeln abzuschwächen; gleichmäßiges Masken-Alpha wird in den Gruppenzustand eingefaltet, variables Gradienten- oder PNG-Bild-Alpha verwendet native Soft-Mask-Ressourcen wieder, und verschachtelte Gruppen bewahren transformierte Clips, Ressourcenbesitz und begrenzte Link-Anmerkungen innerhalb der Grenzen von 4.096 Gruppen und 16 MiB erfasster Inhalte pro Gruppe - XPS-
VisualBrushkonvertiert inline oder ressourcenbasierteCanvas-,Path- undGlyphs-Visuals rekursiv, löst verschachtelte und ferneResourceDictionary-Bereiche auf, bildet eine absoluteViewboxauf einen absoluten oder relativenViewportab und verwendet ein begrenztes PDF-Form-XObject für direkte, gekachelte und gespiegelte Platzierungen wieder - XPS-
Canvas.Clipakzeptiert begrenzte abgekürzte Geometrie, lokale oder ferneStaticResource-PathGeometry-Werte und direkte Eigenschaftselemente mit strukturierten Linien-, Bézier-, quadratischen oder Bogen-Figuren, Geometrie-Transformationen, leerer Geometrie sowieEvenOdd- oderNonZero-Füllregeln; verschachtelte Clips werden zu nativen PDF-W*- oderW-Pfaden, Navigationsrechtecke werden mit aktiven transformierten Clip-Grenzen geschnitten, das Parsen ist auf 100.000 Zahlenwerte begrenzt, und fehlerhafte oder singuläre Clips schlagen geschlossen fehl, bevor Kind-Visuals gezeichnet werden - XPS-
Glyphsakzeptiert höchstens 65.536 strengeIndices-Zuordnungen, behält Eins-zu-vielen- und Viele-zu-eins-Cluster-Progression, explizite Vorschübe in Hundertstel-em, horizontale und vertikale Versätze, umgekehrte Progression bei ungerademBidiLevel, einfarbige Attribut- oder Eigenschaftselement-Füllungen, Deckkraft, Unicode-Extraktion und fail-closed-Diagnostik für fehlerhafte Eingaben; einfache Runs verwenden native PDF-TJ-Arrays, und große Zuordnungspuffer wachsen mit amortisiert linearen Kosten - Paket-
FontUri-Ressourcen unterstützen TrueType- und OpenType-Programme, TTC-Member-Fragmente und GUID-verschleierte XPS-Fonts; exakte Glyphen-IDs, aus der cmap abgeleitete Runs, Cluster, Vorschübe, Versätze, RTL-Ursprünge, Font-Ressourcen-Wiederverwendung, Einbettungsberechtigungen, optionales Subsetting undToUnicode-Extraktions-Maps bleiben native PDF-Fontdaten ohne GDI-Ersatz - XPS-
FixedPage.NavigateUriauf transformiertenPath- undGlyphs-Visuals wird zu einer nativen PDF-Link-Anmerkung mit aus Geometrie oder Metriken abgeleiteten Grenzen; HTTP-, HTTPS- und Mail-Links bleiben URI-Aktionen, während paketrelative Seiten und percent-dekodierteLinkTarget-Fragmente zu vorwärts- oder rückwärtsgerichteten GoTo-Aktionen werden, sobald jede Seite verfügbar ist - Ein Canvas-
FixedPage.NavigateUriwird das geerbte Ziel jedesPath-,Glyphs- oder verschachtelten Canvas-Visuals der Nachfahren, bis ein Nachfahre eine eigene URI liefert; bereichsbezogene Ziele werden nach verschachtelten Überschreibungen wiederhergestellt, folgen der Geometrie und Transformation jedes Visuals, bleiben durch aktive Canvas-Clips eingeschränkt, überleben die Erfassung in isolierten Deckkraftgruppen und bleiben innerhalb wiederverwendbarerVisualBrush-Forms unterdrückt - Die Navigation ist auf 65.536 Links mit 8.192 Zeichen pro URI begrenzt, wird während der Veröffentlichung auf Abbruch geprüft, bei der Erfassung wiederverwendbarer
VisualBrush-Inhalte unterdrückt und bei Steuerzeichen, unsicheren Schemata, fehlenden Zielen oder Pfad- und Fragment-Mismatch zurückgewiesen - Nicht standardmäßige
RelativeTransform, unaufgelöste Matrix-Ressourcen, Repeat- oder Reflect-Gradientausbreitung, Nicht-sRGB-Interpolation, Farbpinsel mit variablem Alpha, Farbumwandlung, Bildstriche, relativeVisualBrush-Viewboxes, Stilsimulation, seitlich gedrehte Glyphen und erweiterte Stricheigenschaften bleiben explizite Diagnosen - EPUB löst
container.xml, Manifest und Rückgrat-Reihenfolge auf und verwendet dann den begrenzten HTML5-Importer für Seitenmedien mit Paketressourcen ausschließlich über Callbacks - CBZ erkennt unterstützte Bildeinträge, wendet eine deterministische natürliche Dateinamenreihenfolge an und erzeugt eine Seite pro Bild mit der konfigurierten Bild-DPI
Budgets und Fehlerisolierung
Ein validierter ZIP-Central-Directory-Scan setzt vor der Konvertierung Grenzen für Einträge, komprimierte Bytes, entpackte Bytes, Werte pro Eintrag, doppelte Pfade, unsichere Pfade und das Kompressionsverhältnis durch
Klassische PKZIP-ZipCrypto-Einträge können Zugangsdaten über ArchivePasswordCallback anfordern; der Callback erhält Quellname, Eintragsnamen und die Ein-basierte Versuchsnummer, während MaxPasswordAttempts Wiederholungen auf 1 bis 16 begrenzt
Zugangsdaten und teilweise dekodierte Eintragsbytes bleiben im Speicher und werden zwischen Versuchen gelöscht, Abbruch wird vor und nach jedem Callback geprüft, und fehlende Callbacks, abgelehnte Zugangsdaten, erschöpfte Wiederholungen oder nicht unterstützte Verschlüsselung schlagen geschlossen fehl
ZipCrypto ist ein legacy-Passwortschutz und keine moderne authentifizierte Verschlüsselung, und die Byte-Konventionen für Nicht-ASCII-Passwörter können je ZIP-Produzent variieren
Passwortgeschützte Einträge benötigen Delphi 12 oder neuer, dessen System.Zip den Entschlüsselungs-Hook bereitstellt; gebaut mit einer älteren Delphi-Version lesen die Handler weiterhin unverschlüsselte Einträge, weisen verschlüsselte aber als nicht unterstützt zurück, bevor ArchivePasswordCallback aufgerufen wird
Einträge, deren Größen oder Offsets ZIP64-Felder benötigen, erfordern Delphi 11 oder neuer; ältere Delphi-Versionen weisen sie als nicht unterstützt zurück
Grenzen für Ressourcen, Reflow, Seiten, Pixel, DPI, Ausgabe und Abbruch bleiben während der gesamten Konvertierung und Wiedergabe aktiv, und eine fehlgeschlagene Ausgabeveröffentlichung stellt einen seekbaren Ziel-Stream wieder her
Registrierung und Verwendung
var
Registry: THPDFDocumentHandlerRegistry;
Options: THPDFDocumentHandlerOptions;
Handled: IHPDFHandledDocument;
Info: THPDFDocumentHandlerInfo;
begin
Registry:= THPDFDocumentHandlerRegistry.Create;
try
Registry.RegisterStandardHandlers;
Options:= THPDFDocumentHandlerOptions.Default;
Options.ArchivePasswordCallback:= SupplyArchivePassword;
if Registry.OpenFromFile('book.epub', '', Options, Handled, Info) then
Handled.WritePDF(OutputStream, Options, Info);
finally
Registry.Free;
end;
end;