Importação de Form XObject SVG

THotPDF.ImportSVGFormXObject analisa SVG uma vez e registra um Form XObject PDF reutilizável, enquanto THPDFPage.DrawSVGFormXObject o posiciona em qualquer tamanho e opcionalmente cria anotações de link de página

Declaração

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 vetorial

Fronteiras de texto e pintura

Texto suporta fill sólido, variantes bold e italic, tamanho de fonte, transforms, ancoragem, opacidade e clipping geométrico; pintura de texto com gradiente falha fechada, e cada nó text ou tspan permanece um run posicionado de forma independente, em vez de um engine completo de layout de fluxo de texto SVG

Importações de texto de documento retêm a face bold e italic selecionada por meio de checagens de glifos conscientes de estilo e layout de fallback, preservam os limites de tinta medidos e rejeitam glifos genuinamente não resolvidos

Texto UTF-8 e referências de caracteres XML hexadecimais ou decimais preservam os mesmos escalares Unicode em Delphi e FPC, incluindo escalares suplementares representados por surrogate pairs UTF-16

A sobrecarga standalone de HPDFBuildSVGFormData sem um text builder usa avanços medidos das Base 14 Helvetica, Times e Courier e rejeita caracteres fora do WinAnsi em vez de substituí-los por pontos de interrogação; a sobrecarga com THPDFSVGTextRunBuilder aceita Forms de texto embutido e métricas fornecidos pelo chamador

Gradientes mantêm a aproximação limitada por bandas vetoriais; recursos transparentes exigem PDF 1.4 e são rejeitados pelo perfil estrito PDF/A-1

Estilos de traço

stroke-dasharray, stroke-dashoffset e stroke-miterlimit funcionam por meio de atributos de apresentação, CSS embutido, estilos inline e herança, incluindo grupos e instâncias use somente de fragmento

Dash arrays aceitam números separados por vírgula ou espaço em branco e comprimentos suportados; porcentagens usam a diagonal normalizada do viewport, calculada como sqrt((viewWidth * viewWidth + viewHeight * viewHeight) / 2)

Arrays de comprimento ímpar repetem para formar um padrão de comprimento par, cada subpath reinicia o padrão, e offsets positivos ou negativos dão a volta no padrão completo; none e arrays com zeros produzem traços sólidos

Dashes pintados de comprimento zero retêm marcas de ponta round ou square; traços sólidos comuns, patterns de traço com gradiente, clips, máscaras e grupos de opacidade isolados compartilham as configurações de traço selecionadas

O limite de miter padrão é 4; valores SVG 2 entre 0 e 1 são aceitos e usam junções bevel onde um miter excederia o limite, enquanto os limites de recursos de gradiente e transparência mantêm junções vivas dentro do limite selecionado

A renderização nativa usa geometria de dashes limitada para reter offsets, comprimentos fracionários e arrays mais longos que o limite de caneta do GDI, com achatamento adaptativo de curvas e junções pintadas contínuas através de fronteiras de segmento

Calibrar dashes com pathLength continua fora deste perfil; formas que combinem um dash array não sólido com pathLength falham fechadas em vez de usar silenciosamente comprimentos não calibrados

A semântica de traço segue o modelo de traço do SVG 2 dentro dos orçamentos de parser e renderizador descritos abaixo

Configuração de shaping de texto

Texto SVG embutido usa as configurações de ShapingFeatures, AutoShapeArabic, AutoShapeSyriac, AutoShapeNko, AutoShapeAdlam e AutoShapeHanifiRohingya do documento importador, junto com as seleções de script e idioma GSUB dele e as cadeias de fallback de fonte

Essas configurações se aplicam tanto aos avanços medidos quanto às appearances de texto geradas, sem alterar a configuração do chamador; o shaping continua opt-in e exige uma fonte que forneça os glifos e as tabelas OpenType solicitados

Cada appearance de texto gerada aceita no máximo 256 seleções distintas de fonte de shaping e 64 MiB de dados brutos de fonte cumulativos; dados de fonte não suportados ou um limite excedido fazem a importação falhar de forma atômica

Opacidade de objeto e de grupo

opacity se aplica uma vez ao resultado pintado completo do nó dela e não é herdada por descendentes; fill-opacity e stroke-opacity mantêm os valores de pintura herdados separados

Dois retângulos vermelhos opacos sobrepostos dentro de <g opacity="0.5"> permanecem igualmente translúcidos na sobreposição, enquanto dois retângulos independentemente translúcidos ficam mais escuros onde se sobrepõem

