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

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