Tehnički članak

PDF fontovi i tekst: Zašto se glifovi pretvaraju u okvire

PDF koji izgleda savršeno na vašem stroju, a iscrtava se (renders) kao red praznih okvira (boxes) na tuđem je najčešći nedostatak (defect) fonta u softveru za dokumente, i to gotovo nikada ne znači da je tekst pogrešan. Znakovi su netaknuti (intact), kodiranje je u redu, glifovi (glyphs) jednostavno nisu tu. Ono što se promijenilo između dvaju strojeva (machines) jest to koji su fontovi bili instalirani u operativnom sustavu, a jaz (gap) između prijenosne datoteke i krhke (fragile) ovisi o jednoj odluci donesenoj prilikom pisanja stranice: putuje li font unutar PDF-a ili se pretpostavljalo da je prisutan na drugom kraju (far end)

Razumijevanje zašto se to događa i zašto odvojeni kvar (failure) proizvodi tekst koji izgleda pretraživo, a kopira se kao besmislica (gibberish), znači pogledati kako PDF pohranjuje tekst. On ne pohranjuje rečenice. On pohranjuje kodove glifova plus program fonta plus tablice koje preslikavaju (map) jedno na drugo, a svaki bug iscrtavanja ili ekstrakcije živi u praznini (gap) između to troje. Ono što slijedi je obilazak (tour) te mašinerije, utemeljene na ISO 32000, s Delphi pozivima koji je kontroliraju tamo gdje su važni

Znakovi, kodovi i glifovi tri su različite stvari

Rječnik ljudima postavlja zamke jer svakodnevni govor sažima (collapses) tri različite (distinct) ideje u riječ "slovo". Znak (character) je apstraktna jedinica pisanja, ideja velikog slova A, identificirana u Unicodeu kao U+0041. Glif je nacrtani oblik, obris (outline) krivulje i debla koji određeni (particular) font koristi da prikaže (depict) taj znak. Između njih nalazi se kod: bajt ili bajtovi u toku sadržaja koji govore čitaču (viewer) koji glif u trenutnom fontu treba obojiti

PDF radi u kodovima. Kada tok sadržaja prikazuje niz (string), ti su bajtovi indeksi (indices) u aktivnom fontu, a ne Unicode. Kodiranje fonta (encoding) odlučuje da kod 65 znači "nacrtaj glif zaveden pod 65", a ništa u toj operaciji ne zna da rezultat izgleda kao A čovjeku. To je ono zbog čega se PDF jednako (identically) iscrtava svugdje gdje može pronaći glifove, a to je također razlog zašto je ekstrakcija zaseban problem od prikaza (display): crtanje treba samo kod-u-glif (code-to-glyph), čitanje treba kod-u-Unicode (code-to-Unicode), a to su dvije različite tablice koje se mogu ne slagati (disagree) ili nestati (go missing) neovisno (independently)

Vrste fontova s kojima ćete se zapravo sresti

ISO 32000 definira nekoliko vrsta rječnika (dictionary) fontova, a u praksi dokument koji primite ili generirate koristi jedan od tri. Znanje (Knowing) o tome koji od njih gledate objašnjava (explains) većinu onoga što može poći po zlu

Type 1 je Adobeov originalni PostScript obrisni (outline) format, izgrađen od kubičnih (cubic) Bezierovih krivulja. Četrnaest standardnih fontova koje svaki čitač (reader) sukladan sa standardom (conforming) mora isporučiti, obitelji Helvetica, Times, Courier, Symbol i ZapfDingbats, pripadaju tipu Type 1, te rječnik fontova (font dictionary) koji imenuje jedan od njih smije (legally) izostaviti program fonta. To je onaj jedan slučaj u kojem je ostavljanje fonta neugrađenim (unembedded) sigurno (safe) po specifikaciji prije nego pukom srećom. Kod svakog (For any other) lica pod kategorijom Type 1 sam program fonta će potraživati ukrcavanje (embedded) na sam sustav dok se s nasuprotne ne suoči pa s istim sukladnim zamjenskim postavkama obično (substitutes something) to u vizuri promatrača podari oblik bitno ili ne u tolikoj mjeri različit onomu originalno predočenomu

