Tehnički članak

Vertikalni japanski i kineski tekst u PDF-u sa Delphi

PDFlibPas crta japanski i kineski tekst niz stranicu. SetVerticalWritingMode uključuje vertikalno pisanje, obični pozivi DrawText zatim teku nadole, a GetVerticalWritingMode prijavljuje trenutno stanje. Pre nego što je ovo postojalo, postavljanje teksta vertikalno je značilo ručno smeštanje svakog znaka i nadu da razmak izgleda ispravno

Vertikalno pisanje nije horizontalni tekst rotiran devedeset stepeni. Znakovi ostaju uspravni, napredovanje teče nadole umesto poprečno, i brojni znakovi menjaju oblik u potpunosti — što je deo koji razdvaja dokument koji se čita prirodno od onog koji japanski čitalac odmah prepoznaje kao mašinski napravljen

Šta se menja unutar PDF-a

Tekst nacrtan na ovaj način prolazi kroz Type0 font u vertikalnom režimu pisanja koji nosi sopstvene vertikalne metrike lica. To je važno u dva pravca. Čitač pomera svaki znak za razmak koji je njegov dizajner zamislio, a ne za jednoličan korak, tako da kolona ima ritam za koji je tip lica nacrtan. I kopiranje teksta vraća originalne znakove, jer vertikalna linija je i dalje pravi tekst sa pravilnim mapiranjem, a ne niz pozicioniranih glifova

Lice koje ne nosi sopstvene vertikalne metrike napreduje za jedan em po znaku, što je ono što bi čitač uradio sa podrazumevanim. Taj rezervni mehanizam je vredno poznavati jer je to razlika koju ćete videti kad se dokument renderuje ispravno sa pravim CJK licem i izgleda mašinski razmaknuto sa latiničnim licem koje slučajno sadrži nešto kane

var
  Lib: TPDFlib;
  H: Double;
begin
  Lib := TPDFlib.Create;
  try
    Lib.SetOrigin(1);
    Lib.AddTrueTypeFont('MS Mincho', 1);      // 1 = embed the face
    Lib.SetTextSize(12);
    Lib.SetVerticalWritingMode(1);            // ordinary DrawText now runs down
    H := Lib.GetVerticalTextHeight('MS Mincho', 12, '第三章 保守点検');
    Lib.DrawText(480, 72, '第三章 保守点検');
    Lib.SetVerticalWritingMode(0);            // back to horizontal
    Lib.DrawText(72, 72 + H, 'Chapter 3');
    Lib.SaveToFile('manual-ja.pdf');
  finally
    Lib.Free;
  end;
end;

Zašto zagrade izgledaju pogrešno u vertikalnom tekstu?

Zato što zagrada ima dva oblika i samo jedan od njih pripada u koloni. Zagrade, znak dugog samoglasnika i mala kana se crtaju drugačije kad tekst teče niz stranicu — zagrada se rotira da sedi duž kolone umesto da leži poprečno, a znak dugog samoglasnika postaje vertikalni potez. Nacrtajte horizontalne oblike u vertikalnoj koloni i svaki od njih leži na boku

PDFlibPas uzima oblike iz sopstvene vertikalne karakteristike fonta, tako da svako lice isporučuje ono što je njegov dizajner nacrtao, a ne supstituciju pogađanu iz znaka. Ta razlika je važna za ispravnost: tabela pogađane supstitucije je tačna za uobičajene slučajeve i pogrešna za lica koja tretiraju znak drugačije, a lice koje ne imenuje vertikalne oblike crta se tačno onako kao i pre, umesto da bude propušteno kroz tabelu koju nikada nije tražilo

GetVerticalTextHeight meri oblike koji će zapravo biti nacrtani, tako da se kolona čiji znakovi menjaju oblik i dalje meri ispravno. Merenje horizontalnih oblika i crtanje vertikalnih jeste klasičan izvor kolona koje prekorače svoj okvir za nekoliko znakova

Crtanje jedne linije bez promene moda

DrawVerticalText crta jednu liniju vertikalno, uzimajući poziciju, ime fonta, veličinu i tekst, i ostavlja režim pisanja na miru. Koristite ga za vertikalni izuzetak unutar horizontalnog dokumenta — oznaku hrpta, pečat, jednu kolonu imena — gde uključivanje i isključivanje globalnog moda oko svakog poziva predstavlja više stanja nego što zadatak zaslužuje

Horizontalni i vertikalni oblici jednog lica se interno drže odvojeno, tako da stranica može nositi oba bez da bilo koji uznemirava drugi. To je ono što čini mešanu stranicu praktičnom: stranica japanske knjige sa vertikalnim telom teksta i horizontalnim tekućim zaglavlja, ili kineski sertifikat sa vertikalnim naslovom preko horizontalnih linija detalja

// One vertical run inside an otherwise horizontal page
Lib.DrawVerticalText(520, 96, 'MS Mincho', 14, '保守点検記録');
// The horizontal text around it is unaffected
Lib.DrawText(72, 96, 'Maintenance inspection record');

Postavljanje fonta ispravno pre svega ostalog

Vertikalno pisanje zavisi u potpunosti od lica. CJK font sa pravim vertikalnim metrikama i vertikalnom karakteristikom proizvodi ispravan izlaz bez daljeg rada; font bez njih proizvodi uspravne znakove koji napreduju jedan em u isto vreme i bez ikakvih promena oblika. Ako vertikalni tekst izgleda suptilno pogrešno, pregledajte font pre nego što pregledate kod

Ugradnja prati uobičajena pravila i uobičajene troškove. Puno CJK lice je veliko, tako da podskupovanje nije opcionalno za dokumente koji idu bilo kuda — beleške o optimizaciji veličine PDF fajla i podskupovanju fonta pokrivaju šta očekivati, a prolaz kroz ugradnju nedostajućih fontova u postojeći PDF pokriva slučaj popravke kad vertikalni dokument stigne bez svojih fontova

Gde vertikalni tekst i dalje zahteva odluku o rasporedu od vas

Redosled kolona. Japanski vertikalni tekst teče sdesna nalevo po koloni, tako da stranica sa dve kolone počinje od desne ivice, i nijedno podešavanje režima pisanja to ne može zaključiti iz teksta. Isto važi za redosled stranica u dokumentu koji se u celini čita sdesna nalevo, i za to gde sede furigana, fusnote i naslovi slika

Ono što biblioteka garantuje jeste da se svaka linija postavlja ispravno: ispravni oblici, ispravna napredovanja, tekst koji se može izdvojiti. Gde linije idu na stranici je problem rasporeda, a za dokumente sastavljene iz podataka prolaz kroz pretragu teksta i enumeraciju elemenata stranice je koristan za naknadnu proveru da je ono što je sletelo na stranicu ono što ste zamislili

PDFlibPas je nativna Pascal PDF biblioteka za Delphi, C++Builder i Lazarus, a vertikalno CJK pisanje je deo API-ja za crtanje a ne dodatak — pogledajte PDFlibPas stranicu proizvoda za listu funkcija teksta i fonta