Importación de Form XObject SVG
THotPDF.ImportSVGFormXObject analiza el SVG una vez y registra un Form XObject PDF reutilizable, mientras que THPDFPage.DrawSVGFormXObject lo coloca en cualquier tamaño y crea opcionalmente anotaciones de enlace de 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 rutas con arcos elípticos, rectángulos, rectángulos redondeados, círculos, elipses, líneas, polilíneas, polígonos, transformaciones, grupos, símbolos y referencias
usesolo de fragmento - El pintado incluye colores RGB sólidos, opacidad de relleno y de trazo, reglas de relleno, extremos y uniones de línea, arrays de dash y offsets heredados, miter limits, bandas vectoriales de degradados lineales y radiales, trazos con degradado respaldados por patrones de teselado coloreados y clip paths
- La opacidad de objeto y de grupo usa Forms de transparencia vectorial aislados, de modo que los descendientes superpuestos se componen antes de aplicar la opacidad que los envuelve
- Las máscaras se convierten en recursos Form de grupo de transparencia con soft masks PDF Alpha o Luminosity, incluidos el recorte de la región de máscara,
maskUnits,maskContentUnitsy referencias de máscara anidadas acotadas - CSS incluye selectores de tipo, clase, ID y compuestos incorporados, atributos de presentación, estilos en línea, especificidad, orden de origen y
!important - Las importaciones de documentos incrustan subconjuntos de fuentes Unicode y mapas
ToUnicodea través del motor nativo de autoría, usan las cadenas de reserva de fuentes configuradas, alinean los runs de reserva con una línea base alfabética común y calculan el anclaje del texto a partir de los avances reales de glifo - Las imágenes PNG y JPEG incrustadas se convierten en Image XObjects reutilizables, conservan el alfa PNG como soft mask y soportan
preserveAspectRatio="none",meetcentrado yslicecentrado - Los enlaces HTTP, HTTPS y de correo se conservan como anotaciones de enlace PDF con reconocimiento de colocación sin pasar a formar parte del flujo Form reutilizable
Límites de texto y pintado
El texto soporta relleno sólido, variantes bold e italic, tamaño de fuente, transformaciones, anclaje, opacidad y recorte geométrico; el pintado de texto con degradado falla de forma cerrada, y cada nodo text o tspan sigue siendo un run posicionado de forma independiente en lugar de un motor completo de maquetación de flujo de texto SVG
Las importaciones de texto de documentos conservan la variante bold e italic seleccionada mediante comprobaciones de glifos conscientes del estilo y maquetación de fallback, preservan los límites de tinta medidos y rechazan los glifos genuinamente no resueltos
El texto UTF-8 y las referencias de caracteres XML hexadecimales o decimales conservan los mismos escalares Unicode en Delphi y FPC, incluidos los escalares suplementarios representados por pares sustitutos UTF-16
La sobrecarga independiente de HPDFBuildSVGFormData sin constructor de texto usa los avances medidos de las Base 14 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 Forms de texto incrustado y métricas proporcionados por el llamador
Los degradados conservan la aproximación acotada por bandas vectoriales; los recursos transparentes exigen PDF 1.4 y el perfil estricto PDF/A-1 los rechaza
Estilos de trazo
stroke-dasharray, stroke-dashoffset y stroke-miterlimit funcionan a través de atributos de presentación, CSS incrustado, estilos en línea y herencia, incluidos los grupos y las instancias use solo de fragmento
Los arrays de dash 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 subtrazado reinicia el patrón, y los offsets positivos o negativos dan la vuelta al patrón completo; none y los arrays de solo ceros producen trazos sólidos
Los dashes pintados de longitud cero conservan las marcas de cap redondas o cuadradas; los trazos sólidos ordinarios, los patrones de trazo con degradado, los clips, las máscaras y los grupos de opacidad aislados comparten los ajustes de trazo seleccionados
El miter limit por defecto es 4; se aceptan los valores SVG 2 entre 0 y 1 y usan uniones biseladas donde una punta en ángulo superaría el límite, mientras que los límites de recursos de degradado y transparencia conservan uniones afiladas dentro del límite seleccionado
El renderizado nativo usa geometría de dash acotada para conservar offsets, longitudes fraccionarias y arrays más largos que el límite de pluma de GDI, con aplanado adaptativo de curvas y uniones pintadas continuas a través de los límites de segmento
Calibrar dashes con pathLength sigue fuera de este perfil; las formas que combinan un array de dash 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 de parser y renderizador descritos abajo
Configuración de shaping de texto
El texto SVG incrustado usa los ajustes ShapingFeatures, AutoShapeArabic, AutoShapeSyriac, AutoShapeNko, AutoShapeAdlam y AutoShapeHanifiRohingya del documento importador, junto con sus selecciones de script e idioma GSUB y sus cadenas de reserva de fuentes
Estos ajustes se aplican tanto en los avances medidos como en las apariencias de texto generadas sin cambiar la configuración del llamador; el shaping sigue siendo opcional (opt-in) y exige una fuente que suministre los glifos y 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; unos datos de fuente no soportados o un límite superado hacen fallar la importación de forma atómica
Opacidad de objeto y de grupo
opacity se aplica una sola vez al resultado pintado completo de su nodo y no se hereda por los descendientes; fill-opacity y stroke-opacity conservan sus valores de pintado heredados por separado
Dos rectángulos rojos opacos superpuestos dentro de <g opacity="0.5"> siguen igual de translúcidos en su zona de solape, mientras que dos rectángulos independientemente translúcidos se oscurecen donde se solapan
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 SVG raíz, los contenedores, los enlaces, las referencias de fragmento, el texto, las imágenes y las formas usan la misma ruta de opacidad de objeto; las referencias use solo de fragmento conservan tanto los estilos de la instancia como los del nodo referenciado
El alfa de relleno y el de trazo siguen siendo independientes, incluido su solape dentro de un objeto translúcido, y el alfa de las paradas de degradado se combina con el alfa del pintado correspondiente antes de la composición del objeto
Los efectos de clip y de máscara pertenecen a su nodo en lugar de heredarse como ajustes de pintado de descendientes; la geometría de los enlaces sigue dependiente de la colocación, y los límites de los Forms aislados conservan de forma conservadora los trazos y caps transformados
El importador retiene operadores vectoriales, Forms de texto incrustado, recursos de imagen, patrones y máscaras 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, degradado y geometría de esta página siguen aplicándose
Seguridad y presupuestos
El importador acepta SVG simple o comprimido con gzip de hasta 8 MiB, acota la entrada expandida a 32 MiB, los operadores combinados 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 ruta a 100.000
Las imágenes incrustadas aceptan solo payloads Base64 estrictos data:image/png;base64, y data:image/jpeg;base64,, con como máximo 128 imágenes, 16.384 píxeles por dimensión y 16.777.216 píxeles decodificados entre todas las imágenes; las dimensiones se comprueban antes de la decodificación nativa
El texto se acota a 128 runs y 65.536 unidades UTF-16 por run, y los patrones de trazo con degradado, las máscaras y los grupos de opacidad aislados a 128 recursos cada uno; las referencias de máscara recursivas fallan de forma cerrada
Los arrays de dash contienen como máximo 64 entradas de origen 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 superar 1.000.000.000, los offsets absolutos no deben superar 1.000.000.000, y los miter limits deben permanecer entre 0 y 1.000.000
Los efectos de transparencia realmente anidados se limitan a ocho niveles para coincidir con el renderizador nativo, con independencia del límite de profundidad del árbol SVG; los contenedores anidados ordinarios sin efectos de transparencia no consumen esta asignación
Los límites de los 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 perfil acotado de coordenadas fallan antes del registro de grupos o máscaras
Las importaciones fallidas revierten los objetos generados, los Forms de texto incrustado, las entradas de registro y el estado de versión y de color de dispositivo, de modo que los llamadores pueden reutilizar el mismo documento y conservar una transacción de grafo envolvente
Los scripts, los controladores de eventos, los DTD, foreignObject, los media types de datos no soportados, las URL JavaScript y las URL externas de pintado o de 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 activan el acceso a archivos o redes
Estadísticas
THPDFSVGImportStatistics informa de nodos, reglas CSS, degradados, trazos con degradado, máscaras, imágenes, enlaces, ejecuciones de texto, grupos de opacidad aislados a través de GroupCount, y bytes combinados de operadores generados main, pattern, mask y group
HPDFBuildSVGFormData expone el analizador acotado por separado mediante THPDFSVGFormData y THPDFSVGLinkInfo para los llamadores que necesitan el contenido Form, las dimensiones intrínsecas, los recursos de opacidad, los payloads de imagen, los flujos de patrones y máscaras, los nombres de recursos de texto o los metadatos de enlace antes del registro; Groups proporciona los flujos de operadores de grupos aislados y los límites 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 medios paginados HTML5