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

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