HotPDF izvozi stran katerega koli naloženega dokumenta PDF v samostojno oznako SVG z enim samim klicem, BuildLoadedPageSVG, ki vrne celoten dokument SVG kot niz. Izvožena oznaka vsebuje geometrijo strani, besedilo kot prave elemente SVG text, vdelane rastrske slike in stanje poteze, ki so ga operatorji PDF vzpostavili ob vsaki risalni operaciji
Prav pri tem delu se večina domačih pretvornikov tiho sesuje. Pretvorba PDF-strani v SVG je videti kot problem koordinat, v resnici pa je problem stanja. PDF je skladovni stroj, katerega grafično stanje se spreminja med interpretacijo vsebinskega toka; SVG pa je deklarativno drevo, v katerem vsak element nosi svoje lastne predstavitvene atribute. Karkoli interpreter ne zajame v trenutku, ko je element izpisan, v izhodu preprosto izgine, napaka pa je tiha: dobite veljaven SVG, ki upodobi rahlo napačno stran
Zakaj se PDF-stran ne pretvori kar tako v SVG?
Tri neskladja pretvorbo naredijo netrivialno, vsa tri pa dajo izhod, ki je videti verodostojen, dokler ga ne primerjate neposredno z izvirnikom. Prvo je os y. Uporabniški prostor PDF narašča navzgor od spodnjega levega vogala strani; SVG pa narašča navzdol od zgornjega levega vogala. Eno samo zrcaljenje na ravni strani popravi risalne koordinate, nato pa pokvari vsak znak, ker zrcaljenje celotnega platna zrcali tudi oblike črk
Drugo neskladje je dedovanje. V PDF operatorja q in Q potisneta na sklad oziroma odstranita s sklada grafično stanje, ki vključuje debelino črte, obliko konice črte, obliko stika črt, mejo zošiljenja, vzorec črtkanja, fazo črtkanja in alfo. V SVG element, ki atributa ne navede, ga podeduje od nadrejene skupine, kar je povsem drugačno pravilo obsega. Izvoznik, ki sledi le trenutni transformacijski matriki in pozabi na stanje poteze, dopusti, da obnovljeno stanje po Q uide v elemente, ki sledijo
Tretje je, da PDF več stvari izraža po dogovoru in ne po vrednosti. Oblike konic in stikov črt so celoštevilske vrednosti, ničelna debelina črte pomeni las tanko črto v prostoru naprave in ne nevidne črte, zvezdičaste različice operatorjev risanja pa spremenijo pravilo ovijanja namesto barve. Vsako od tega je treba prevesti, ne le prekopirati
En klic za običajen primer
Za običajno nalogo izvoza strani za spletni pregledovalnik, orodje za primerjavo razlik ali predajo oblikovalcem je površina API ena sama funkcija. BuildLoadedPageSVG sprejme od nič štet indeks strani v trenutno naloženem dokumentu in vrne dokument SVG kot AnsiString:
var
Pdf: THotPDF;
I: Integer;
Svg: AnsiString;
Output: TFileStream;
begin
Pdf := THotPDF.Create(nil);
try
if Pdf.LoadFromFile('statements.pdf', '') <= 0 then
Exit; // LoadFromFile vrne število strani
for I := 0 to Pdf.LoadedPageCount - 1 do
begin
Svg := Pdf.BuildLoadedPageSVG(I);
if Length(Svg) = 0 then
Continue;
Output := TFileStream.Create(Format('page-%d.svg', [I + 1]), fmCreate);
try
Output.WriteBuffer(Svg[1], Length(Svg));
finally
Output.Free;
end;
end;
finally
Pdf.Free;
end;
end;
Enak izvoz je na voljo tudi prek ukaza export-svg orodja HotPDF za ukazno vrstico, kar je uporabno v gradbenih cevovodih in regresijskih skriptah, kjer želite besedilno primerljiv zapis strani, ne da bi napisali eno samo vrstico kode v Pascalu. Ker je SVG besedilo, je naraven spremljevalec rastrski poti, opisani v upodabljanju PDF-strani v bitno sliko: bitna slika pove, kako stran izgleda, SVG pa pove, iz česa je sestavljena
Kako se besedilo PDF preslika na elemente besedila SVG?
HotPDF sestavi verigo besedilnih matrik kot predpono krat CTM krat besedilna matrika krat zrcaljenje znaka, pri čemer je zrcaljenje znaka desno množenje z matrix(1,0,0,-1,0,0). Ta desni faktor obstaja izključno zato, da izniči navpično zrcaljenje na ravni strani za oblike znakov, saj bi se besedilo SVG, narisano v zrcaljenem lokalnem okviru, sicer prikazalo narobe obrnjeno. Če je popravek v matriki in ne v posebej obravnavani kodi, to pomeni, da zasukano, zrcaljeno in poševno besedilo vedno izpade pravilno brez dodatnih vej
Vodoravno postavljanje uporablja večvrednostno skladnjo x elementa SVG text, eno koordinato na znak, seštevano iz vsakega pomika znaka ter takrat veljavnega razmika med znaki Tc in razmika med besedami Tw. Vodoravno merilo Tz je vključeno v stolpca a in c besedilne matrike namesto ločeno izpisano, tako da pregledovalnik, ki prezre eksotične atribute besedila, vsak znak vseeno postavi tja, kamor ga je postavil PDF. Besedilo, ustvarjeno s kompleksnim oblikovanjem znakov, opisanim v oblikovanju besedila zapletenih pisav, gre po isti poti, saj je oblikovalnik gruče znakov do trenutka interpretacije vsebinskega toka že razrešil v postavljene znake
Zasuk in slike: dve zrcaljenji, ki ju je zlahka zamenjati
Stran z neničelnim vnosom /Rotate potrebuje predhodno transformacijo, sestavljeno iz zrcaljenja glede na višino zasukanega platna in zasuka, izraženega v prikazovalnem prostoru z osjo y navzgor. Tri matrike zasuka so (0,-1,1,0,0,W) za 90 stopinj, (-1,0,0,-1,W,H) za 180 stopinj in (0,1,-1,0,H,0) za 270 stopinj, pri čemer sta W in H dimenziji strani pred zasukom. Ročno izpeljevanje teh matrik vabi k napakam v predznaku na natanko treh mestih, zato jih izvoznik sestavi prek istega postopka množenja matrik, ki obravnava vsako drugo transformacijo
Vdelane slike potrebujejo svoje lastno zrcaljenje, ker slikovni prostor PDF postavi prvo vrstico vzorcev na zgornji rob enotskega kvadrata, medtem ko element SVG image uporablja lokalni okvir z osjo y navzdol. Izpisana transformacija je zato CTM, desno pomnožen z matrix(1,0,0,-1,0,1). Napaka na tem mestu ustvari navpično zrcaljene fotografije na sicer popolni strani, kar je vrsta napake, ki jo pregledovalec opazi takoj, avtomatiziran test pa pogosto ne
Kaj naprava za grafično stanje dejansko ohrani?
HotPDF operatorje stanja poteze w, J, j, M in d posreduje prek ločenega, izbirnega vmesnika naprave, tako da je bila zvestoba poteze dodana brez spremembe vtable obstoječe naprave za vsebino in brez porušitve binarne združljivosti s kodo, zgrajeno za starejše različice. Konkretno izvožen SVG prejme prevedene ključne besede namesto surovih celih števil PDF:
// Celoštevilske naštevne vrednosti PDF postanejo ključne besede SVG
// oblika konice črte 0, 1, 2 -> butt, round, square
// oblika stika črt 0, 1, 2 -> miter, round, bevel
//
// Ničelna debelina črte v PDF pomeni las tanko črto v prostoru naprave,
// zato izvoznik izpiše vector-effect="non-scaling-stroke", da ostane
// poteza vidna in po CTM široka približno en slikovni element naprave
//
// f* B* b* izberejo pravilo lihe-sode (even-odd) in izpišejo fill-rule="evenodd",
// f B b pa ohranijo privzeto vrednost SVG nonzero
Obnovitev stanja ob Q hkrati zajame prosojnost, debelino črte, obliko konice, obliko stika, mejo zošiljenja, vzorec črtkanja in fazo črtkanja. Gnezdeni Form XObjecti na svojih mejah zajamejo in obnovijo isti popolni nabor, tako da vzorec črtkanega roba, definiranega znotraj žiga, ne more uiti v vsebino strani, ki sledi. Če iz drugih razlogov že sledite obrezovanju in vedenju CTM, gre za isti model stanja, kot se pojavi pri uvozu vektorjev EMF in WMF, le da teče v nasprotno smer
Omejitve, ki jih velja poznati, preden izdelek pošljete v produkcijo
Izvoznik je odkrit glede svojega obsega, spoznavanje robov vnaprej pa je ceneje kot njihovo odkrivanje v produkciji. Barva doseže napravo SVG prek operatorjev rg, RG, g in G. Polnila, vzpostavljena prek barvnega prostora skupaj z scn, kar je način, kako se rišejo barve Separation, DeviceN in ICCBased, do naprave ne pridejo kot razrešena trojica RGB, zato strani, ki tako uporabljajo direktne barve, izvozijo svojo geometrijo, ne pa tudi teh barv. Za vire, namenjene tisku, namesto tega rastrizirajte ali najprej sploščite direktne barve; sam model risanja je opisan v upodabljanju direktnih barv Separation in DeviceN
Dve manjši opombi prihranita čas pri odpravljanju napak. Šestnajstiški barvni literali so izpisani z velikimi črkami, zato test, ki preverja #ff0000, spodleti proti povsem pravilnemu #FF0000. Naprava SVG je poleg tega štetja sklicev prek svojega vmesnika, kar pomeni, da je njena sprostitev stvar tega, da vmesnik pade iz obsega, ne pa klica Free na objektu, kar je razlika, ki je pomembna, če napravo razširite tako, da poleg vsebine strani izpisuje tudi lastno oznako
Izvoz v SVG se naravno poveže s strukturno primerjavo, kadar morate vedeti, ali se je ustvarjeni dokument med dvema izgradnjama res spremenil. Širši nabor orodij za naložene dokumente, od upodabljanja prek urejanja do izvoza, je dokumentiran na strani komponente HotPDF PDF za Delphi