SVG Form XObject Import

THotPDF.ImportSVGFormXObject analisa o SVG uma só vez e regista um único PDF Form XObject reutilizável, enquanto THPDFPage.DrawSVGFormXObject o coloca com qualquer tamanho e cria, opcionalmente, anotações de ligação na 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

Limites de texto e de pintura

O texto suporta preenchimento sólido, variantes bold e italic, tamanho de fonte, transformações, ancoragem, opacidade e recorte geométrico; pintura de texto em gradiente falha em modo fechado, e cada nó de texto ou tspan permanece uma sequência posicionada de forma independente, em vez de um motor completo de layout de fluxo de texto SVG

As importações de texto de documentos retêm a face bold e italic selecionada através de verificações de glifos conscientes do estilo e do layout de fallback, preservam os limites de tinta medidos e rejeitam glifos genuinamente por resolver

O texto UTF-8 e as referências a carateres XML hexadecimais ou decimais preservam os mesmos escalares Unicode em Delphi e FPC, incluindo escalares suplementares representados por pares substitutos UTF-16

A sobrecarga autónoma de HPDFBuildSVGFormData sem um text builder usa avanços Base 14 medidos de Helvetica, Times e Courier e rejeita carateres fora do WinAnsi em vez de os substituir por pontos de interrogação; a sobrecarga com THPDFSVGTextRunBuilder aceita formas de texto incorporadas e métricas fornecidas pelo chamador

Os gradientes retêm a aproximação limitada por bandas vetoriais; os 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 através de atributos de apresentação, CSS incorporado, estilos inline e herança, incluindo grupos e instâncias use só de fragmento

Os arrays de tracejado aceitam números separados por vírgulas ou espaços em branco e comprimentos suportados; as percentagens usam a diagonal normalizada do viewport, calculada como sqrt((viewWidth * viewWidth + viewHeight * viewHeight) / 2)

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

Os traços pintados de comprimento zero retêm marcas de extremidade round ou square; os traços sólidos ordinários, os padrões de traços em gradiente, os clipes, as máscaras e os grupos de opacidade isolados partilham as definições de traço selecionadas

O limite de mitre predefinido é 4; valores SVG 2 entre 0 e 1 são aceites e usam junções biseladas onde uma junção em mitre excederia o limite, enquanto os limites de recursos de gradiente e de transparência retêm junções vivas dentro do limite selecionado

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

Calibrar tracejados com pathLength fica fora deste perfil; formas que combinem um array de tracejado não sólido com pathLength falham em modo fechado em vez de usar silenciosamente comprimentos não calibrados

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

Configuração de shaping de texto

O texto SVG incorporado usa as definições ShapingFeatures, AutoShapeArabic, AutoShapeSyriac, AutoShapeNko, AutoShapeAdlam e AutoShapeHanifiRohingya do documento importador, juntamente com as suas seleções de script e de idioma GSUB e as cadeias de fallback de fontes

Estas definições aplicam-se tanto nos avanços medidos como nas aparências de texto geradas, sem alterar a configuração do chamador; o shaping permanece opcional e exige uma fonte que forneça os glifos e as tabelas OpenType pedidos

Cada aparência de texto gerada aceita no máximo 256 seleções distintas de fontes de shaping e 64 MiB de dados de fontes em bruto acumulados; dados de fontes não suportados ou um limite excedido falham a importação atomicamente

Opacidade de objetos e de grupos

opacity aplica-se uma única vez ao resultado pintado completo do seu nó e não é herdada pelos descendentes; fill-opacity e stroke-opacity retêm os respetivos 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

Os grupos aninhados compõem-se pela ordem: duas opacidades envolventes de 0,5 produzem um efetivo de 0,25 sobre um descendente opaco, e a opacidade explícita de 1 de um descendente não sobrepõe a do grupo que o envolve

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

O alfa de fill e de stroke permanece independente, incluindo na sobreposição dentro de um objeto translúcido, e o alfa dos stops de gradiente combina-se com o alfa da pintura relevante antes da composição do objeto

