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

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