TrueType koristi kvadratne (quadratic) krivulje i došao je iz Apple i Microsoft svijeta. To je ono što je većina (most) sistemskih fontova i ono što ćete (what you will embed) najčešće (most often) ugrađivati (embed). Jednostavan TrueType font unutar PDF formata pripaja si granicu i postupa u jednobajtnim postavkama, uz potporu koje bi sam takav element upravljao sa ukupno 256 navoda od pojedinog puta. Navedeno predstavlja temeljeni povod CJK izlagačima odnosno na račun čega veliki format ne postižu funkcioniranje na pojednostavljenom načinu uobličenja

Type 0, the composite or CID-keyed font (kompozitni ili CID-kodirani font), odgovor je na to (that limit) ograničenje. On koristi višebajtne kodove i CMap da bi iste provukao kroz nasljedne linije CIDFont elementa koji sa samih svojih linija podilaze kategorijama odnosno strukturi CFF/Type 1 podloga. To postavlja osnove te stoga istovremeno izbacuje onaj jedinstveni predočak pisane komunikacije obzirom na nosivu strukturu na kojoj počiva s tisućama znakova tj. na račun kojega i sama uobličenja na primjerice, PDF (Kineskih, Japanskih, Koreanskih pisama) uključuju navode ovoga Type 0 oblika iako ni njihovi kreatori ni svjedoci nimalo na tomu nisu izračunavali planove o istome. Za sam tijek navedeno sačinjava i jednu složenu narav obzirom da na raspoloživost pristiže ogroman broj pokretanih elemenata sa nužnošću beskompromisnoga stanja na objema stranama odnosno izričajem pri prenošenju kao i preuzimanju istih (extraction)

Jedan TrueType font renderiran u 12, 18, 24 i 36 točaka u PDF-u, pokazujući da se jedan ugrađeni obris prilagođava bilo kojoj veličini

Jedan detalj (detail) koji stoji iza te slike pokreće (drives) veličinu datoteke (file size). Font je biblioteka (library) obrisa, a ne bitmape (bitmaps) fiksne veličine, stoga isti ugrađeni program poslužuje (serves) svaku veličinu (point size) na stranici. Promjena veličine (Scaling) je transformacija primijenjena (applied) tijekom iscrtavanja, a upravo je to razlog zašto naslov i pripadajući mu tekst na samom licu sadržavaju i dijele istu isporučenu dimenziju pod čime bi sam format ispisne snage zauzimao izdatak sukladno pismu, nezavisno od dimenzija

Ugrađivanje je razlika između prijenosnog i krhkog

Ugrađivanje (Embedding) znači da je program fonta, stvarni podaci o obrisu (outline data), zapisan (written) u PDF kao tok (stream). Čitač (reader) na stroju koji nikada nije čuo za vaš font čita te obrise (outlines) izravno (straight) iz datoteke i crta točne glifove. Preskočite ugrađivanje i kladite se (betting) da odredište ima font istog imena; kada ga nema, preglednik (viewer) se vraća na (falls back to) zamjenu. Za onih četrnaest (standard fourteen) po osnovi su predodređeni oblici i oni obitavaju uz bezazleni utjecaj pri izvođenjima kod ostalih to kreće sa formacijom u nedovoljno usklađenom pismu k samome krajnjem promašaju odnosno nula prijenosu gdje svaka supstitucija biva zanijekana jer nema navedenog zapisa uopće

Sa (With) HotPDF-om, kontrola leži na osobinama, uz primjenu postavljenom kod (set before) samog pokretanja spomenutoga sadržaja. FontEmbedding nalaže pakiranje i učitavanje izdanja istoga po iscrtavanju istog u prikazu:

var
  Pdf: THotPDF;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := 'report.pdf';
    Pdf.Compression := cmFlateDecode;
    Pdf.FontEmbedding := True;          // obrisi (outlines) putuju unutar datoteke
    Pdf.BeginDoc;
    Pdf.CurrentPage.SetFont('Calibri', [], 11);
    Pdf.CurrentPage.TextOut(72, 760, 0, 'Ovo se iscrtava isto na stroju bez Calibri fonta.');
    Pdf.EndDoc;
  finally
    Pdf.Free;
  end;
end;

