Importación de Form XObject SVG
THotPDF.ImportSVGFormXObject analiza el SVG una vez y registra un Form XObject de PDF reutilizable, mientras que THPDFPage.DrawSVGFormXObject lo ubica a cualquier tamaño y opcionalmente crea anotaciones de enlace en la página
Declaración
function ImportSVGFormXObject(const Input: TBytes): AnsiString; overload;
function ImportSVGFormXObject(
const Input: TBytes;
out Statistics: THPDFSVGImportStatistics
): AnsiString; overload;
procedure DrawSVGFormXObject(
const FormName: AnsiString;
X, Y, W, H: Single;
AddLinks: Boolean = True
);
Perfil vectorial
- La geometría incluye paths con arcos elípticos, rectángulos, rectángulos redondeados, círculos, elipses, líneas, polilíneas, polígonos, transforms, grupos, symbols y referencias
usesolo de fragmento - La pintura incluye colores RGB sólidos, opacidad de relleno y trazo, reglas de relleno, line caps y joins, dash arrays y offsets heredados, miter limits, bandas vectoriales de gradiente lineal y radial, trazos con gradiente respaldados por tiling patterns coloreados y clip paths
- La opacidad de objeto y grupo usa Forms de transparencia vectorial aislados, así que los descendientes superpuestos se componen antes de aplicar la opacidad que los envuelve
- Las masks se convierten en recursos Form de transparency group con soft masks PDF Alpha o Luminosity, incluidos el clipping de región de mask,
maskUnits,maskContentUnitsy referencias de mask anidadas acotadas - El CSS incluye selectores embebidos de tipo, clase, ID y compuestos, atributos de presentación, estilos inline, especificidad, orden de fuente y
!important - Las importaciones de documentos embeben subconjuntos de fuentes Unicode y mapas
ToUnicodea través del motor nativo de autoría, usan las cadenas de fallback de fuentes configuradas, alinean las ejecuciones de fallback a una línea base alfabética común y calculan el anclaje de texto a partir de los avances reales de glifos - Las imágenes PNG y JPEG embebidas se convierten en Image XObjects reutilizables, retienen el alpha PNG como soft mask y soportan
preserveAspectRatio="none",meetcentrado yslicecentrado - Los enlaces HTTP, HTTPS y mail se conservan como anotaciones de enlace PDF conscientes de la ubicación, sin volverse parte del stream reusable del Form
Límites de texto y pintura
El texto soporta relleno sólido, variantes bold e italic, tamaño de fuente, transforms, anclaje, opacidad y clipping geométrico; la pintura de texto con gradiente falla de forma cerrada, y cada nodo text o tspan permanece como una ejecución posicionada de forma independiente en lugar de un motor completo de layout de flujo de texto SVG
Las importaciones de texto de documentos retienen la variante bold e italic seleccionada mediante verificaciones de glifos conscientes del estilo y layout de fallback, preservan los bounds de tinta medidos y rechazan los glifos genuinamente no resueltos
El texto UTF-8 y las referencias de caracteres XML hexadecimales o decimales preservan los mismos escalares Unicode en Delphi y FPC, incluidos los escalares suplementarios representados por pares sustitutos UTF-16
La sobrecarga standalone de HPDFBuildSVGFormData sin un text builder usa los avances medidos Base 14 de Helvetica, Times y Courier y rechaza los caracteres fuera de WinAnsi en lugar de sustituirlos por signos de interrogación; la sobrecarga con THPDFSVGTextRunBuilder acepta formas de texto embebido y métricas proporcionadas por quien llama
Los gradientes conservan la aproximación acotada por bandas vectoriales; los recursos transparentes requieren PDF 1.4 y el profile estricto PDF/A-1 los rechaza
Estilos de trazo
stroke-dasharray, stroke-dashoffset y stroke-miterlimit funcionan mediante atributos de presentación, CSS embebido, estilos inline y herencia, incluidos los grupos y las instancias use solo de fragmento
Los dash arrays aceptan números separados por comas o espacios en blanco y longitudes soportadas; los porcentajes usan la diagonal normalizada del viewport, calculada como sqrt((viewWidth * viewWidth + viewHeight * viewHeight) / 2)
Los arrays de longitud impar se repiten para formar un patrón de longitud par, cada subpath reinicia el patrón, y los offsets positivos o negativos dan la vuelta al patrón completo; none y los arrays de puros ceros producen trazos sólidos
Los dashes pintados de longitud cero conservan las marcas de cap round o square; los trazos sólidos ordinarios, los patrones de trazo con gradiente, los clips, las masks y los grupos de opacidad aislados comparten la configuración de trazo seleccionada
El miter limit por defecto es 4; los valores SVG 2 entre 0 y 1 se aceptan y usan joins de bisel donde un miter excedería el límite, mientras que los bounds de recursos de gradiente y transparencia conservan joins vivos dentro del límite seleccionado
El renderizado nativo usa geometría de dashes acotada para conservar offsets, longitudes fraccionarias y arrays más largos que el límite del lápiz GDI, con aplanado adaptativo de curvas y joins pintados continuos a través de los límites de segmento
Calibrar dashes con pathLength sigue fuera de este profile; las shapes que combinan un dash array no sólido con pathLength fallan de forma cerrada en lugar de usar longitudes sin calibrar en silencio
La semántica de trazos sigue el modelo de trazos de SVG 2 dentro de los presupuestos del parser y el renderer descritos abajo
Configuración de shaping de texto
El texto SVG embebido usa la configuración de ShapingFeatures, AutoShapeArabic, AutoShapeSyriac, AutoShapeNko, AutoShapeAdlam y AutoShapeHanifiRohingya del documento importador, junto con sus selecciones de script y lenguaje GSUB y sus cadenas de fallback de fuentes
Estos ajustes se aplican tanto en los avances medidos como en las apariencias de texto generadas sin cambiar la configuración de quien llama; el shaping sigue siendo opt-in y requiere una fuente que suministre los glifos y las tablas OpenType solicitados
Cada apariencia de texto generada acepta como máximo 256 selecciones de fuentes de shaping distintas y 64 MiB de datos crudos de fuentes acumulados; los datos de fuente no soportados o un límite excedido hacen fallar la importación de forma atómica
Opacidad de objeto y grupo
opacity se aplica una vez al resultado pintado completo de su nodo y no se hereda a los descendientes; fill-opacity y stroke-opacity conservan sus valores de pintura heredados separados
Dos rectángulos rojos opacos superpuestos dentro de <g opacity="0.5"> permanecen igual de translúcidos en su superposición, mientras que dos rectángulos independientemente translúcidos se oscurecen donde se superponen
Los grupos anidados se componen en orden: dos opacidades envolventes de 0.5 producen un 0.25 efectivo sobre un descendiente opaco, y la opacidad explícita de 1 de un descendiente no anula su grupo envolvente
Los nodos raíz SVG, los contenedores, los enlaces, las referencias de fragmento, el texto, las imágenes y las shapes usan la misma ruta de opacidad de objeto; las referencias use solo de fragmento preservan tanto los estilos de la instancia como los del nodo referenciado
El alpha de relleno y trazo permanecen independientes, incluida su superposición dentro de un objeto translúcido, y el alpha de los stops de gradiente se combina con el alpha de pintura correspondiente antes de la composición del objeto
Los efectos de clip y mask pertenecen a su nodo en lugar de heredarse como ajustes de pintura de descendientes; la geometría de enlaces sigue siendo consciente de la ubicación, y los bounds aislados del Form conservan de forma conservadora los trazos y caps transformados
El importador retiene operadores vectoriales, Forms de texto embebido, recursos de imagen, patrones y masks dentro de grupos aislados; no aplana el SVG completo en un bitmap
El comportamiento soportado sigue el modelo de opacidad de objeto y grupo de SVG; las demás restricciones acotadas de texto, gradiente y geometría de esta página siguen aplicándose
Seguridad y presupuestos
El importador acepta SVG plano o comprimido con gzip de hasta 8 MiB, acota la entrada expandida a 32 MiB, los operadores combinados de main, pattern, mask y group a 16 MiB, los nodos a 4,096, el anidamiento a 64 niveles, las reglas CSS a 256 y los valores de path a 100,000
Las imágenes embebidas aceptan solo payloads Base64 estrictos data:image/png;base64, y data:image/jpeg;base64,, con 128 imágenes como máximo, 16,384 píxeles por dimensión y 16,777,216 píxeles decodificados entre todas las imágenes; las dimensiones se verifican antes de la decodificación nativa
El texto se acota a 128 ejecuciones y 65,536 unidades UTF-16 por ejecución, y los patrones de trazo con gradiente, las masks y los grupos de opacidad aislados a 128 recursos cada uno; las referencias de mask recursivas fallan de forma cerrada
Los dash arrays contienen 64 entradas de fuente como máximo antes de la expansión de arrays impares; las entradas positivas deben ser de al menos 0.000001 unidades de usuario, las longitudes individuales y el ciclo normalizado no deben exceder 1,000,000,000, los offsets absolutos no deben exceder 1,000,000,000, y los miter limits deben permanecer entre 0 y 1,000,000
Los efectos de transparencia anidados reales se limitan a ocho niveles para coincidir con el renderer nativo, de forma independiente al límite de profundidad del árbol SVG; los contenedores anidados ordinarios sin efectos de transparencia no consumen esta asignación
Los bounds de efectos de transparencia deben ser finitos y cada coordenada debe permanecer dentro de un valor absoluto de 1,000,000,000; las importaciones fuera de este profile de coordenadas acotado fallan antes del registro de grupos o masks
Las importaciones fallidas revierten los objetos generados, los Forms de texto embebido, las entradas de registro y el estado de versión y color de dispositivo, así que quienes llaman pueden reutilizar el mismo documento y preservar una transacción de grafo envolvente
Los scripts, los event handlers, los DTD, foreignObject, los media types de datos no soportados, las URLs JavaScript y las URLs externas de pintura o recursos de imagen fallan de forma cerrada
Las referencias de fragmento como url(#gradient), url(#clip) y href="#symbol" permanecen dentro del documento analizado y nunca disparan acceso a archivos ni a la red
Estadísticas
THPDFSVGImportStatistics reporta nodos, reglas CSS, gradientes, trazos con gradiente, masks, imágenes, enlaces, text runs, grupos de opacidad aislados vía GroupCount, y los bytes combinados de operadores generados de main, pattern, mask y group
HPDFBuildSVGFormData expone el parser acotado por separado mediante THPDFSVGFormData y THPDFSVGLinkInfo para quienes necesitan el contenido del Form, las dimensiones intrínsecas, los recursos de opacidad, los payloads de imágenes, los streams de patrones y masks, los nombres de recursos de texto o los metadatos de enlaces antes del registro; Groups proporciona los streams de operadores de grupo aislados y los bounds conservadores del Form
Ejemplo
Document.BeginDoc;
FormName := Document.ImportSVGFormXObject(SVGBytes, Statistics);
if FormName = '' then
raise Exception.Create('SVG import failed');
Document.CurrentPage.DrawSVGFormXObject(
FormName,
36,
72,
240,
120,
True
);
Document.CurrentPage.DrawSVGFormXObject(
FormName,
320,
72,
120,
60,
False
);
Véase también: THotPDF.ImportSVGFormXObject, THPDFPage.DrawSVGFormXObject, Importación de paged media HTML5