Manejadores de documentos opcionales
THPDFDocumentHandlerRegistry selecciona manejadores reemplazables por contenido inspeccionado antes que por pistas débiles de extensión o MIME, y luego convierte el origen seleccionado en una caché PDF inmutable compartida por la exportación y el renderizado
Manejadores opcionales integrados
- XPS y OpenXPS conservan las dimensiones fijas de página y el orden visual, convierten la geometría
Pathabreviada (auto-cerrada o con propiedades) en vectores PDF nativos, preservan pinceles sólidos de atributos y property-elements, patrones de sombreadoLinearGradientBrushmulti-stop yRadialGradientBrushelíptico, y rellenan trazados mediante recursosImageBrushJPEG, PNG, TIFF o JPEG XR del paquete conTileMode=None - Los rellenos de imagen XPS admiten mapeado
ViewboxyViewportabsoluto oRelativeToBoundingBox, modos de tileNone,Tile,FlipX,FlipYyFlipXY, clipping nativo de trazado y colocación, atributosTransformfinitos de seis parámetros o elementosMatrixTransformdeImageBrush.Transform, opacidad de pincel y trazado, alfa soft-mask PNG, DPI de imagen y caché de recursos del paquete - El
Path.OpacityMaskde XPS admite máscaras sólidas, de degradado radial lineal o elíptico multi-stop y deImageBrushPNG, incluidas celdas de imagen repetidas y reflejadas; el alfa uniforme se pliega en los estados de gráficos existentes mientras que el alfa variable usa grupos de transparencia DeviceGray nativos acotados que comparten patrones de sombreado y streams de soft-mask de imagen - El
Opacityde Canvas XPS y elCanvas.OpacityMaskcomponen una sola vez los descendientes superpuestos mediante Form XObjects DeviceRGB aislados en lugar de atenuar cada hijo por separado; el alfa uniforme de máscara se pliega en el estado del grupo, el alfa variable de degradado o imagen PNG reutiliza recursos soft-mask nativos, y los grupos anidados conservan clips transformados, propiedad de recursos y anotaciones de enlace acotadas dentro de los límites de 4.096 grupos y 16 MiB de contenido capturado por grupo - El
VisualBrushde XPS convierte recursivamente elementos visualesCanvas,PathyGlyphsen línea o respaldados por recursos, resuelve ámbitosResourceDictionaryanidados y remotos, mapea unViewboxabsoluto a unViewportabsoluto o relativo, y reutiliza un único Form XObject PDF acotado entre colocaciones directas, en mosaico y reflejadas - El
Canvas.Clipde XPS acepta geometría abreviada acotada, valoresPathGeometrydeStaticResourcelocales o remotos, y property elements directos con figuras estructuradas de línea, Bézier, cuadráticas o arcos, transformadas de geometría, geometría vacía y reglas de rellenoEvenOddoNonZero; los clips anidados se convierten en trazados PDF nativosW*oW, los rectángulos de navegación se intersectan con los límites 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 visuales 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, avances 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 a prueba de fallos para entradas malformadas; los runs simples usan arrays PDF nativosTJy los búferes grandes de mapeo crecen con coste lineal amortizado - Los recursos
FontUridel paquete soportan programas TrueType y OpenType, fragmentos de miembros TTC y fuentes ofuscadas con GUID de XPS; los ID de glifos exactos, los runs derivados del cmap, los clusters, los avances, los offsets, los orígenes RTL, la reutilización de recursos de fuente, los permisos de incrustación, el subsetting opcional y los mapas de extracciónToUnicodepermanecen como datos de fuente PDF nativos sin sustitución GDI - El
FixedPage.NavigateUride XPS sobre visualesPathyGlyphstransformados se convierte en una anotación de enlace PDF nativa con límites derivados de la geometría o de las métricas; los enlaces HTTP, HTTPS y de correo siguen siendo acciones URI, mientras que las páginas relativas al paquete y los fragmentosLinkTargetdecodificados por porcentaje se convierten en acciones GoTo hacia delante o hacia atrás una vez disponibles todas las páginas - Un
FixedPage.NavigateUride Canvas se convierte en el destino heredado de cada visualPath,Glyphso Canvas anidado hasta que un descendiente aporta su propio URI; los destinos con ámbito se restauran tras las anulaciones anidadas, siguen la geometría y transformada de cada visual, permanecen limitados por los clips de Canvas activos, sobreviven a la captura de grupos de opacidad aislados y quedan suprimidos dentro de los FormsVisualBrushreutilizables - La navegación está limitada a 65.536 enlaces con 8.192 caracteres por URI, se comprueba contra la cancelación mientras se publica, se suprime durante la captura de
VisualBrushreutilizables, y se rechaza por caracteres de control, esquemas inseguros, destinos ausentes o discrepancias de ruta y fragmento - El
RelativeTransformno estándar, los recursos de matriz sin resolver, el spread de degradado Repeat o Reflect, la interpolación no sRGB, los pinceles de pintura con alfa variable, la conversión de color, los trazos de imagen, los viewboxesVisualBrushrelativos, la simulación de estilos, los glifos en sideways y las propiedades de trazo avanzadas quedan como diagnósticos explícitos - EPUB resuelve
container.xml, el manifiesto y el orden del spine, y después usa el importador de medios paginados HTML5 acotado con recursos del paquete solo mediante callbacks - CBZ reconoce las entradas de imagen soportadas, aplica un orden natural de nombres de archivo determinista y crea una página por imagen al DPI de imagen configurado
Presupuestos y aislamiento de fallos
Un único escaneo validado del directorio central ZIP hace cumplir los límites de entradas, bytes comprimidos, bytes expandidos, por entrada, rutas duplicadas, rutas no seguras y relación 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 origen, el nombre de la entrada y el número de intento base 1, mientras que MaxPasswordAttempts acota los reintentos de 1 a 16
Las credenciales y los bytes de entradas parcialmente decodificadas 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 el cifrado no soportado fallan de forma cerrada
ZipCrypto es protección por contraseña heredada en lugar de cifrado autenticado moderno, y las convenciones de bytes de contraseñas no ASCII pueden variar entre productores de ZIP
Las entradas protegidas por contraseña requieren Delphi 12 o posterior, cuyo System.Zip expone el hook de descifrado; compilados con una versión anterior de Delphi, los handlers siguen leyendo las entradas sin cifrar pero rechazan las cifradas como no compatibles antes de llamar 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 compatibles
Los límites de recursos, reflow, página, píxel, DPI, salida y cancelación permanecen activos durante toda la conversión y el renderizado, mientras que una publicación de salida fallida restaura el stream de destino desplazable
Registro y uso
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;