Import af SVG Form XObject
THotPDF.ImportSVGFormXObject parser SVG én gang og registrerer ét genanvendeligt PDF Form XObject, mens THPDFPage.DrawSVGFormXObject placerer det i enhver størrelse og valgfrit opretter sidelinkannoteringer
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
- Geometrien omfatter stier med elliptiske buer, rektangler, afrundede rektangler, cirkler, ellipser, linjer, polylinjer, polygoner, transformationer, grupper, symboler og fragment-kun
use-referencer - Maling omfatter solide RGB-farver, fill- og stroke-opacitet, fill-regler, linjeender og -samlinger, nedarvede dash-arrays og -offsets, miter-grænser, lineære og radiale gradientvektorbånd, gradient-strokes bakket op af farvede tiling-mønstre og clip-paths
- Objekt- og gruppeopacitet bruger isolerede vektor-gennemsigtigheds-Forms, så overlappende efterkommere komponeres, før den omsluttende opacitet anvendes
- Masker bliver transparency-group Form-ressourcer med PDF Alpha- eller Luminosity-softmasker, inklusive maskeområdeklipning,
maskUnits,maskContentUnitsog afgrænsede nestede maskereferencer - CSS omfatter indlejrede type-, klasse-, ID- og sammensatte selektorer, præsentationsattributter, inline-stile, specificitet, kilderækkefølge og
!important - Dokumentimports indlejrer Unicode-font-subsets og
ToUnicode-maps gennem den native authoring-engine, bruger de konfigurerede font-fallback-kæder, justerer fallback-runs til en fælles alfabetisk basislinje og beregner tekstforankring ud fra faktiske glyph-fremskridt - Indlejrede PNG- og JPEG-billeder bliver til genanvendelige Image XObjects, bevarer PNG-alfa som en softmaske og understøtter
preserveAspectRatio="none", centreretmeetog centreretslice - HTTP-, HTTPS- og mail-links bevares som placeringsbevidste PDF-linkannoteringer uden at blive en del af den genanvendelige Form-strøm
Tekst- og malegrænser
Tekst understøtter solid fyld, fed- og kursiv-varianter, fontstørrelse, transformationer, forankring, opacitet og geometrisk klipning; gradient-tekstmaling fejler lukket, og hver tekst- eller tspan-node forbliver et uafhængigt positioneret run snarere end en komplet SVG-tekstflow-layoutmotor
Dokumenttekst-imports bevarer det valgte fed/kursiv-skriftsnit gennem stilbevidste glyph-kontroller og fallback-layout, fastholder målte ink-grænser og afviser reelt uafklarede glyffer
UTF-8-tekst og hexadecimal eller decimal XML-tegnreferencer bevarer de samme Unicode-skalare i Delphi og FPC, inklusive supplerende skalare repræsenteret ved UTF-16-surrogatpar
Det selvstændige HPDFBuildSVGFormData-overload uden tekstbygger bruger målte Helvetica-, Times- og Courier Base 14-fremskridt og afviser tegn uden for WinAnsi i stedet for at erstatte med spørgsmålstegn; overloadet med THPDFSVGTextRunBuilder accepterer kalder-leverede indlejrede tekstformer og metrikker
Gradienter bevarer den afgrænsede vektorbåndstilnærmelse; transparente ressourcer kræver PDF 1.4 og afvises af strict PDF/A-1-profilen
Stroke-stile
stroke-dasharray, stroke-dashoffset og stroke-miterlimit virker gennem præsentationsattributter, indlejret CSS, inline-stile og nedarvning, inklusive grupper og fragment-kun use-instanser
Dash-arrays accepterer tal adskilt af komma eller mellemrum og understøttede længder; procentdele bruger den normaliserede viewport-diagonal, beregnet som sqrt((viewWidth * viewWidth + viewHeight * viewHeight) / 2)
Arrays med ulige længde gentages til et mønster med lige længde, hver delkurve starter mønsteret forfra, og positive eller negative offsets wrappes rundt om det komplette mønster; none og arrays med kun nul giver solide streger
Malede dash-segmenter med længden nul bevarer runde eller kvadratiske endemærker; almindelige solide streger, gradient-stroke-mønstre, klip, masker og isolerede opacitetsgrupper deler de valgte stroke-indstillinger
Standard mitre-grænsen er 4; SVG 2-værdier mellem 0 og 1 accepteres og bruger bevel-samlinger, hvor en miter ville overskride grænsen, mens gradient- og gennemsigtighedsressourcers grænser bevarer skarpe samlinger inden for den valgte grænse
Native rendering bruger afgrænset dash-geometri til at bevare offsets, brøkdellængder og arrays længere end GDI-pen-grænsen, med adaptiv kurveudfladning og sammenhængende malede samlinger på tværs af segmentgrænser
Kalibrering af dash med pathLength ligger stadig uden for denne profil; figurer, der kombinerer et ikke-solidt dash-array med pathLength, fejler lukket i stedet for lydløst at bruge ukalibrerede længder
Stroke-semantikken følger SVG 2 stroke-modellen inden for de parser- og rendererbudgetter, der er beskrevet nedenfor
Tekstformningskonfiguration
Indlejret SVG-tekst bruger det importerende dokuments ShapingFeatures-, AutoShapeArabic-, AutoShapeSyriac-, AutoShapeNko-, AutoShapeAdlam- og AutoShapeHanifiRohingya-indstillinger sammen med dets GSUB-script- og sprogvalg samt font-fallback-kæder
Disse indstillinger gælder både ved målte fremskridt og genererede tekst-appearances uden at ændre kalderens konfiguration; formning forbliver opt-in og kræver en font, der leverer de anmodede glyffer og OpenType-tabeller
Hver genereret tekst-appearance accepterer højst 256 distinkte formningsfontvalg og 64 MiB kumulativ rå fontdata; ikke-understøttet fontdata eller en overskredet grænse fejler importen atomært
Objekt- og gruppeopacitet
opacity anvendes én gang på det komplette malede resultat af sin node og nedarves ikke af efterkommere; fill-opacity og stroke-opacity bevarer deres separate nedarvede maleværdier
To overlappende uigennemsigtige røde rektangler inde i <g opacity="0.5"> forbliver lige gennemsigtige i deres overlap, mens to uafhængigt gennemsigtige rektangler bliver mørkere, hvor de overlapper
Nestede grupper komponerer i rækkefølge: to omsluttende opaciteter på 0,5 giver en effektiv 0,25 over en uigennemsigtig efterkommer, og en efterkommeres eksplicitte opacitet på 1 tilsidesætter ikke dens omsluttende gruppe
Rod-SVG-noder, containere, links, fragmentreferencer, tekst, billeder og figurer bruger samme objektopacitetsvej; fragment-kun use-referencer bevarer både instansens og den refererede nodes stilarter
Fill- og stroke-alfa forbliver uafhængige, også i deres overlap inde i et translucent objekt, og gradientstop-alfa kombineres med den relevante male-alfa før objektkomponering
Klip- og maskeeffekter hører til deres node i stedet for at nedarves som efterkommer-maleindstillinger; linkgeometrien forbliver placeringsbevidst, og isolerede Form-grænser bevarer konservativt transformerede streger og ender
Importøren bevarer vektoroperatorer, indlejrede tekst-Forms, billedressourcer, mønstre og masker inde i isolerede grupper; den fladgør ikke hele SVG'en til en bitmap
Den understøttede adfærd følger SVG-modellen for objekt- og gruppeopacitet; de øvrige afgrænsede tekst-, gradient- og geometrirestriktioner på denne side gælder stadig
Sikkerhed og budgetter
Importøren accepterer almindelig eller gzip-komprimeret SVG op til 8 MiB, afgrænser udvidet input til 32 MiB, kombinerede main-, pattern-, maske- og gruppeoperatorer til 16 MiB, noder til 4.096, nestning til 64 niveauer, CSS-regler til 256 og stiværdier til 100.000
Indlejrede billeder accepterer kun strict Base64 data:image/png;base64,- og data:image/jpeg;base64,-payloads med højst 128 billeder, 16.384 pixels pr. dimension og 16.777.216 afkodede pixels på tværs af alle billeder; dimensionerne kontrolleres før native dekodning
Teksten er afgrænset til 128 runs og 65.536 UTF-16-enheder pr. run, og gradient-stroke-mønstre, masker og isolerede opacitetsgrupper til 128 ressourcer hver; rekursive maskereferencer fejler lukket
Dash-arrays indeholder højst 64 kildeposter før ulige-array-udvidelse; positive poster skal være mindst 0,000001 brugerenheder, individuelle længder og den normaliserede cyklus må ikke overstige 1.000.000.000, absolutte offsets må ikke overstige 1.000.000.000, og mitre-grænser skal ligge mellem 0 og 1.000.000
Faktiske nestede gennemsigtighedseffekter er begrænset til otte niveauer for at matche den native renderer, uafhængigt af SVG-trædybdegrænsen; almindelige nestede containere uden gennemsigtighedseffekter forbruger ikke denne ramme
Grænser for gennemsigtighedseffekter skal være endelige, og hver koordinat skal forblive inden for en absolut værdi på 1.000.000.000; imports uden for denne afgrænsede koordinatprofil fejler, før gruppe- eller maskeregistrering
Fejlede imports ruller genererede objekter, indlejrede tekst-Forms, registry-poster samt versions- og device-farvetilstand tilbage, så kaldere kan genbruge samme dokument og bevare en omsluttende graftransaktion
Scripts, hændelseshåndteringer, DTD'er, foreignObject, ikke-understøttede datamediatyper, JavaScript-URL'er og eksterne male- eller billedressource-URL'er fejler lukket
Fragmentreferencer som url(#gradient), url(#clip) og href="#symbol" forbliver inde i det parsede dokument og udløser aldrig fil- eller netværksadgang
Statistik
THPDFSVGImportStatistics rapporterer noder, CSS-regler, gradienter, gradient-strokes, masker, billeder, links, tekstruns, isolerede opacitetsgrupper gennem GroupCount samt kombinerede genererede main-, pattern-, maske- og gruppeoperatorbyte
HPDFBuildSVGFormData eksponerer den afgrænsede parser separat gennem THPDFSVGFormData og THPDFSVGLinkInfo for kaldere, der behøver Form-indhold, iboende dimensioner, opacitetsressourcer, billed-payloads, pattern- og maskestrømme, tekstressourcenavne eller linkmetadata før registrering; Groups leverer de isolerede gruppeoperatorstrømme og konservative Form-grænser
Eksempel
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
);
Se også: THotPDF.ImportSVGFormXObject, THPDFPage.DrawSVGFormXObject, HTML5-paged-mediaimport