SVG Form XObject Import

THotPDF.ImportSVGFormXObject jednou analyzuje SVG a registruje jeden znovupoužitelný Form XObject PDF, zatímco THPDFPage.DrawSVGFormXObject jej umístí v libovolné velikosti a volitelně vytvoří anotace odkazů stránek

Deklarace

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 profile

Text and paint boundaries

Text podporuje plnou výplň, varianty bold a italic, velikost fontu, transformace, ukotvení, opacity a geometrické ořezání; gradientová malba textu selže bezpečně a každý uzel textu nebo tspan zůstává nezávisle pozicovaným během, nikoli kompletním layout enginem textového toku SVG

Importy textu dokumentů si zachovají vybraný řez bold a italic skrze kontroly glyfů citlivé na styl a záložní sazbu, podrží naměřené ink bounds a skutečně nevyřešené glyfy odmítnou

Text UTF-8 a šestnáctkové či desítkové XML znakové reference zachovají na Delphi i FPC tytéž Unicode skaláry, včetně doplňkových skalárů reprezentovaných náhradníkovými páry UTF-16

Samostatné přetížení HPDFBuildSVGFormData bez text builderu používá naměřené posuny Base 14 fontů Helvetica, Times a Courier a znaky mimo WinAnsi odmítne, místo aby je nahradilo otazníky; přetížení s THPDFSVGTextRunBuilder přijímá vložené textové formy a metriky dodané volajícím

Gradienty si zachovávají ohraničenou aproximaci vektorovými pásy; průhledné resource vyžadují PDF 1.4 a přísný profil PDF/A-1 je odmítne

Stroke styles

stroke-dasharray, stroke-dashoffset a stroke-miterlimit fungují přes prezentační atributy, vložené CSS, inline styly a dědičnost, včetně grup a instancí use odkazujících jen na fragmenty

Pole čárkování přijímají čísla oddělená čárkou nebo mezerou a podporované délky; procenta použijí normalizovanou diagonu viewportu, počítanou jako sqrt((viewWidth * viewWidth + viewHeight * viewHeight) / 2)

Pole liché délky se opakují do vzoru sudé délky, každá dílčí cesta restartuje vzor a kladné či záporné offsety se obtáčejí kolem kompletního vzoru; none a pole samých nul vyprodukují plné tahy

Nulově dlouhé vykreslené čárky si ponechají značky koncovek round nebo square; obyčejné plné tahy, patterny gradientových tahů, ořezy, masky i izolované opacity grupy sdílejí zvolená nastavení tahu

Výchozí miter limit je 4; hodnoty SVG 2 mezi 0 a 1 se přijmou a tam, kde by miter limit překročil, použijí spoje bevel, zatímco ohraničení gradientových a transparency resource si v rámci zvoleného limitu ponechají ostré spoje

Nativní vykreslování používá ohraničenou geometrii čárkování, aby si zachovalo offsety, zlomkové délky i pole delší než GDI limit pera, s adaptivním zploštěním křivek a souvislými vykreslenými spoji přes hranice segmentů

Kalibrace čárkování přes pathLength leží mimo tento profil; tvary kombinující neplné pole čárkování s pathLength selžou bezpečně, místo aby potichu použily nekalibrované délky

Sémantika tahů následuje model tahů SVG 2 v rámci rozpočtů parseru a rendereru popsaných níže

Text shaping configuration

Vložený text SVG používá nastavení importujícího dokumentu ShapingFeatures, AutoShapeArabic, AutoShapeSyriac, AutoShapeNko, AutoShapeAdlam a AutoShapeHanifiRohingya, spolu s jeho výběry GSUB skriptu a jazyka a záložními řetězci fontů

Tato nastavení se aplikují při měřených posunech i při generování textových vzhledů, aniž by změnila konfiguraci volajícího; tvarování zůstává opt-in a vyžaduje font dodávající požadované glyfy a OpenType tabulky

Každý generovaný textový vzhled přijme nejvýše 256 odlišných tvarovacích výběrů fontů a 64 MiB kumulativních surových dat fontů; nepodporovaná data fontů nebo překročený limit selžou atomicky v celém importu

Object and group opacity

opacity se aplikuje jednou na kompletní vykreslený výsledek svého uzlu a potomci ji nedědí; fill-opacity a stroke-opacity si zachovávají své oddělené zděděné hodnoty malby

Dva překrývající se neprůhledné červené obdélníky uvnitř <g opacity="0.5"> zůstanou ve svém překryvu stejně průsvitné, zatímco dva nezávisle průsvitné obdélníky budou v překryvu tmavší

