Document Handlers opcionales
THPDFDocumentHandlerRegistry selecciona handlers reemplazables por el contenido inspeccionado antes que las pistas débiles de extensión o MIME, y luego convierte el source elegido en una única caché PDF inmutable compartida por exportación y render
Handlers opcionales integrados
- XPS y OpenXPS conservan las dimensiones de página fijas y el orden visual, convierten geometría
Pathabreviada self-closing o con propiedades a vectores PDF nativos, preservan solid brushes de atributos y property-elements, shading patternsLinearGradientBrushde multi-stop yRadialGradientBrushelípticos, y rellenan paths a través de recursosImageBrushJPEG, PNG, TIFF o JPEG XR del paquete conTileMode=None - Los image fills de XPS soportan mapeo
ViewboxyViewportabsoluto oRelativeToBoundingBox, modos de tileNone,Tile,FlipX,FlipYyFlipXY, clipping nativo de paths y de colocaciones, atributosTransformfinitos de seis parámetros o elementosMatrixTransformdeImageBrush.Transform, opacidad de brush y path, alpha de soft-mask PNG, DPI de imagen y caching de recursos del paquete - El
Path.OpacityMaskde XPS soporta máscaras sólidas, de gradiente linear multi-stop o radial elíptico, y deImageBrushPNG, incluidas celdas de imagen repetidas y reflejadas; el alpha uniforme se pliega en los graphics states existentes mientras que el alpha variable usa grupos de transparencia DeviceGray nativos acotados que comparten shading patterns y streams de soft-mask de imagen - El
Opacityde Canvas y elCanvas.OpacityMaskde XPS componen los descendientes solapados una sola vez mediante Form XObjects DeviceRGB aislados, en lugar de atenuar cada hijo de forma independiente; el alpha uniforme de la máscara se pliega en el estado del grupo, el alpha variable de gradiente o de imagen PNG reutiliza recursos soft-mask nativos, y los grupos anidados conservan clips transformados, propiedad de recursos y link annotations acotadas dentro de límites de 4,096 grupos y 16 MiB de contenido capturado por grupo - El
VisualBrushde XPS convierte recursivamente visualsCanvas,PathyGlyphsinline o respaldados por recursos, resuelve scopes deResourceDictionaryanidados y remotos, mapea unaViewboxabsoluta a unViewportabsoluto o relativo, y reutiliza un único Form XObject PDF acotado entre colocaciones directas, con tile y reflejadas - El
Canvas.Clipde XPS acepta geometría abreviada acotada, valoresPathGeometrydeStaticResourcelocales o remotos, y property elements directos con figures estructuradas de línea, Bézier, cuadráticas o de arco, transforms de geometría, geometría vacía y fill rulesEvenOddoNonZero; los clips anidados se vuelven paths PDF nativosW*oW, los rectángulos de navegación se intersectan con los bounds de clip transformados activos, el parseo se limita a 100,000 valores numéricos, y los clips malformados o singulares fallan de forma cerrada antes de pintar los visuals hijos - El
Glyphsde XPS acepta como máximo 65,536 mapeos estrictos deIndices, conserva la progresión de clusters uno-a-muchos y muchos-a-uno, advances explícitos en centésimas de em, offsets horizontales y verticales, progresión inversa deBidiLevelimpar, rellenos sólidos de atributos o property-elements, opacidad, extracción Unicode y diagnósticos fail-closed de entrada malformada; los runs simples usan arrays PDF nativosTJy los buffers de mapeo grandes crecen con costo linear amortizado - Los recursos
FontUridel paquete soportan programas TrueType y OpenType, fragmentos de miembros TTC y fuentes ofuscadas con GUID de XPS; los glyph IDs exactos, los runs derivados del cmap, los clusters, advances, offsets, orígenes RTL, la reutilización de font-resources, los permisos de embedding, el subsetting opcional y los mapas de extracciónToUnicodepermanecen como datos de fuente PDF nativos sin sustitución GDI - El
FixedPage.NavigateUride XPS en visualsPathyGlyphstransformados se convierte en una link annotation PDF nativa con bounds derivados de la geometría o de las métricas; los links HTTP, HTTPS y de correo permanecen como acciones URI, mientras que las páginas relativas al paquete y los fragmentosLinkTargetcon percent-decoding se convierten en acciones GoTo hacia adelante o hacia atrás después de que todas las páginas estén disponibles - El
FixedPage.NavigateUride un Canvas se convierte en el target heredado de cada visual descendientePath,Glyphso Canvas anidado hasta que un descendiente aporta su propio URI; los targets con scope se restauran después de overrides anidados, siguen la geometría y el transform de cada visual, permanecen limitados por los clips de Canvas activos, sobreviven a la captura aislada de grupos de opacidad y quedan suprimidos dentro de FormsVisualBrushreutilizables - La navegación se limita a 65,536 links con 8,192 caracteres por URI, se comprueba la cancelación durante la publicación, se suprime durante la captura de
VisualBrushreutilizables, y se rechaza ante caracteres de control, esquemas inseguros, targets ausentes o mismatches de ruta y fragmento - El
RelativeTransformno estándar, los recursos de matriz sin resolver, el spread de gradiente Repeat o Reflect, la interpolación no sRGB, los paint brushes de alpha variable, la conversión de color, los strokes de imagen, los viewboxes relativos deVisualBrush, la simulación de estilos, los glyphs laterales y las propiedades de stroke avanzadas permanecen como diagnósticos explícitos - EPUB resuelve el orden de
container.xml, manifest y spine, y luego usa el importador HTML5 paged-media acotado con recursos del paquete solo por callback - CBZ reconoce las entradas de imagen soportadas, aplica el orden natural determinista de nombres de archivo y crea una página por imagen al DPI de imagen configurado
Presupuestos y aislamiento de fallos
Un único escaneo validado del central-directory ZIP aplica los límites de entradas, bytes comprimidos, bytes expandidos, por entrada, rutas duplicadas, rutas inseguras y ratio de compresión antes de la conversión
Las entradas ZipCrypto clásicas de PKZIP pueden solicitar credenciales mediante ArchivePasswordCallback; el callback recibe el nombre del source, el nombre de la entrada y el número de intento de base uno, mientras que MaxPasswordAttempts acota los reintentos de 1 a 16
Las credenciales y los bytes de entrada parcialmente decodificados permanecen en memoria y se limpian entre intentos, la cancelación se comprueba antes y después de cada callback, y los callbacks ausentes, las credenciales rechazadas, los reintentos agotados o la encriptación no soportada fallan de forma cerrada
ZipCrypto es protección por contraseña legacy, no encriptación autenticada moderna, y las convenciones de bytes de contraseñas no ASCII pueden variar entre producers de ZIP
Las entradas protegidas por contraseña requieren Delphi 12 o posterior, cuyo System.Zip expone el hook de desencriptación; compilados con una versión anterior de Delphi, los handlers siguen leyendo entradas sin encriptar pero rechazan las encriptadas como no soportadas antes de que se llame a ArchivePasswordCallback
Las entradas cuyos tamaños u offsets requieren campos ZIP64 necesitan Delphi 11 o posterior; las versiones anteriores de Delphi las rechazan como no soportadas
Los límites de recursos, reflow, páginas, píxeles, DPI, salida y cancelación permanecen activos durante toda la conversión y el render, mientras que la publicación fallida de la salida restaura un destination stream con seek
Registro y uso
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;