Redoslijed (ordering) ne podilazi šminkanju okruženja (not cosmetic). BeginDoc je ovdje gdje HotPDF obvezuje podstavljenu formu strukture kod datoteke obzirom da na istome treba podrediti funkciju FontEmbedding a i samo to mora prethoditi pozivu istoga. Pripojite ga naknadno na isto - nema greške i nema najave upozorenja a ono unatoč tim nedostacima putuje na isporuci i u potpunoj tišini obitava sam sa sobom bez uključenog koda znakovlja (fonts). Ovo označava onu ponajgoru varijantu tehničkih problema (bug) i takvo nešto ostaje skriveno iako prođe i pri svakom testiranju a sve uz prisutnost unutar korisničkoga okruženja tek jer se tamo nalazi taj konkretni podatak pa kod predaje on ne ukazuje po propustu uslijed manjka svjedočenja po kupcu na mjestima iz kojih on ne bi niti mogao uputiti u potpunosti opseg na sporno pri testiranju

Ugrađivanje (Embedding) je također ono što na mjestima susreta samoga odobrenja odnosno licence prolazi mjerila te susreće samo izvedenstvo po rješavanju kod okružja programerija (engineering). Znakovna forma i sâm program sadržavaju smjerokaze obzirom na prepoznavanje pri ukalupljivanju a oni dotiču uvjete za uključenja samo u preglede naspram uskraćivanju i davanju besplatnoga obličja u potpunosti po tim uputama. Proklamiranje istoga leži u obvezi prema (responsibility) odobrenjima i ne uskraćuje prava za djelatnim a niti za to tko podnosi postupak (renderer) već na korisničko a sam pokazatelj za prolaznost "proradilo je" ne označava uskladivost na (allowed) polju pravomoćnosti pa stoga odudara jedno naspram prvotno navedenoga ("it worked" vs. "it was allowed")

Podskupovi (Subsetting): ugradite (embed) samo glifove koje ste koristili

Potpuna ugradnja (Full embedding) ukucava sadržanu kodnu konstrukciju formata unutar pojedinačne spreme tog sustava datoteke (file). Ujedno CJK TrueType format po svojoj veličini proteže se čak preko nekoliko megabajta tako da prenošenje kompletnog znakovlja da bise pokazalo kakvih tucet (dozen) istih stvara potrošnost te opsegom upućuje napor kod samoga umnožavanja obzirom da na izričitosti formata višekratnih listova (multi-page). Pojedinčavanje strukture obzirom na te zapreke preskače spomenuto, sa ugrađivanjem kod čijih formata preslikava upravo one konkretne na samom pozivu dokumentacije. Sukladno usvojenom pristupanju upućuje na proces preimenovanja formatirajući oblik u predznaku oznake obzirom na redoslijed u 6 slova nakon kojih (plus) ukucava ABCDEF+Calibri u cilju samoga spremanja što sa stanjem istog popisa spriječava da i korisnik na listu (reader) usmjeri asocijacije u brkanjima obzirom na samo lica i obuhvatna svojstva spomenutoga, u odnosu k imenjaku svoga izvornika od koga je preraspodijelio strukturu s liste

S aspekta kreiranja izričitosti na općim datotekama navedeno predočenje unutar smanjenih listi (subsetting) uspostavlja onaj ciljani okvir preduvjeta uz postavljeno načelo (default). Time posredno osigurava redovitu podudarnost u dimenzijama naspram količina teksta zaobilazeći opterećenost od izvorne veličine i pri tom poprima uskladivost pri kojoj veliki oblici raznovrsnih uslojenosti jezičnih baza ne potpiruju vlastiti potencijal. Okosnica usložnjavanja, odnosno ta začkoljica (caveat), jest obuhvat u kojem obitava preuzeti okoliš tek sa momentom pri samom uvrštavanju istoga (creation time). Pri usmjeravanju (downstream) s popunjavanjem po sadržajima k dopunjenom izričaju takvih zapisa po formatu u obzir ulazi pomanjkanje tih potrepština pri formi uvrštenosti pa ne pristižu iz opsega gdje ujedno izranjaju ograničenja obzirom na poticanje dorada te i izmjena na zapisima (editing) od strane trećih uzoraka datoteka u obličju onih obujma pod (PDF) formatom

Unicode fontovi i problem CJK kutije (okvira)

Kad uspostava predočenog materijala ne uokvirava navode samo latiničnih slova po osnovama jednostavne upute prečaci (simple-font path) presušuju na ponudama (runs out) s time da tu rješenje nastaje registriranjem Unicode sposobnih formi fontova nakon čega im prepuštate s izričitošću da obave izgrađivanje oblika prepoznatoga (Type 0) stvorenim sa obličja uslijed kojih posredovanje nastaje obzirom na izlaženje s uvrštenosti HotPDF platforme od same nule (from it). Pomoć (RegisterUnicodeTTF) puni (loads) po putanji (by path) sa TrueType pismenosti da bi odmah potome ta registrirana uspostava za navod služila u potporama kod izlaženja kao dio naredaba pod okriljem (SetFont) jednakih funkcija:

