Tehnički članak

Vertikalni japanski i kineski tekst u PDF-u s Delphijem

PDF Library for Delphi crta japanski i kineski tekst niz stranicu. SetVerticalWritingMode uključuje okomito pisanje, obični pozivi DrawText zatim teku prema dolje, a GetVerticalWritingMode prijavljuje trenutno stanje. Prije nego što je ovo postojalo, okomito postavljanje teksta značilo je ručno smještanje svakog znaka i nadu da razmaci izgledaju ispravno

Okomito pisanje nije vodoravni tekst rotiran devedeset stupnjeva. Znakovi ostaju uspravni, pomak teče prema dolje umjesto postrance, a brojni znakovi potpuno mijenjaju oblik, što je dio koji razdvaja dokument koji se čita prirodno od onog koji japanski čitatelj odmah prepoznaje kao strojno proizveden

PDF Library for Delphi dijagram koji uspoređuje rotirani vodoravni red teksta s pravim vertikalnim načinom pisanja gdje glifovi ostaju uspravni a napredovanje ide niz stranicu
Okomito pisanje postavlja uspravne znakove s vertikalnim metrikama po fontu umjesto da rotira horizontalnu liniju, a kopirani stupac i dalje se čita znak po znak

Što se mijenja unutar PDF-a

Tekst nacrtan na ovaj način prolazi kroz Type0 font u načinu okomitog pisanja noseći vlastite okomite metrike fonta. To je važno u dva smjera. Čitač pomiče svaki znak za udaljenost koju je njegov dizajner zamislio, a ne za jednoličan korak, pa stupac ima ritam za koji je tip pisma bio nacrtan. I kopiranje teksta vraća izvorne znakove, jer okomiti tijek i dalje je stvarni tekst s pravim preslikavanjem, a ne niz pozicioniranih glifova

Font koji ne nosi vlastite okomite metrike pomiče se za jedan em po znaku, što je što bi čitač radio prema zadanim postavkama. Ta pričuvna vrijednost vrijedi znati jer je to razlika koju ćete vidjeti kad se dokument ispravno renderira s pravim CJK fontom, a izgleda strojno razmaknut s latinskim fontom koji slučajno sadrži neku kanu

var
  Lib: TPDFlib;
  H: Double;
begin
  Lib := TPDFlib.Create;
  try
    Lib.SetOrigin(1);
    Lib.AddTrueTypeFont('MS Mincho', 1);      // 1 = ugradi font
    Lib.SetTextSize(12);
    Lib.SetVerticalWritingMode(1);            // obični DrawText sada teče prema dolje
    H := Lib.GetVerticalTextHeight('MS Mincho', 12, '第三章 保守点検');
    Lib.DrawText(480, 72, '第三章 保守点検');
    Lib.SetVerticalWritingMode(0);            // natrag na vodoravno
    Lib.DrawText(72, 72 + H, 'Chapter 3');
    Lib.SaveToFile('manual-ja.pdf');
  finally
    Lib.Free;
  end;
end;

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

Zato što zagrada ima dva oblika, a samo jedan od njih pripada u stupac. Zagrade, oznaka dugog samoglasnika i male Kane crtaju se drukčije kad tekst teče niz stranicu: zagrada se rotira da sjedne uzduž stupca umjesto da leži poprijeko, a oznaka dugog samoglasnika postaje okomiti potez. Nacrtajte vodoravne oblike u okomitom stupcu i svaki od njih ležat će na boku

PDF Library for Delphi uzima oblike iz vlastitog okomitog svojstva fonta, pa svaki font isporučuje ono što je njegov dizajner nacrtao, a ne zamjenu pogađanu iz znaka. Ta razlika važna je za ispravnost: tablica zamjena pogađana iz znakova točna je za uobičajene slučajeve, a pogrešna za fontove koji znak tretiraju drukčije, a font koji ne imenuje okomite oblike crta se točno kao i prije, umjesto da bude proveden kroz tablicu koju nikad nije tražio

GetVerticalTextHeight mjeri oblike koji će se doista nacrtati, pa se stupac čiji se znakovi mijenjaju i dalje ispravno mjeri. Mjerenje vodoravnih oblika i crtanje okomitih klasičan je izvor stupaca koji prelaze svoj okvir za nekoliko znakova