Vnořené grupy komponují v pořadí: dvě obklopující opacity 0.5 dají nad neprůhledným potomkem efektivních 0.25 a explicitní opacity 1 u potomka nepřebije jeho obklopující grupu

Kořenové uzly SVG, kontejnery, odkazy, reference na fragmenty, text, obrázky i tvary používají tutéž cestu opacity objektu; reference use jen na fragmenty zachovají styly instance i odkazovaného uzlu

Alfa výplně a tahu zůstávají nezávislé, včetně jejich překryvu uvnitř průsvitného objektu, a alfa stop gradientu se kombinuje s příslušnou alfou malby před komponováním objektu

Efekty ořezu a masek patří svému uzlu, nedědí se jako nastavení malby potomků; geometrie odkazů zůstává citlivá na umístění a izolované hranice Form konzervativně zachovávají transformované tahy a koncovky

Importér si uvnitř izolovaných grup zachovává vektorové operátory, vložené textové Formy, image resource, patterny a masky; celé SVG do bitmapy neslíčuje

Podporované chování následuje model opacity objektů a grup SVG; ostatní ohraničení textu, gradientů a geometrie na této stránce dál platí

Security and budgets

Importér přijímá obyčejné nebo gzip-komprimované SVG do 8 MiB, omezuje rozšířený vstup na 32 MiB, kombinované operátory hlavního obsahu, pattern, masek a grup na 16 MiB, uzly na 4 096, vnoření na 64 úrovní, pravidla CSS na 256 a hodnoty cest na 100 000

Vložené obrázky přijímají jen přísné payloady Base64 data:image/png;base64, a data:image/jpeg;base64,, nejvýše 128 obrázků, 16 384 pixelů na dimenzi a 16 777 216 dekódovaných pixelů napříč všemi obrázky; rozměry se kontrolují před nativním dekódováním

Text je omezen na 128 běhů a 65 536 jednotek UTF-16 na běh a gradientové patterny tahů, masky i izolované opacity grupy na 128 resource každá; rekurzivní reference masek selžou bezpečně

Pole čárkování obsahují před rozšiřováním lichých pole nejvýše 64 zdrojových položek; kladné položky musí být alespoň 0,000001 uživatelské jednotky, jednotlivé délky i normalizovaný cyklus nesmí přesáhnout 1 000 000 000, absolutní offsety nesmí přesáhnout 1 000 000 000 a miter limity musí zůstat mezi 0 a 1 000 000

Skutečné vnořené transparency efekty jsou omezené na osm úrovní, aby odpovídaly nativnímu rendereru, nezávisle na limitu hloubky stromu SVG; obyčejné vnořené kontejnery bez transparency efektů tuto povolenou kvótu nespotřebují

Hranice transparency efektů musí být konečné a každá souřadnice musí zůstat v absolutní hodnotě 1 000 000 000; importy mimo tento ohraničený souřadný profil selžou dřív, než se zaregistrují grupy nebo masky

Neúspěšné importy vrátí zpět vygenerované objekty, vložené textové Formy, položky registrů i stav verzí a device barev, takže volající mohou tentýž dokument znovu použít a zachovat nadřazenou transakci grafu

Skripty, obsluhy událostí, DTD, foreignObject, nepodporované datové typy médií, JavaScript URL a externí URL malby nebo obrazových zdrojů selhávají bezpečně

Reference na fragmenty, jako jsou url(#gradient), url(#clip) a href="#symbol", zůstávají uvnitř analyzovaného dokumentu a nikdy nespouštějí přístup k souborům ani síti

Statistics

THPDFSVGImportStatistics hlásí uzly, pravidla CSS, gradienty, gradientové tahy, masky, obrázky, odkazy, běhy textu, izolované opacity grupy přes GroupCount a kombinované generované bajty operátorů hlavního obsahu, pattern, masek a grup

HPDFBuildSVGFormData vystavuje ohraničený analyzátor samostatně prostřednictvím THPDFSVGFormData a THPDFSVGLinkInfo pro volající, kteří potřebují před registrací obsah Formu, vnitřní rozměry, opacity resource, payloady obrázků, streamy patternů a masek, názvy textových resource nebo metadata odkazů; Groups dodává streamy operátorů izolovaných grup a konzervativní hranice Formu

Example

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
);

Viz také: THotPDF.ImportSVGFormXObject, THPDFPage.DrawSVGFormXObject, HTML5 Paged-Media Import