SVG-Form-XObject-import
THotPDF.ImportSVGFormXObject parset SVG eenmaal en registreert één herbruikbare PDF-Form-XObject, terwijl THPDFPage.DrawSVGFormXObject deze op elke grootte plaatst en optioneel pagina-koppelingsannotaties maakt
Declaratie
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
);
Vector-profiel
- Geometrie omvat paden met elliptische bogen, rechthoeken, afgeronde rechthoeken, cirkels, ellipsen, lijnen, polylijnen, polygonen, transformaties, groepen, symbolen en fragment-alleen-
use-referenties - Verf omvat effen RGB-kleuren, vul- en lijnopaciteit, vulregels, lijnkappen en -verbindingen, overgeërfde dash-arrays en -offsets, miter-limieten, lineaire en radiale gradient-vectorbanden, gradientlijnstreken op basis van gekleurde tiling-patronen en clip-paden
- Object- en groepsopaciteit gebruiken geïsoleerde vectortransparantie-Forms, zodat overlappende afstammelingen compositeren voordat hun omhullende opaciteit wordt toegepast
- Maskers worden transparantiegroep-Form-resources met PDF-Alpha- of Luminosity-softmasks, inclusief maskerregio-clipping,
maskUnits,maskContentUnitsen begrensde geneste maskverwijzingen - CSS omvat ingesloten type-, klasse-, ID- en samengestelde selectors, presentatiekenmerken, inline-stijlen, specificiteit, volgorde van bron en
!important - Documentimports embedden Unicode-fontsubsets en
ToUnicode-maps via de native authoring-engine, gebruiken de geconfigureerde font-fallbackketens, richten fallbackreeksen op een gemeenschappelijke alfabetische baseline en berekenen tekstankers op basis van echte glyph-advances - Ingesloten PNG- en JPEG-afbeeldingen worden herbruikbare Image XObjects, behouden PNG-alfa als softmask en ondersteunen
preserveAspectRatio="none", gecentreerdemeeten gecentreerdeslice - HTTP-, HTTPS- en mail-koppelingen worden behouden als plaatsingsbewuste PDF-koppelingsannotaties zonder deel te worden van de herbruikbare Form-stream
Tekst- en verfgrenzen
Tekst ondersteunt effen vulling, vet- en cursiefvarianten, lettergrootte, transformaties, ankers, opaciteit en geometrische clipping; gradienttekstverf faalt gesloten, en elke tekst- of tspan-node blijft een onafhankelijk gepositioneerde reeks in plaats van een volledige SVG-tekstflow-layout-engine
Tekstimports van documenten behouden het gekozen vette of cursieve font door stijlbewuste glyphcontroles en fallback-layout, bewaren gemeten inkgrenzen en weigeren echt onopgeloste glyphs
UTF-8-tekst en hexadecimale of decimale XML-tekensverwijzingen behouden dezelfde Unicode-scalars op Delphi en FPC, inclusief aanvullende scalars die door UTF-16-surroogparen worden weergegeven
De zelfstandige HPDFBuildSVGFormData-overload zonder tekstbouwer gebruikt gemeten Helvetica-, Times- en Courier-Base-14-advances en weigert tekens buiten WinAnsi in plaats van vraagtekens te substitueren; de overload met THPDFSVGTextRunBuilder accepteert door de aanroeper geleverde ingesloten tekstvormen en metrics
Gradients behouden de begrensde vectorbandbenadering; transparante resources vereisen PDF 1.4 en worden door het strikte PDF/A-1-profiel geweigerd
Lijnstijlen
stroke-dasharray, stroke-dashoffset en stroke-miterlimit werken via presentatiekenmerken, ingesloten CSS, inline-stijlen en overerving, inclusief groepen en fragment-alleen-use-instanties
Dash-arrays accepteren door komma's of witruimte gescheiden getallen en ondersteunde lengtes; percentages gebruiken de genormaliseerde viewport-diagonaal, berekend als sqrt((viewWidth * viewWidth + viewHeight * viewHeight) / 2)
Arrays met oneven lengte herhalen zich tot een patroon met even lengte, elk subpad start het patroon opnieuw en positieve of negatieve offsets lopen rond over het volledige patroon; none en all-zero-arrays leveren effen lijnstreken op
Nul-lange geschilderde streepjes behouden ronde of vierkante kapmerken; gewone effen lijnstreken, gradientlijnstreekpatronen, clips, maskers en geïsoleerde opaciteitsgroepen delen de gekozen lijnstreekinstellingen
De standaard miter-limiet is 4; SVG 2-waarden tussen 0 en 1 worden geaccepteerd en gebruiken afgeschuinde verbindingen waar een miter de limiet zou overschrijden, terwijl gradient- en transparantie-resourcegrenzen scherpe verbindingen behouden binnen de gekozen limiet
Native rendering gebruikt begrensde dash-geometrie om offsets, fractionele lengtes en arrays langer dan de GDI-penlimiet te behouden, met adaptieve curve-flattening en doorlopende geschilderde verbindingen over segmentgrenzen heen
Dashkalibratie met pathLength blijft buiten dit profiel; vormen die een niet-effen dash-array combineren met pathLength falen gesloten in plaats van stilletjos ongekalibreerde lengtes te gebruiken
De lijnstreeksemantiek volgt het SVG 2-lijnstreekmodel binnen de hieronder beschreven parser- en rendererbudgetten
Tekst-shapingconfiguratie
Ingesloten SVG-tekst gebruikt de instellingen ShapingFeatures, AutoShapeArabic, AutoShapeSyriac, AutoShapeNko, AutoShapeAdlam en AutoShapeHanifiRohingya van het importerende document, samen met diens GSUB-script- en taalselecties en font-fallbackketens
Deze instellingen gelden tijdens zowel gemeten advances als gegenereerde tekstappearances zonder de configuratie van de aanroeper te wijzigen; shaping blijft opt-in en vereist een font dat de gevraagde glyphs en OpenType-tabellen levert
Elke gegenereerde tekstappearance accepteert maximaal 256 verschillende shaping-fontselecties en 64 MiB cumulatieve ruwe fontdata; niet-ondersteunde fontdata of een overschreden limiet laat de import atomisch falen
Object- en groepsopaciteit
opacity is eenmaal van toepassing op het volledige geschilderde resultaat van zijn node en wordt niet geërfd door afstammelingen; fill-opacity en stroke-opacity behouden hun afzonderlijke overgeërfde verfwaarden
Twee overlappende ondoorzichtig rode rechthoeken binnen <g opacity="0.5"> blijven in hun overlapping even doorschijnend, terwijl twee onafhankelijk doorschijnende rechthoeken donkerder worden waar ze overlappen
Geneste groepen compositeren in volgorde: twee omhullende opaciteiten van 0,5 geven een effectieve 0,25 bovenop een ondoorzichtig afstammeling, en de expliciete opaciteit 1 van een afstammeling overschrijft zijn omhullende groep niet
Hoofd-SVG-nodes, containers, koppelingen, fragmentreferenties, tekst, afbeeldingen en vormen gebruiken hetzelfde objectopaciteitspad; fragment-alleen-use-referenties behouden zowel de stijlen van de instantie als van de gerefereerde node
Vul- en lijn-alfa blijven onafhankelijk, ook op hun overlapping binnen een doorschijnend object, en gradientstop-alfa combineert met de relevante verfalfa vóór objectcompositie
Clip- en maskereffecten horen bij hun node in plaats van als verfinstellingen van afstammelingen te worden geërfd; koppelingsgeometrie blijft plaatsingsbewust en geïsoleerde Form-grenzen behouden conservatief getransformeerde lijnstreken en kappen
De importer behoudt vectoroperators, ingesloten tekst-Forms, afbeeldingsresources, patronen en maskers binnen geïsoleerde groepen; hij zet niet de volledige SVG om naar een bitmap
Het ondersteunde gedrag volgt het SVG-object- en groepsopaciteitsmodel; de overige begrensde tekst-, gradient- en geometriebeperkingen op deze pagina gelden nog steeds
Veiligheid en budgetten
De importer accepteert gewone of gzip-gecomprimeerde SVG tot 8 MiB, begrenst uitgebreide invoer op 32 MiB, gecombineerde hoofd-, patroon-, mask- en groepsoperators op 16 MiB, knooppunten op 4.096, nesting op 64 niveaus, CSS-regels op 256 en padwaarden op 100.000
Ingesloten afbeeldingen accepteren alleen strikte Base64-payloads data:image/png;base64, en data:image/jpeg;base64,, met maximaal 128 afbeeldingen, 16.384 pixels per dimensie en 16.777.216 gedecodeerde pixels over alle afbeeldingen; dimensies worden vóór native decodering gecontroleerd
Tekst is begrensd op 128 reeksen en 65.536 UTF-16-eenheden per reeks, en gradientlijnstreekpatronen, maskers en geïsoleerde opaciteitsgroepen op elk 128 resources; recursieve maskverwijzingen falen gesloten
Dash-arrays bevatten maximaal 64 bronvermeldingen vóór oneven-array-uitbreiding; positieve vermeldingen zijn minstens 0,000001 user units, afzonderlijke lengtes en de genormaliseerde cyclus mogen niet boven 1.000.000.000 uitkomen, absolute offsets niet boven 1.000.000.000, en miter-limieten moeten tussen 0 en 1.000.000 blijven
Echt geneste transparantie-effecten zijn beperkt tot acht niveaus om de native renderer te volgen, onafhankelijk van de SVG-boomdieptelimiet; gewone geneste containers zonder transparantie-effecten verbruiken deze toelage niet
Grenzen van transparantie-effecten moeten eindig zijn en elke coördinaat moet binnen een absolute waarde van 1.000.000.000 blijven; imports buiten dit begrensde coördinatenprofiel falen vóór groeps- of maskregistratie
Mislukte imports rollen gegenereerde objecten, ingesloten tekst-Forms, registry-items en versie- en device-kleurstatus terug, zodat aanroepers hetzelfde document kunnen hergebruiken en een omhullende grafiektransactie kunnen behouden
Scripts, gebeurtenishandlers, DTD's, foreignObject, niet-ondersteunde data-mediatypes, JavaScript-URL's en externe verf- of afbeeldingsresource-URL's falen gesloten
Fragmentreferenties zoals url(#gradient), url(#clip) en href="#symbol" blijven binnen het geparste document en veroorzaken nooit bestands- of netwerktoegang
Statistieken
THPDFSVGImportStatistics meldt knooppunten, CSS-regels, gradiënten, gradientlijnstreken, maskers, afbeeldingen, koppelingen, tekststromen, geïsoleerde opaciteitsgroepen via GroupCount en gecombineerde gegenereerde hoofd-, patroon-, mask- en groepsoperatorbytes
HPDFBuildSVGFormData stelt de begrensde parser afzonderlijk bloot via THPDFSVGFormData en THPDFSVGLinkInfo voor aanroepers die Form-inhoud, intrinsieke dimensies, opaciteitresources, afbeeldingspayloads, patroon- en maskstreams, tekstresourcenamen of koppelingsmetadata vóór registratie nodig hebben; Groups levert de geïsoleerde groepsoperatorstreams en conservatieve Form-grenzen
Voorbeeld
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
);
Zie ook: THotPDF.ImportSVGFormXObject, THPDFPage.DrawSVGFormXObject, HTML5-import van gepagineerde media