SVG-Form-XObject-Import

THotPDF.ImportSVGFormXObject parst SVG einmal und registriert ein wiederverwendbares PDF-Form-XObject, während THPDFPage.DrawSVGFormXObject es in beliebiger Größe platziert und optional Seiten-Link-Annotationen erstellt

Deklaration

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

Vektorprofil

Text- und Paint-Grenzen

Text unterstützt einfarbige Füllung, fette und kursive Varianten, Schriftgröße, Transformationen, Verankerung, Deckkraft und geometrisches Clipping; Gradient-Text-Paint schlägt sicher ab, und jeder Text- oder tspan-Knoten bleibt ein unabhängig positionierter Run statt einer vollständigen SVG-Textfluss-Layout-Engine

Dokumenttext-Importe behalten den gewählten Bold- bzw. Italic-Schnitt durch stilbewusste Glyphenprüfungen und Fallback-Layout, bewahren gemessene Ink-Grenzen und weisen wirklich unauflösbare Glyphen zurück

UTF-8-Text und hexadezimale oder dezimale XML-Zeichenreferenzen bewahren dieselben Unicode-Skalare unter Delphi und FPC, einschließlich ergänzender Skalare in UTF-16-Surrogatpaaren

Die eigenständige Overload-Variante von HPDFBuildSVGFormData ohne Text-Builder verwendet gemessene Helvetica-, Times- und Courier-Base-14-Advances und weist Zeichen außerhalb WinAnsi zurück, statt Fragezeichen einzusetzen; die Variante mit THPDFSVGTextRunBuilder akzeptiert vom Aufrufer bereitgestellte eingebettete Text-Forms und Metriken

Gradienten behalten die begrenzte Vektorband-Approximation; transparente Ressourcen setzen PDF 1.4 voraus und werden vom strikten PDF/A-1-Profil abgelehnt

Stroke-Stile

stroke-dasharray, stroke-dashoffset und stroke-miterlimit wirken über Präsentationsattribute, eingebettetes CSS, Inline-Stile und Vererbung, einschließlich Gruppen und reiner Fragment-use-Instanzen

Dash-Arrays akzeptieren komma- oder leerzeichenseparierte Zahlen und unterstützte Längen; Prozentwerte verwenden die normalisierte Viewport-Diagonale, berechnet als sqrt((viewWidth * viewWidth + viewHeight * viewHeight) / 2)

Arrays ungerader Länge wiederholen sich zu einem Muster gerader Länge, jeder Subpfad startet das Muster neu, und positive oder negative Offsets laufen um das vollständige Muster herum; none und Arrays aus lauter Nullen erzeugen Vollton-Striche

Gezeichnete Striche der Länge null behalten runde oder quadratische Cap-Marken; gewöhnliche Vollton-Striche, Gradient-Stroke-Patterns, Clips, Masken und isolierte Deckkraftgruppen teilen sich die gewählten Stroke-Einstellungen

Das Standard-Miter-Limit ist 4; SVG-2-Werte zwischen 0 und 1 werden akzeptiert und verwenden Bevel-Joins, wo ein Miter das Limit überschreiten würde, während Gradient- und Transparenz-Ressourcengrenzen scharfe Joins innerhalb des gewählten Limits behalten

Das native Rendering verwendet begrenzte Dash-Geometrie, um Offsets, Bruchteile von Längen und Arrays jenseits des GDI-Pen-Limits zu bewahren, mit adaptivem Kurven-Flattening und kontinuierlich gezeichneten Joins über Segmentgrenzen hinweg

Das Kalibrieren von Strichen mit pathLength bleibt außerhalb dieses Profils; Formen, die ein nicht-volltoniges Dash-Array mit pathLength kombinieren, schlagen sicher ab, statt stillschweigend unkalibrierte Längen zu verwenden

Die Stroke-Semantik folgt dem SVG-2-Stroke-Modell innerhalb der unten beschriebenen Parser- und Renderer-Budgets

Text-Shaping-Konfiguration

Eingebetteter SVG-Text verwendet die ShapingFeatures-, AutoShapeArabic-, AutoShapeSyriac-, AutoShapeNko-, AutoShapeAdlam- und AutoShapeHanifiRohingya-Einstellungen des importierenden Dokuments samt dessen GSUB-Skript- und Sprachauswahlen sowie Font-Fallback-Ketten

Diese Einstellungen greifen sowohl bei gemessenen Advances als auch bei erzeugten Text-Darstellungen, ohne die Konfiguration des Aufrufers zu ändern; Shaping bleibt Opt-in und verlangt eine Schrift, die die angeforderten Glyphen und OpenType-Tabellen bereitstellt

Jede erzeugte Text-Darstellung akzeptiert höchstens 256 verschiedene Shaping-Font-Auswahlen und 64 MiB kumulative Roh-Fontdaten; nicht unterstützte Fontdaten oder ein überschrittenes Limit lassen den Import atomar fehlschlagen

Objekt- und Gruppen-Deckkraft

opacity greift einmal auf das vollständige gezeichnete Ergebnis ihres Knotens und wird nicht an Nachfahren vererbt; fill-opacity und stroke-opacity behalten ihre getrennten geerbten Paint-Werte

Zwei überlappende opake rote Rechtecke innerhalb von <g opacity="0.5"> bleiben in ihrer Überlappung gleich transluzent, während zwei unabhängig transparente Rechtecke dort dunkler werden