Grupos aninhados são compostos em ordem: duas opacidades envolventes de 0.5 produzem um 0.25 efetivo sobre um descendente opaco, e a opacidade explícita 1 de um descendente não sobrepõe o grupo que o envolve

Nós SVG raiz, contêineres, links, referências de fragmento, texto, imagens e shapes usam o mesmo caminho de opacidade de objeto; referências use somente de fragmento preservam os estilos tanto da instância quanto do nó referenciado

O alpha de fill e de stroke permanecem independentes, inclusive na sobreposição deles dentro de um objeto translúcido, e o alpha de stops de gradiente se combina com o alpha de pintura relevante antes da composição do objeto

Efeitos de clip e de mask pertencem ao nó deles em vez de serem herdados como configurações de pintura de descendentes; a geometria de links permanece consciente de posicionamento, e os limites de Forms isolados retêm conservativamente traços e pontas transformados

O importador mantém operadores vetoriais, Forms de texto embutido, recursos de imagem, patterns e máscaras dentro de grupos isolados; ele não achata o SVG inteiro em um bitmap

O comportamento suportado segue o modelo de opacidade de objeto e grupo do SVG; as demais restrições limitadas de texto, gradiente e geometria desta página continuam se aplicando

Segurança e orçamentos

O importador aceita SVG simples ou compactado com gzip de até 8 MiB, limita a entrada expandida a 32 MiB, os operadores combinados de conteúdo principal, pattern, máscara e grupo a 16 MiB, os nós a 4.096, o aninhamento a 64 níveis, as regras CSS a 256 e os valores de caminho a 100.000

Imagens embutidas aceitam apenas payloads estritos de Base64 data:image/png;base64, e data:image/jpeg;base64,, com no máximo 128 imagens, 16.384 pixels por dimensão e 16.777.216 pixels decodificados entre todas as imagens; as dimensões são checadas antes da decodificação nativa

O texto é limitado a 128 runs e 65.536 unidades UTF-16 por run, e patterns de traço com gradiente, máscaras e grupos de opacidade isolados a 128 recursos cada; referências recursivas de máscara falham fechadas

Dash arrays contêm no máximo 64 entradas de origem antes da expansão de arrays ímpares; entradas positivas devem ter pelo menos 0,000001 unidades de usuário, comprimentos individuais e o ciclo normalizado não podem exceder 1.000.000.000, offsets absolutos não podem exceder 1.000.000.000, e limites de miter devem permanecer entre 0 e 1.000.000

Efeitos de transparência realmente aninhados são limitados a oito níveis para corresponder ao renderizador nativo, independentemente do limite de profundidade de árvore do SVG; contêineres aninhados comuns sem efeitos de transparência não consomem essa cota

Os limites de efeitos de transparência devem ser finitos e cada coordenada deve permanecer dentro de um valor absoluto de 1.000.000.000; importações fora deste perfil limitado de coordenadas falham antes do registro de grupo ou máscara

Importações com falha desfazem objetos gerados, Forms de texto embutido, entradas de registro e o estado de versão e de cor de dispositivo, então chamadores podem reutilizar o mesmo documento e preservar uma transação de grafo externa

Scripts, manipuladores de evento, DTDs, foreignObject, media types de dados não suportados, URLs JavaScript e URLs externas de pintura ou recurso de imagem falham fechadas

Referências de fragmento como url(#gradient), url(#clip) e href="#symbol" permanecem dentro do documento analisado e nunca acionam acesso a arquivo ou rede

Estatísticas

THPDFSVGImportStatistics relata nós, regras CSS, gradientes, traços com gradiente, máscaras, imagens, links, execuções de texto, grupos de opacidade isolados por meio de GroupCount e o total combinado de bytes de operadores gerados de conteúdo principal, patterns, máscaras e grupos

HPDFBuildSVGFormData expõe o parser limitado separadamente por meio de THPDFSVGFormData e THPDFSVGLinkInfo para chamadores que precisam do conteúdo do Form, dimensões intrínsecas, recursos de opacidade, payloads de imagem, streams de pattern e máscara, nomes de recursos de texto ou metadados de link antes do registro; Groups fornece os streams de operadores de grupos isolados e os limites conservadores de Form

Exemplo

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
);

Veja também: THotPDF.ImportSVGFormXObject, THPDFPage.DrawSVGFormXObject, Importação de mídia paginada HTML5