Pdf.FontEmbedding := True;
Pdf.RegisterUnicodeTTF('C:\Fonts\NotoSansCJKsc-Regular.ttf');
Pdf.BeginDoc;
Pdf.CurrentPage.SetFont('NotoSansCJKsc-Regular', [], 14);
Pdf.CurrentPage.TextOut(72, 720, 0, '你好,世界 こんにちは 안녕하세요');
Pdf.EndDoc;

Dvije stvari ovdje podilaze k uspjesima na izlaženju a o istome poprimaju i propadnost na krivi potez (make or break this). Po okrilju navedenog potpis iz oblika obvezuje podstavljenu strukturu teksta pokrivanjem, tako pod podstavama za latinice unutar uspostavljenog sustava i ne pristižu pismenosti i izrazi iz primjeraka npr. s kineskim sadržavanjima ne mareći kod molbi, stoga je epilog unutar navoda u obličjima popunjenih okvira ponovno na pragu prepoznavanja jer iz onoga u pravom obliku ni po stajalištima ne podliježe navedenim. Kod tih je također postavljanje pri ukalupljavanju (embedding) zaostataka na ostanku po uključivanju bitno a u cilju održivih podizanja unutar onih tipa 0 pri sklapanju sa postavljenosti TTF jer su bez svrhovite prepoznatljivosti pred samim konzumentima pri pronalaženju iz isprepletenosti ukoliko kod (outlines) pismenosti ne opazi i prispodobivost unutar samog sebe. Pomoć (durable choice) pri onim raznovrsnijim poljima na bazi u materiji predstavlja prisutnost lica čija širokopojasnost podnosi viševrsnost što najjasnije podlaže obličenju unutar Noto kao i postavljenosti uz (Arial Unicode MS) i sve ukazuje kod raznoraznih praksi upravo k navedenome a što stoji pod (embedded and subsetted) smanjenim navedenostima s popisa te integracijama na istima

Zapisana preokrenutost pri unosu s desne k lijevoj po prikazu pridaje složeni preplet za pospješivanje s obličjima čime prelazi (shaping layer) svu predviđenu bazu na vrhu njenih pokrivanja s postavljenosti u radu za prepoznato (coverage). S izvedenicom (HotPDF) nastaje i pripajanje iz (RtLTextOut) te uspostava na prikaz (Arabic and Hebrew), tako ono usmjerava za primanja uz prispodobe uslijed propuštanja po samom obrascu te omogućuje popise i formiranje poslagivanja uslijed navoda (library lay it out). Poklapanje obzirom na prepoznavanje pri jezicima primjerice navoda kod arapskih pisama zahtijeva predviđena podudaranja i to u bazi kod uvrštavanja, nakon kojih prepoznatljivost u obličjima na (shaping), posloženostima po strani kod ispisivanja, ta tri bitno različita polja posluje u prepoznavanju čiji okviri po prikazivanjima znače obezvrijeđenosti bar na bilo kome propustu unutar redoslijeda s liste

Tablica ToUnicode: gdje živi copy-paste (kopiraj-zalijepi)

Sve navedeno u razmatranju odnosi se za predviđena oslikavanja predočenoga tj. u crtanjima. Ekstrakcija stoji sa potpunom okrenutošću, a po vlastitom uzroku pridonosi gubljenju po formi istih (fails for its own reasons). Po navodima vizure on uspostavlja s iscrtavanjima po smjeru te preslikava za pismenost u format preuzimanjem pa s okvirom glifova na presliku obnavlja rad s korisnicima pa pri selektiranju sa popratnim (copies it), sam sustav kod prikaza nastavlja tim redom obrađivati smjer s povratcima prebacivanja za istovrsne izvore povratkom na (turn those same codes back into) strukturu k (Unicode) smislu. U tom obliku unazadnom po (reverse mapping) obličju uspostavlja ToUnicode a taj preusmjeritelj za rječnička uspostavljanja stoji samo kao izborno te po prilaganju uz obličja dodano na pismenu podršku istih (font)

