Importazione di SVG Form XObject

THotPDF.ImportSVGFormXObject parsa l'SVG una volta e registra un Form XObject PDF riutilizzabile, mentre THPDFPage.DrawSVGFormXObject lo colloca a qualsiasi dimensione e opzionalmente crea annotazioni link di pagina

Dichiarazione

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

Profilo vettoriale

Confini di testo e pittura

Il testo supporta fill solido, varianti bold e italic, dimensione del font, trasformazioni, ancoraggio, opacità e clipping geometrico; la pittura del testo con gradient fallisce in modo chiuso, e ogni nodo text o tspan resta una sequenza posizionata indipendentemente anziché un engine completo di layout del flusso di testo SVG

Le importazioni di testo da documento conservano la variante bold e italic selezionata attraverso controlli dei glifi sensibili allo stile e layout di fallback, preservano i bounds dell'inchiostro misurati e rifiutano i glifi genuinamente non risolti

Il testo UTF-8 e i riferimenti a caratteri XML esadecimali o decimali preservano gli stessi scalari Unicode su Delphi e FPC, inclusi gli scalari supplementari rappresentati da coppie surrogate UTF-16

L'overload standalone di HPDFBuildSVGFormData senza text builder usa gli avanzamenti misurati Base 14 di Helvetica, Times e Courier e rifiuta i caratteri fuori da WinAnsi invece di sostituire punti interrogativi; l'overload con THPDFSVGTextRunBuilder accetta form di testo incorporati e metriche forniti dal chiamante

I gradienti conservano l'approssimazione limitata a bande vettoriali; le risorse trasparenti richiedono PDF 1.4 e vengono rifiutate dal profilo strict PDF/A-1

Stili di stroke

stroke-dasharray, stroke-dashoffset e stroke-miterlimit funzionano tramite attributi di presentazione, CSS incorporato, stili inline ed ereditarietà, inclusi gruppi e istanze use solo di fragment

Gli array di dash accettano numeri separati da virgole o spazi e lunghezze supportate; le percentuali usano la diagonale normalizzata del viewport, calcolata come sqrt((viewWidth * viewWidth + viewHeight * viewHeight) / 2)

Gli array di lunghezza dispari si ripetono fino a formare un pattern di lunghezza pari, ogni sottopercorso fa ripartire il pattern e gli offset positivi o negativi girano intorno al pattern completo; none e gli array tutti a zero producono tratti solidi

I dash dipinti di lunghezza zero conservano i segni di estremità round o square; i tratti solidi ordinari, i pattern di tratto con gradient, i clip, le mask e i gruppi di opacità isolati condividono le impostazioni di stroke selezionate

Il miter limit predefinito è 4; i valori SVG 2 tra 0 e 1 sono accettati e usano giunzioni bevel dove un miter supererebbe il limite, mentre i bounds delle risorse gradient e trasparenza conservano giunzioni nette entro il limite selezionato

Il rendering nativo usa geometria dash limitata per conservare offset, lunghezze frazionarie e array più lunghi del limite della penna GDI, con flattening adattivo delle curve e giunzioni dipinte continue attraverso i confini di segmento

La calibrazione dei dash con pathLength resta fuori da questo profilo; le forme che combinano un array di dash non solido con pathLength falliscono in modo chiuso invece di usare silenziosamente lunghezze non calibrate

La semantica dello stroke segue il modello di stroke SVG 2 entro i budget di parser e renderer descritti di seguito

Configurazione dello shaping del testo

Il testo SVG incorporato usa le impostazioni ShapingFeatures, AutoShapeArabic, AutoShapeSyriac, AutoShapeNko, AutoShapeAdlam e AutoShapeHanifiRohingya del documento che importa, insieme alle sue selezioni di script e lingua GSUB e alle catene di fallback dei font

Queste impostazioni si applicano sia durante gli avanzamenti misurati sia nelle appearance di testo generate senza cambiare la configurazione del chiamante; lo shaping resta opt-in e richiede un font che fornisca i glifi richiesti e le tabelle OpenType

Ogni appearance di testo generata accetta al massimo 256 selezioni distinte di font di shaping e 64 MiB di dati grezzi cumulativi dei font; dati font non supportati o un limite superato fanno fallire l'import in modo atomico

Opacità di oggetto e gruppo

opacity si applica una volta al risultato dipinto completo del suo nodo e non viene ereditata dai discendenti; fill-opacity e stroke-opacity conservano i loro distinti valori di pittura ereditati

