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
- Die Geometrie umfasst Pfade mit elliptischen Bögen, Rechtecke, abgerundete Rechtecke, Kreise, Ellipsen, Linien, Polylinien, Polygone, Transformationen, Gruppen, Symbole und reine Fragment-
use-Referenzen - Die Malerei umfasst einfarbige RGB-Farben, Füll- und Stroke-Deckkraft, Füllregeln, Line-Caps und -Joins, geerbte Dash-Arrays und Offsets, Miter-Limits, lineare und radiale Gradienten-Vektorbänder, Gradient-Striche auf Basis farbiger Tiling-Patterns sowie Clip-Pfade
- Objekt- und Gruppen-Deckkraft verwenden isolierte Vektor-Transparenz-Forms, sodass sich überlappende Nachfahren zusammensetzen, bevor ihre umschließende Deckkraft angewendet wird
- Masken werden zu Transparenzgruppen-Form-Ressourcen mit PDF-Alpha- oder Luminosity-Soft-Masks, einschließlich Mask-Region-Clipping,
maskUnits,maskContentUnitsund begrenzten verschachtelten Mask-Referenzen - CSS umfasst eingebettete Typ-, Klassen-, ID- und zusammengesetzte Selektoren, Präsentationsattribute, Inline-Stile, Spezifität, Quellreihenfolge und
!important - Dokumentimporte betten Unicode-Font-Subsets und
ToUnicode-Maps über die native Authoring-Engine ein, verwenden die konfigurierten Font-Fallback-Ketten, richten Fallback-Runs an einer gemeinsamen alphabetischen Baseline aus und berechnen die Textverankerung aus tatsächlichen Glyph-Advances - Eingebettete PNG- und JPEG-Bilder werden zu wiederverwendbaren Image XObjects, bewahren PNG-Alpha als Soft-Mask und unterstützen
preserveAspectRatio="none", zentriertesmeetund zentriertesslice - HTTP-, HTTPS- und Mail-Links werden als platzierungsbewusste PDF-Link-Annotationen beibehalten, ohne Teil des wiederverwendbaren Form-Streams zu werden
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