SVG Form XObject-import
THotPDF.ImportSVGFormXObject parses SVG en gång och registrerar ett återanvändbart PDF-Form-XObject, medan THPDFPage.DrawSVGFormXObject placerar det i valfri storlek och valfritt skapar länkanteckningar på sidan
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
- Geometri inkluderar path-er med elliptiska bågar, rektanglar, rundade rektanglar, cirklar, ellipser, linjer, polylinjer, polygoner, transformeringar, grupper, symboler och endast-fragment
use-referenser - Paint inkluderar solida RGB-färger, fyllnads- och streckopacitet, fyllnadsregler, linjekapslar och linjefogar, ärvda streckarrayer och förskjutningar, mitervärden, linjära och radiella gradientvektorband, gradientstreck backade av färgade tiling-mönster samt klippbanor
- Objekt- och gruppopacitet använder isolerade vektorbaserade transparens-Forms, så att överlappande underordnade element komponeras innan den omslutande opaciteten tillämpas
- Masker blir Form-resurser i transparensgrupper med PDF-mjuka Alpha- eller Luminosity-masker, inklusive klippning av maskregion,
maskUnits,maskContentUnitsoch avgränsade nästlade maskreferenser - CSS inkluderar inbäddade typ-, klass-, ID- och sammansatta väljare, presentationsattribut, infogade stilar, specificitet, källordning och
!important - Dokumentimporter bäddar in Unicode-typsnittsdelmängder och
ToUnicode-mappningar via den inbyggda författarmotorn, använder de konfigurerade reservtypsnittskedjorna, riktar reservkörningar mot en gemensam alfabetisk baslinje och beräknar textankring från verkliga glyfsteg - Inbäddade PNG- och JPEG-bilder blir återanvändbara Image XObjects, behåller PNG-alfa som en mjuk mask och stöder
preserveAspectRatio="none", centreradmeetoch centreradslice - HTTP-, HTTPS- och mail-länkar behålls som placeringsmedvetna PDF-länkanteckningar utan att bli en del av den återanvändbara Form-strömmen
Text- och färggränser
Text stöder heldäckt fyllning, fet och kursiv variant, teckenstorlek, transformeringar, ankring, opacitet och geometrisk klippning; gradienttext misslyckas slutet, och varje text- eller tspan-nod förblir en oberoende positionerad körning i stället för en komplett layoutmotor för SVG-textflöde
Dokumenttextimporter behåller vald fet och kursiv stil genom stilmedvetna glyfkontroller och reservlayout, bevarar uppmätta bläckgränser och avvisar verkligt olösta glyfer
UTF-8-text och hexadecimala eller decimala XML-teckenreferenser bevarar samma Unicode-skalärer på Delphi och FPC, inklusive kompletterande skalärer som representeras av UTF-16-surrogatpar
Den fristående överlagringen av HPDFBuildSVGFormData utan textbyggare använder uppmätta Helvetica-, Times- och Courier Base 14-steg och avvisar tecken utanför WinAnsi i stället för att ersätta dem med frågetecken; överlagringen med THPDFSVGTextRunBuilder tar emot inbäddade textformer och mått från anroparen
Gradienter behåller den avgränsade vektorbandsapproximationen; transparenta resurser kräver PDF 1.4 och avvisas av den strikta PDF/A-1-profilen
Streckstilar
stroke-dasharray, stroke-dashoffset och stroke-miterlimit fungerar via presentationsattribut, inbäddad CSS, infogade stilar och arv, inklusive grupper och endast-fragment-use-instanser
Streckarrayer accepterar tal och stödda längder separerade med komma eller blanksteg; procentsatser använder diagonalen i den normaliserade visningsporten, beräknad som sqrt((viewWidth * viewWidth + viewHeight * viewHeight) / 2)
Arrayer med udda längd repeteras till ett mönster med jämn längd, varje delbana börjar om mönstret, och positiva eller negativa förskjutningar lindas runt hela mönstret; none och helt nollställda arrayer ger heldäckta streck
Streck med noll längd behåller runda eller fyrkantiga kappmärken; vanliga heldäckta streck, gradientstreckmönster, klippningar, masker och isolerade opacitetsgrupper delar de valda streckinställningarna
Standardmitervärdet är 4; SVG 2-värden mellan 0 och 1 godtas och använder fasfogar där en mitervinkel skulle överskrida gränsen, medan gradient- och transparensresursgränser behåller skarpa fogar inom den valda gränsen
Inbyggd rendering använder avgränsad streckgeometri för att behålla förskjutningar, bråktalslängder och arrayer längre än GDI-penngränsen, med adaptiv kurvplattning och sammanhängande målade fogar över segmentgränserna
Kalibrering av streck med pathLength ligger fortfarande utanför denna profil; former som kombinerar en icke-heldäckt streckarray med pathLength misslyckas slutet i stället för att tyst använda okalibrerade längder
Strecksemantiken följer SVG 2-streckmodellen inom de parser- och renderingsbudgeter som beskrivs nedan
Konfiguration av text-shaping
Inbäddad SVG-text använder det importerande dokumentets inställningar för ShapingFeatures, AutoShapeArabic, AutoShapeSyriac, AutoShapeNko, AutoShapeAdlam och AutoShapeHanifiRohingya, tillsammans med dess GSUB-skript- och språkval samt reservtypsnittskedjor
Dessa inställningar tillämpas vid både uppmätta steg och genererade textutseenden utan att ändra anroparens konfiguration; shaping förblir opt-in och kräver ett typsnitt som tillhandahåller de begärda glyferna och OpenType-tabellerna
Varje genererat textutseende accepterar högst 256 olika shaping-typsnittsval och 64 MiB kumulativ rå typsnittsdata; typsnittsdata som inte stöds eller en överskriden gräns misslyckar importen atomärt
Objekt- och gruppopacitet
opacity tillämpas en gång på hela det målade resultatet av sin nod och ärvs inte av underordnade element; fill-opacity och stroke-opacity behåller sina separata ärvda färgvärden
Två överlappande täckande röda rektanglar inuti <g opacity="0.5"> förblir lika genomskinliga i sin överlappning, medan två oberoende genomskinliga rektanglar blir mörkare där de överlappar
Nästlade grupper komponeras i ordning: två omslutande opaciteter på 0,5 ger en effektiv 0,25 över en täckande efterkommande, och en efterkommandes explicita opacitet på 1 åsidosätter inte sin omslutande grupp
Rot-SVG-noder, containrar, länkar, fragmentreferenser, text, bilder och former använder samma väg för objektopacitet; endast-fragment-use-referenser bevarar både instansens och den refererade nodens stilar
Fyllnads- och streckalfa förblir oberoende, även i sin överlappning inuti ett genomskinligt objekt, och gradientstoppars alfa kombineras med relevant färgalfa före objektkomponeringen
Klipp- och maskeffekter tillhör sin nod i stället för att ärvas som underordnade färginställningar; länkgeometrin förblir placeringsmedveten, och isolerade Form-gränser behåller konservativt transformerade streck och kappor
Importören behåller vektoroperatorer, inbäddade text-Forms, bildresurser, mönster och masker inuti isolerade grupper; den plattar inte ut hela SVG:en till en bitmapp
Det stödda beteendet följer SVG:s modell för objekt- och gruppopacitet; de övriga avgränsade text-, gradient- och geometribegränsningarna på denna sida gäller fortfarande
Säkerhet och budgeter
Importören accepterar vanlig eller gzip-komprimerad SVG upp till 8 MiB, begränsar expanderad indata till 32 MiB, kombinerade huvud-, mönster-, mask- och gruppoperatorer till 16 MiB, noder till 4 096, nästling till 64 nivåer, CSS-regler till 256 och path-värden till 100 000
Inbäddade bilder accepterar endast strikta Base64-nyttolaster data:image/png;base64, och data:image/jpeg;base64,, med högst 128 bilder, 16 384 pixlar per dimension och 16 777 216 avkodade pixlar över alla bilder; dimensioner kontrolleras före inbyggd avkodning
Text begränsas till 128 körningar och 65 536 UTF-16-enheter per körning, och gradientstreckmönster, masker samt isolerade opacitetsgrupper till 128 resurser vardera; rekursiva maskreferenser misslyckas slutet
Streckarrayer innehåller högst 64 källposter före udda-array-expansion; positiva poster måste vara minst 0,000001 användarenheter, enskilda längder och den normaliserade cykeln får inte överstiga 1 000 000 000, absoluta förskjutningar får inte överstiga 1 000 000 000, och mitervärden måste ligga mellan 0 och 1 000 000
Faktiska nästlade transparenseffekter begränsas till åtta nivåer för att matcha den inbyggda renderaren, oberoende av SVG-träddjupet; vanliga nästlade containrar utan transparenseffekter förbrukar inte denna anspråkskvot
Gränser för transparenseffekter måste vara ändliga, och varje koordinat måste ligga inom ett absolut värde av 1 000 000 000; importer utanför denna avgränsade koordinatprofil misslyckas före grupp- eller maskregistrering
Misslyckade importer rullar tillbaka genererade objekt, inbäddade text-Forms, registerposter samt versions- och enhetsfärgtillstånd, så att anropare kan återanvända samma dokument och bevara en omslutande graftransaktion
Skript, händelsehanterare, DTD:er, foreignObject, datamedietyper som inte stöds, JavaScript-URL:er och externa färg- eller bildresurs-URL:er misslyckas slutet
Fragmentreferenser som url(#gradient), url(#clip) och href="#symbol" förblir inne i det tolkade dokumentet och utlöser aldrig fil- eller nätverksåtkomst
Statistik
THPDFSVGImportStatistics rapporterar noder, CSS-regler, gradienter, gradientstreck, masker, bilder, länkar, textkörningar, isolerade opacitetsgrupper via GroupCount samt kombinerade genererade huvud-, mönster-, mask- och gruppoperatorbyte
HPDFBuildSVGFormData exponerar den avgränsade parsern separat genom THPDFSVGFormData och THPDFSVGLinkInfo för anropare som behöver Form-innehåll, inneboende dimensioner, opacitetsresurser, bildnyttolaster, mönster- och maskströmmar, textresursnamn eller länkmetadata före registrering; Groups tillhandahåller de isolerade gruppoperatorströmmarna och konservativa Form-gränser
Exempel
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 även: THotPDF.ImportSVGFormXObject, THPDFPage.DrawSVGFormXObject, HTML5-sidmedieimport