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
- Geometrie zahrnuje cesty s eliptickými oblouky, obdélníky, zaoblené obdélníky, kružnice, elipsy, čáry, lomené čáry, mnohoúhelníky, transformace, skupiny, symboly a odkazy
usepouze na fragmenty - Malba zahrnuje plné barvy RGB, neprůhlednost výplně a tahu, pravidla výplně, koncovky a spoje čar, zděděná pole čárkování a offsety, miter limity, lineární a radiální pásy vektorových přechodů, gradientové tahy podložené barevnými tiling patterny a ořezové cesty
- Opacity objektů a grup používá izolované vektorové transparency Formy, takže se překrývající potomci komponují dřív, než se aplikuje obklopující opacity
- Masky se stanou Form resource transparency grup s PDF soft maskami Alpha nebo Luminosity, včetně ořezu maskované oblasti,
maskUnits,maskContentUnitsa ohraničených vnořených referencí masek - CSS zahrnuje vložené selektory typu, třídy, ID a složené, prezentační atributy, vložené styly, specifičnost, pořadí zdroje a
!important - Importy dokumentů vkládají podmnožiny Unicode fontů a mapy
ToUnicodepřes nativní autorovací engine, používají nakonfigurované záložní řetězce fontů, zarovnávají záložní běhy na společnou alfabetickou základní linii a počítají ukotvení textu ze skutečných posunů glyfů - Vložené obrázky PNG a JPEG se stanou znovupoužitelnými Image XObjects, zachovají PNG alpha jako soft masku a podporují
preserveAspectRatio="none", centrovanémeeta centrovanéslice - Odkazy HTTP, HTTPS a mail se zachovají jako anotace odkazů PDF citlivé na umístění, aniž by se staly součástí znovupoužitelného Form streamu
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