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
- A geometria inclui caminhos com arcos elípticos, retângulos, retângulos arredondados, círculos, elipses, linhas, polilinhas, polígonos, transformações, grupos, símbolos e referências
usesomente de fragmento - A pintura inclui cores RGB sólidas, opacidade de fill e de stroke, regras de fill, extremidades e junções de linha, dash arrays e offsets herdados, limites de miter, bandas vetoriais de gradiente linear e radial, traços com gradiente respaldados em tiling patterns coloridos e clip paths
- A opacidade de objeto e de grupo usa Forms de transparência vetorial isolados, então descendentes sobrepostos são compostos antes que a opacidade que os envolve seja aplicada
- Máscaras viram recursos Form de transparency group com soft masks PDF Alpha ou Luminosity, incluindo clipping da região de máscara,
maskUnits,maskContentUnitse referências aninhadas de máscara limitadas - O CSS inclui seletores de tipo, classe, ID e compostos embutidos, atributos de apresentação, estilos inline, especificidade, ordem de origem e
!important - Importações de documento embutem subconjuntos de fontes Unicode e mapas
ToUnicodepor meio do engine nativo de autoria, usam as cadeias de fallback de fonte configuradas, alinham runs de fallback a uma baseline alfabética comum e calculam a ancoragem de texto a partir de avanços reais de glifos - Imagens PNG e JPEG embutidas viram Image XObjects reutilizáveis, retêm o alpha de PNG como soft mask e suportam
preserveAspectRatio="none",meetcentralizado eslicecentralizado - Links HTTP, HTTPS e mail são retidos como anotações de link PDF com reconhecimento de posicionamento sem se tornarem parte do stream Form reutilizável
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