Due rettangoli rossi opachi sovrapposti dentro <g opacity="0.5"> restano ugualmente traslucidi nella loro sovrapposizione, mentre due rettangoli indipendentemente traslucidi diventano più scuri dove si sovrappongono

I gruppi annidati vengono composti in ordine: due opacità contenenti di 0.5 producono un effettivo 0.25 su un discendente opaco, e l'opacità esplicita di 1 di un discendente non sovrascrive il gruppo che lo contiene

Nodi SVG radice, contenitori, link, riferimenti a fragment, testo, immagini e forme usano lo stesso percorso di opacità di oggetto; i riferimenti use solo di fragment preservano sia gli stili dell'istanza sia quelli del nodo referenziato

L'alfa di fill e stroke restano indipendenti, incluso alla loro sovrapposizione dentro un oggetto traslucido, e l'alfa degli stop dei gradienti si combina con l'alfa di pittura pertinente prima del compositing dell'oggetto

Gli effetti di clip e mask appartengono al loro nodo anziché ereditare come impostazioni di pittura dei discendenti; la geometria dei link resta consapevole del posizionamento, e i bounds dei Form isolati conservano conservativamente stroke e estremità trasformate

L'importer conserva operatori vettoriali, Form di testo incorporati, risorse immagine, pattern e mask dentro i gruppi isolati; non appiattisce l'intero SVG in una bitmap

Il comportamento supportato segue il modello di opacità di oggetto e gruppo SVG; le altre restrizioni limitate su testo, gradienti e geometria di questa pagina restano valide

Sicurezza e budget

L'importer accetta SVG semplice o compresso gzip fino a 8 MiB, limita l'input espanso a 32 MiB, gli operatori combinati main, pattern, mask e group a 16 MiB, i nodi a 4.096, l'annidamento a 64 livelli, le regole CSS a 256 e i valori dei path a 100.000

Le immagini incorporate accettano solo payload Base64 strict data:image/png;base64, e data:image/jpeg;base64,, con al massimo 128 immagini, 16.384 pixel per dimensione e 16.777.216 pixel decodificati su tutte le immagini; le dimensioni vengono verificate prima della decodifica nativa

Il testo è limitato a 128 sequenze e 65.536 unità UTF-16 per sequenza, e i pattern di tratto con gradient, le mask e i gruppi di opacità isolati a 128 risorse ciascuno; i riferimenti mask ricorsivi falliscono in modo chiuso

Gli array di dash contengono al massimo 64 voci sorgente prima dell'espansione degli array dispari; le voci positive devono essere almeno 0,000001 unità utente, le singole lunghezze e il ciclo normalizzato non devono superare 1.000.000.000, gli offset assoluti non devono superare 1.000.000.000 e i miter limit devono restare tra 0 e 1.000.000

Gli effetti di trasparenza effettivamente annidati sono limitati a otto livelli per corrispondere al renderer nativo, indipendentemente dal limite di profondità dell'albero SVG; i contenitori annidati ordinari senza effetti di trasparenza non consumano questa quota

I bounds degli effetti di trasparenza devono essere finiti e ogni coordinata deve restare entro un valore assoluto di 1.000.000.000; gli import fuori da questo profilo di coordinate limitato falliscono prima della registrazione di gruppi o mask

Gli import falliti fanno rollback degli oggetti generati, dei Form di testo incorporati, delle voci di registry e dello stato di versione e colore dispositivo, così i chiamanti possono riusare lo stesso documento e preservare una graph transaction contenente

Script, gestori di eventi, DTD, foreignObject, media type di dati non supportati, URL JavaScript e URL esterni di pittura o risorse immagine falliscono in modo chiuso

I riferimenti a fragment come url(#gradient), url(#clip) e href="#symbol" restano dentro il documento parsato e non attivano mai accesso a file o rete

Statistiche

THPDFSVGImportStatistics riporta nodi, regole CSS, gradienti, tratti con gradient, mask, immagini, link, text run, gruppi di opacità isolati tramite GroupCount e byte combinati generati degli operatori main, pattern, mask e group

HPDFBuildSVGFormData espone separatamente il parser limitato attraverso THPDFSVGFormData e THPDFSVGLinkInfo per i chiamanti che hanno bisogno del contenuto del Form, delle dimensioni intrinseche, delle risorse di opacità, dei payload immagine, degli stream di pattern e mask, dei nomi delle risorse di testo o dei metadati dei link prima della registrazione; Groups fornisce gli stream degli operatori dei gruppi isolati e i bounds conservativi del Form

Esempio

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

Vedi anche: THotPDF.ImportSVGFormXObject, THPDFPage.DrawSVGFormXObject, Importazione HTML5 paged-media