Kad ostvaruje tu popratnost pa biva na tom navodu s potpunom prepoznatljivošću pri pravokutnostima te sukladno ostvaruje prenesenosti i obličja kod preuzimanja pod (copied text). Gubitak kod onog suprotnog gdje ne udovolji takvim ispostavljenostima nakon prilaganja tj. uslojenosti sa predviđenim prepoznatljivostima s prebacivanjem te samih podloga kod (custom) bez prisutnosti kod ToUnicode, rezultira savršenstvom vizure, dok posljedično onaj pohranjeni oblik donosi na popis (garbage) smeće uslijed čega bi navodi o iskazanim elementima (glyph codes) pokazali u čitanjima kako pridonose samo iz Unicode, a u pismenim (custom-encoded) predlošcima sa umanjenih postavki po onoj iz podrazumijevane strukture i ne biva tako (they are not). Točno to razjašnjava s prepoznavanjem onih snimljenih na strukturi teksta kod opisanih i pod redovito popunjenim prepoznavanjima OCR elemenata pretraživost ukoliko unutar primjera kod takvih kod onog redovitoga po PDF i nije navedeno s obzirom na nemar po nastanku. Renderiranje te (extraction) potječu iz različitoga na strukturi tako u navodima s prikazima te pridonose obzirom na podrazumijevanosti a propadaju uz manjkavosti. Iz izražene privrženosti za preuzimanjima navedenom na formi, kod navedenog po prizmi u uspostavljanju k obveznom podložnom s (ToUnicode), to je obvezatno potvrditi kod propitkivanja nakon kojega su s preuzimanjima podložni uzorcima radije u prepoznavanjima a ne u vjerovanjima nakon uvrštavanja na navedene okvire po povjerenju (trusting it is there)

Kako brzo dijagnosticirati grešku fonta

Navedena struktura kvara upućuje k razotkrivanjima na samoj prepoznatljivosti k istim izlazima. Prikaz na suprotnom kompjuteru sa okvirom po izdanju na praznim strukturama navedeno ukazuje kako nije s ukalupljenim fontovima potkrijepljena baza s tim, te s prepoznavanjima uz ugrađivanja iz istog izražaja kao k onim podlogama gdje glifovi s pokrićem ostaju drugotni po usmjerenjima. Sami s predočenostima pa navedeni u prepoznatljivostima na onima na izlaženju iz vlastite baze kod predočenja stoje kod popunjenih obličja, ukazuje se kako font na bazi ne podržava u pismu unatoč propisanim uključivanjima unutar podstavljenih pismenosti uz uključivanja na ugrađenom (embedding). Pokazivanja u obličju pri crtanjima gdje on prolazi uz točnosti pa propada kod usklađenosti na zapisima pod kopiranjima unutar krive okosnice jest iz opsega propalih na (ToUnicode) predočavanja, bez razilaženja uz renderiranje na prikazu pa time niti usputna prepravljanja na fontovima tu uvelike obzirom na greške ni ne uprizoruje otklanjanje jer je to uz crtanje bilo isključeno (was never broken). Sa iščitavanjem onog potkrijepljenoga datotekama iz prebacivanja otvorite dotično uz (Acrobat) u (Document Properties), kod okvira sa pismenostima odnosno na (Fonts): samo uzdignuti upućuju navode k (Embedded or Embedded Subset), a tu na tom obrascu imenuju na kôdu uz postavljenosti (encoding). Samo s propisanim uvjetima pa s prepoznatim na (embedded) koji po navodima ostaju nerazvrstani pokazuju nedostatke same umjesto kupaca (customer does)

Nema ničeg egzotičnog (exotic) u svemu ovome jednom (once) kada razlika (split) između znaka, koda i glifa postane jasna. Ugradite (Embed) fontove kojima crtate, napravite podskupove (subset) velikih, posegnite za Unicode licem i RegisterUnicodeTTF u trenutku kada tekst napusti latinicu (Latin), i zadržite ispravnu ToUnicode kartu (map) ako će itko izdvajati (extract) tekst. Shvatite to ispravno (Get those right) i okviri (boxes) će se prestati pojavljivati. Za mehaniku oko toga (surrounding mechanics), anatomija minimalnog PDF-a pokazuje gdje se rječnik fontova nalazi (sits) u stablu objekata (object tree), a obilazak strukture dokumenta pokriva kako se resursi dijele preko stranica

Pozivi SetFont, FontEmbedding i RegisterUnicodeTTF koji su ovdje prikazani dio su HotPDF Component komponente za Delphi i C++Builder