Os efeitos de clip e de mask pertencem ao seu nó, em vez de serem herdados como definições de pintura dos descendentes; a geometria das ligações permanece sensível à posição, e os limites dos Forms isolados retêm conservadoramente traços e extremidades transformados

O importador retém operadores vetoriais, Forms de texto incorporado, recursos de imagem, padrões e máscaras dentro de grupos isolados; não achata o SVG inteiro num bitmap

O comportamento suportado segue o modelo de opacidade de objetos e grupos do SVG; as restantes restrições limitadas de texto, gradiente e geometria desta página continuam a aplicar-se

Segurança e orçamentos

O importador aceita SVG simples ou comprimido com gzip até 8 MiB, limita a entrada expandida a 32 MiB, os operadores combinados principais, de padrões, de máscaras e de grupos a 16 MiB, os nós a 4096, o aninhamento a 64 níveis, as regras CSS a 256 e os valores de path a 100 000

As imagens incorporadas aceitam apenas payloads estritos Base64 data:image/png;base64, e data:image/jpeg;base64,, com no máximo 128 imagens, 16 384 píxeis por dimensão e 16 777 216 píxeis descodificados em todas as imagens; as dimensões são verificadas antes da descodificação nativa

O texto fica limitado a 128 sequências e 65 536 unidades UTF-16 por sequência, e os padrões de traços em gradiente, as máscaras e os grupos de opacidade isolados a 128 recursos cada; referências recursivas de máscara falham em modo fechado

Os arrays de tracejado contêm no máximo 64 entradas de origem antes da expansão de arrays ímpares; as entradas positivas têm de ter, pelo menos, 0,000001 unidades de utilizador, os comprimentos individuais e o ciclo normalizado não podem exceder 1 000 000 000, os offsets absolutos não podem exceder 1 000 000 000, e os limites de mitre têm de ficar entre 0 e 1 000 000

Os efeitos de transparência efetivamente aninhados ficam limitados a oito níveis, para corresponder ao renderer nativo, independentemente do limite de profundidade da árvore SVG; contentores aninhados ordinários sem efeitos de transparência não consomem esta franquia

Os limites de efeitos de transparência têm de ser finitos e cada coordenada tem de permanecer dentro de um valor absoluto de 1 000 000 000; importações fora deste perfil limitado de coordenadas falham antes do registo de grupos ou de máscaras

As importações falhadas fazem rollback dos objetos gerados, dos Forms de texto incorporado, das entradas de registo e do estado de versões e de cores de dispositivo, pelo que os chamadores podem reutilizar o mesmo documento e preservar uma transação de grafo externa

Scripts, event handlers, DTDs, foreignObject, tipos de média de dados não suportados, URLs JavaScript e URLs externos de pintura ou de recursos de imagem falham em modo fail-closed

As referências a fragmentos, como url(#gradient), url(#clip) e href="#symbol", permanecem dentro do documento analisado e nunca provocam acesso a ficheiros nem à rede

Estatísticas

THPDFSVGImportStatistics reporta nós, regras CSS, gradientes, traços em gradiente, máscaras, imagens, links, sequências de texto, grupos de opacidade isolados através de GroupCount e os bytes combinados gerados de operadores principais, de padrões, de máscaras e de grupos

HPDFBuildSVGFormData expõe o parser limitado em separado, através de THPDFSVGFormData e THPDFSVGLinkInfo, para os chamadores que precisam do conteúdo Form, das dimensões intrínsecas, dos recursos de opacidade, dos payloads de imagens, dos streams de padrões e de máscaras, dos nomes de recursos de texto ou dos metadados das ligações antes do registo; Groups fornece os streams de operadores dos grupos isolados e os limites conservadores dos Forms

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

Ver também: THotPDF.ImportSVGFormXObject, THPDFPage.DrawSVGFormXObject, HTML5 Paged-Media Import