PDF Library for Delphi dijagram koji prikazuje kako vertikalna značajka fonta opskrbljuje oblike zagrada i znaka produženog glasa koji leže uz vertikalni stupac dok obični znakovi stoje nepromijenjeni, sve izmjereno s GetVerticalTextHeight
Vlastita vertikalna značajka fonta odlučuje koji glifovi mijenjaju oblik u stupcu, a GetVerticalTextHeight mjeri oblike koji će stvarno biti nacrtani

Crtanje jednog tijeka bez mijenjanja načina

DrawVerticalText crta jedan tijek okomito, uzimajući poziciju, ime fonta, veličinu i tekst, a ostavlja način pisanja na miru. Koristite ga za okomiti izuzetak unutar vodoravnog dokumenta, naslovnicu knjige, pečat, jedan stupac imena, gdje bi uključivanje i isključivanje globalnog načina oko svakog poziva bilo više stanja nego što zadatak zaslužuje

Vodoravni i okomiti oblici jednog fonta drže se interno odijeljeni, pa stranica može nositi oba bez da ijedan remeti drugi. Upravo to čini miješanu stranicu praktičnom: japanska stranica knjige s okomitim temeljnim tekstom i vodoravnim tekućim zaglavljima, ili kineska svjedodžba s okomitim naslovom iznad vodoravnih redaka detalja

// Jedan okomiti odsječak unutar inače vodoravne stranice
Lib.DrawVerticalText(520, 96, 'MS Mincho', 14, '保守点検記録');
// Vodoravni tekst oko njega nije zahvaćen
Lib.DrawText(72, 96, 'Maintenance inspection record');

Dovođenje fonta u red prije svega ostalog

Okomito pisanje u potpunosti ovisi o fontu. CJK font s pravim okomitim metrikama i okomitim svojstvom proizvodi ispravan izlaz bez daljnjeg rada; font bez njih proizvodi uspravne znakove koji se pomiču jedan em u vrijeme, bez ikakvih promjena oblika. Ako okomiti tekst izgleda suptilno pogrešno, pregledajte font prije nego što pregledate kod

Ugradnja slijedi uobičajena pravila i uobičajene troškove. Pun CJK font je velik, pa podskupovi nisu opcionalni za dokumente koji idu bilo kamo: bilješke o optimizaciji veličine PDF datoteke i podskupovima fontova pokrivaju što očekivati, a prikaz ugradnje nedostajućih fontova u postojeći PDF pokriva slučaj popravka kad okomiti dokument stiže bez svojih fontova

Gdje okomiti tekst i dalje treba odluku o rasporedu od vas

Redoslijed stupaca. Japanski okomiti tekst teče s desna na lijevo po stupcu, pa dvostupčana stranica počinje s desnog ruba, i nijedna postavka načina pisanja ne može to zaključiti iz teksta. Isto vrijedi za redoslijed stranica u dokumentu koji se u cjelini čita s desna na lijevo, te za mjesto gdje sjede furigana, fusnote i naslovi slika

PDF Library for Delphi dijagram DrawVerticalText koji postavlja jedan uspravni vertikalni niz uz obične vodoravne DrawText retke na zajedničkoj stranici bez diranja globalnog načina pisanja
DrawVerticalText nosi vlastiti font, veličinu i poziciju, pa jedan okomi stupac koegzistira s horizontalnim pozivima oko sebe

Ono što knjižnica jamči jest da je svaki tijek postavljen ispravno: pravi oblici, pravi pomaci, izdvojiv tekst. Gdje tijekovi idu na stranici jest problem rasporeda, a za dokumente sastavljene iz podataka prikaz pretraživanja teksta i nabrajanja elemenata stranice koristan je za naknadnu provjeru da je na stranici sletjelo ono što ste zamislili

PDF Library for Delphi je izvorna Pascal PDF knjižnica za Delphi, C++Builder i Lazarus, a okomito CJK pisanje dio je API-ja za crtanje, a ne dodatak. Pogledajte stranicu proizvoda PDF Library for Delphi za popis značajki teksta i fontova