Verschachtelte Gruppen setzen sich der Reihe nach zusammen: zwei umschließende Deckkräfte von 0,5 ergeben über einem opaken Nachfahren effektiv 0,25, und die explizite Deckkraft 1 eines Nachfahren hebt seine umschließende Gruppe nicht auf

Root-SVG-Knoten, Container, Links, Fragmentreferenzen, Text, Bilder und Formen verwenden denselben Objekt-Deckkraft-Pfad; reine Fragment-use-Referenzen bewahren sowohl die Stile der Instanz als auch die des referenzierten Knotens

Füll- und Stroke-Alpha bleiben unabhängig, auch in ihrer Überlappung innerhalb eines transluzenten Objekts, und Gradient-Stop-Alpha kombiniert sich vor dem Objekt-Compositing mit dem jeweiligen Paint-Alpha

Clip- und Maskeneffekte gehören zu ihrem Knoten, statt als Paint-Einstellungen an Nachfahren vererbt zu werden; Link-Geometrie bleibt platzierungsbewusst, und isolierte Form-Grenzen behalten konservativ transformierte Striche und Caps

Der Importer behält Vektoroperatoren, eingebettete Text-Forms, Bildressourcen, Patterns und Masken innerhalb isolierter Gruppen; er flacht das gesamte SVG nicht in eine Bitmap ab

Das unterstützte Verhalten folgt dem SVG-Objekt- und Gruppen-Deckkraftmodell; die übrigen begrenzten Text-, Gradient- und Geometrie-Einschränkungen auf dieser Seite gelten weiterhin

Sicherheit und Budgets

Der Importer akzeptiert plain oder gzip-komprimiertes SVG bis 8 MiB, begrenzt erweiterte Eingaben auf 32 MiB, die kombinierten Haupt-, Pattern-, Mask- und Gruppenoperatoren auf 16 MiB, Knoten auf 4.096, Verschachtelung auf 64 Ebenen, CSS-Regeln auf 256 und Pfadwerte auf 100.000

Eingebettete Bilder akzeptieren nur strikte Base64-Payloads data:image/png;base64, und data:image/jpeg;base64,, mit höchstens 128 Bildern, 16.384 Pixel je Dimension und 16.777.216 dekodierten Pixeln über alle Bilder; die Abmessungen werden vor dem nativen Dekodieren geprüft

Text ist auf 128 Runs und 65.536 UTF-16-Einheiten je Run begrenzt, Gradient-Stroke-Patterns, Masken und isolierte Deckkraftgruppen jeweils auf 128 Ressourcen; rekursive Mask-Referenzen schlagen sicher ab

Dash-Arrays enthalten höchstens 64 Quelleinträge vor der Erweiterung ungerader Arrays; positive Einträge müssen mindestens 0,000001 User-Units betragen, einzelne Längen und der normalisierte Zyklus sowie absolute Offsets dürfen 1.000.000.000 nicht überschreiten, und Miter-Limits müssen zwischen 0 und 1.000.000 bleiben

Tatsächliche verschachtelte Transparenzeffekte sind auf acht Ebenen begrenzt, passend zum nativen Renderer, unabhängig vom SVG-Baumtiefenlimit; gewöhnliche verschachtelte Container ohne Transparenzeffekte verbrauchen dieses Kontingent nicht

Transparenzeffekt-Grenzen müssen endlich sein, und jede Koordinate muss innerhalb eines absoluten Werts von 1.000.000.000 bleiben; Importe außerhalb dieses begrenzten Koordinatenprofils schlagen fehl, bevor Gruppe oder Maske registriert werden

Fehlgeschlagene Importe rollen erzeugte Objekte, eingebettete Text-Forms, Registrierungseinträge sowie Versions- und Gerätefarben-Zustand zurück, sodass Aufrufer dasselbe Dokument wiederverwenden und eine umschließende Graph-Transaktion bewahren können

Skripte, Ereignishandler, DTDs, foreignObject, nicht unterstützte Daten-Media-Types, JavaScript-URLs und externe Paint- oder Bildressourcen-URLs schlagen sicher ab

Fragmentreferenzen wie url(#gradient), url(#clip) und href="#symbol" bleiben innerhalb des geparsten Dokuments und lösen niemals einen Datei- oder Netzwerkzugriff aus

Statistiken

THPDFSVGImportStatistics meldet Knoten, CSS-Regeln, Gradienten, Gradient-Striche, Masken, Bilder, Links, Text-Runs, isolierte Deckkraftgruppen über GroupCount sowie die kombinierten erzeugten Haupt-, Pattern-, Mask- und Gruppenoperator-Bytes

HPDFBuildSVGFormData macht den begrenzten Parser separat über THPDFSVGFormData und THPDFSVGLinkInfo zugänglich, für Aufrufer, die Forminhalt, intrinsische Abmessungen, Deckkraftressourcen, Bild-Payloads, Pattern- und Mask-Streams, Text-Ressourcennamen oder Link-Metadaten vor der Registrierung benötigen; Groups liefert die isolierten Gruppenoperator-Streams und konservativen Form-Grenzen

Beispiel

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

Siehe auch: THotPDF.ImportSVGFormXObject, THPDFPage.DrawSVGFormXObject, HTML5-Paged-Media-Import