Gestionnaires de documents facultatifs
THPDFDocumentHandlerRegistry sélectionne des gestionnaires remplaçables selon le contenu inspecté avant les faibles indications de l’extension ou MIME, puis convertit la source choisie en un cache PDF immuable partagé par l’exportation et le rendu
Gestionnaires facultatifs intégrés
- XPS et OpenXPS retiennent les dimensions de pages fixes et l’ordre visuel, convertissent la géométrie
Pathabrégée auto-fermée ou porteuse de propriétés en vecteurs PDF natifs, préservent les pinceaux pleins d’attributs et d’éléments de propriété, les motifs de shading multi-arrêtsLinearGradientBrushetRadialGradientBrushelliptiques, et remplissent les chemins via des ressourcesImageBrushde paquets JPEG, PNG, TIFF ou JPEG XR avecTileMode=None - Les remplissages d’images XPS prennent en charge le mapping
ViewboxetViewportabsolu ouRelativeToBoundingBox, les modes de tuilesNone,Tile,FlipX,FlipYetFlipXY, le rognage natif de chemins et de placements, les attributsTransformfinis à six paramètres ou les élémentsMatrixTransformdeImageBrush.Transform, l’opacité des pinceaux et chemins, l’alpha de soft-mask PNG, le DPI des images et la mise en cache des ressources de paquets - XPS
Path.OpacityMaskprend en charge les masques pleins, dégradés linéaires multi-arrêts ou radiaux elliptiques, etImageBrushPNG, y compris les cellules d’images répétées et réfléchies ; l’alpha uniforme est replié dans les états graphiques existants tandis que l’alpha variable utilise des groupes de transparence DeviceGray natifs bornés qui partagent les motifs de shading et les flux de soft-mask d’images - XPS Canvas
OpacityetCanvas.OpacityMaskcomposent les descendants qui se chevauchent une seule fois via des Form XObjects DeviceRGB isolés au lieu d’atténuer chaque enfant indépendamment ; l’alpha uniforme du masque est replié dans l’état du groupe, l’alpha variable de dégradé ou d’image PNG réutilise les ressources natives de soft-mask, et les groupes imbriqués retiennent les rognages transformés, la possession des ressources et des annotations de lien bornées dans des limites de 4 096 groupes et 16 Mio de contenu capturé par groupe - XPS
VisualBrushconvertit récursivement les visuelsCanvas,PathetGlyphsen ligne ou adossés aux ressources, résout les portéesResourceDictionaryimbriquées et distantes, mappe unViewboxabsolu vers unViewportabsolu ou relatif, et réutilise un seul Form XObject PDF borné à travers les placements directs, tuilés et réfléchis - XPS
Canvas.Clipaccepte une géométrie abrégée bornée, des valeursPathGeometryStaticResourcelocales ou distantes, et des éléments de propriété directs avec figures structurées de lignes, Bézier, quadratiques ou arcs, transformations de géométrie, géométrie vide et règles de remplissageEvenOddouNonZero; les rognages imbriqués deviennent des chemins natifs PDFW*ouW, les rectangles de navigation sont intersectés avec les bornes de rognage transformées actives, l’analyse est plafonnée à 100 000 valeurs numériques, et les rognages malformés ou singuliers échouent de façon fermée avant que les visuels enfants ne soient peints - XPS
Glyphsaccepte au plus 65 536 mappingsIndicesstricts, retient la progression d’amas un-vers-plusieurs et plusieurs-vers-un, les avances explicites en centièmes d’em, les offsets horizontaux et verticaux, la progression inversée desBidiLevelimpairs, les remplissages pleins d’attributs ou d’éléments de propriété, l’opacité, l’extraction Unicode et des diagnostics à échec fermé des entrées malformées ; les séquences simples utilisent des tableauxTJPDF natifs et les grands tampons de mapping croissent avec un coût linéaire amorti - Les ressources de paquets
FontUriprennent en charge les programmes TrueType et OpenType, les fragments de membres TTC et les polices XPS obfusquées par GUID ; les IDs de glyphes exacts, séquences dérivées du cmap, amas, avances, offsets, origines RTL, réutilisation de ressources de polices, permissions d’embarquement, sous-ensemblage optionnel et maps d’extractionToUnicoderestent des données de polices PDF natives sans substitution GDI - XPS
FixedPage.NavigateUrisur des visuelsPathetGlyphstransformés devient une annotation de lien PDF native avec des bornes dérivées de la géométrie ou des métriques ; les liens HTTP, HTTPS et mail restent des actions URI, tandis que les pages relatives au paquet et les fragmentsLinkTargetdécodés en pourcentage deviennent des actions GoTo avant ou arrière une fois toutes les pages disponibles - Un
FixedPage.NavigateUride Canvas devient la cible héritée de chaque visuel descendantPath,Glyphsou Canvas imbriqué jusqu’à ce qu’un descendant fournisse son propre URI ; les cibles à portée se restaurent après les dérogations imbriquées, suivent la géométrie et la transformation de chaque visuel, restent contraintes par les rognages Canvas actifs, survivent à la capture de groupes d’opacité isolés, et restent supprimées dans les Forms réutilisablesVisualBrush - La navigation est plafonnée à 65 536 liens avec 8 192 caractères par URI, vérifiée contre l’annulation pendant la publication, supprimée pendant la capture des
VisualBrushréutilisables, et rejetée en cas de caractères de contrôle, de schémas dangereux, de cibles manquantes ou d’incohérences de chemin et de fragment - Les
RelativeTransformnon standard, ressources de matrices non résolues, étalement de dégradés Repeat ou Reflect, interpolation non sRGB, pinceaux à alpha variable, conversion de couleurs, traits d’image, viewboxes relatifs deVisualBrush, simulation de styles, glyphes latéraux et propriétés de trait avancées restent des diagnostics explicites - EPUB résout
container.xml, le manifeste et l’ordre du spine, puis utilise l’importateur de média paginé HTML5 borné avec des ressources de paquet fournies uniquement par rappel - CBZ reconnaît les entrées d’image prises en charge, applique un ordre naturel déterministe des noms de fichiers et crée une page par image à la résolution configurée
Budgets et isolement des échecs
Une analyse validée du répertoire central ZIP applique avant la conversion les limites d’entrées, d’octets compressés et décompressés, par entrée, de chiffrement, de chemins dupliqués ou dangereux et de taux de compression
Les entrées ZipCrypto PKZIP classiques peuvent demander des identifiants via ArchivePasswordCallback ; le callback reçoit le nom de la source, le nom de l’entrée et le numéro de tentative en base 1, tandis que MaxPasswordAttempts borne les reprises de 1 à 16
Les identifiants et les octets d’entrées partiellement décodés restent en mémoire et sont effacés entre les tentatives, l’annulation est vérifiée avant et après chaque callback, et les callbacks manquants, les identifiants refusés, les reprises épuisées ou le chiffrement non pris en charge échouent de façon fermée
ZipCrypto est une protection par mot de passe historique plutôt qu’un chiffrement authentifié moderne, et les conventions d’octets des mots de passe non ASCII peuvent varier selon les producteurs de ZIP
Les entrées protégées par mot de passe exigent Delphi 12 ou ultérieur, dont le System.Zip expose le hook de déchiffrement ; compilés avec une version antérieure de Delphi, les handlers lisent toujours les entrées non chiffrées mais rejettent les entrées chiffrées comme non prises en charge avant l’appel de ArchivePasswordCallback
Les entrées dont les tailles ou décalages exigent des champs ZIP64 réclament Delphi 11 ou ultérieur ; les versions antérieures de Delphi les rejettent comme non prises en charge
Les limites de ressources, reformatage, pages, pixels, DPI, sortie et annulation restent actives pendant la conversion et le rendu, tandis qu’un échec de publication restaure le flux de destination positionnable
Enregistrement et utilisation
var
Registry: THPDFDocumentHandlerRegistry;
Options: THPDFDocumentHandlerOptions;
Handled: IHPDFHandledDocument;
Info: THPDFDocumentHandlerInfo;
begin
Registry:= THPDFDocumentHandlerRegistry.Create;
try
Registry.RegisterStandardHandlers;
Options:= THPDFDocumentHandlerOptions.Default;
if Registry.OpenFromFile('book.epub', '', Options, Handled, Info) then
Handled.WritePDF(OutputStream, Options, Info);
finally
Registry.Free;
end;
end;