Tehnički članak

Vertikalni japanski i kineski tekst u PDF-u s Delphijem

PDFlibPas 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

Š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 = 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 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

PDFlibPas 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

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

// 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');

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

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

PDFlibPas 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 PDFlibPas za popis značajki teksta i fontova