PDFlibPas piirtää japanilaista ja kiinalaista tekstiä alas sivua pitkin. SetVerticalWritingMode kytkää pystykirjoituksen päälle, tavalliset DrawText-kutsut juoksevat sitten alaspäin, ja GetVerticalWritingMode raportoi nykyisen tilan. Ennen kuin tämä oli olemassa, tekstin asettaminen pystyyn tarkoitti joka merkin sijoittamista käsin ja toivoa että välitys näytti oikealta
Pystykirjoitus ei ole yhdeksänkymmentä astetta käännettyä vaakatekstiä. Merkit pysyvät pystyssä, eteneminen juoksee alas eikä poikki, ja usea merkki muuttaa muotoaan kokonaan — mikä on se osa joka erottaa asiakirjan joka luetaan luontevasti sellaisesta jonka japanilainen lukija tunnistaa heti koneelliseksi
Mitä PDF:n sisällä muuttuu
Tällä tavalla piirretty teksti kulkee Type0-fontin kautta pystykirjoitustilassa kantaen fontin omat pystymetriikat. Tämä merkitsee kahteen suuntaan. Lukija etenee joka merkkiä suunnittelijan aikoinaan aikeilemalla etäisyydellä eikä tasaisella askeleella, joten sarakkeessa on rytmi jota varten kirjasin piirrettiin. Ja tekstin kopioiminen ulos palauttaa alkuperäiset merkit, koska pystyajo on yhä oikeaa tekstiä kunnollisella kartoituksella eikä sarja sijoitettuja glyfejä
Fontti joka ei kanna omia pystymetriikoitaan etenee yksi em per merkki, mikä on sitä mitä lukija tekisi oletuksella. Tuo varateko kannattaa tuntea koska se on ero jonka näet kun asiakirja renderöityy oikein kunnollisella CJK-fontilla ja näyttää mekaanisesti välitetyltä latinalaisella fontilla joka sattuu sisältämään hieman kanaa
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;
Miksi sulkumerkit näyttävät vääriltä pystyteksissä?
Koska sululla on kaksi muotoa ja vain toinen niistä kuuluu sarakkeeseen. Sulkumerkit, pitkän vokaalin merkki ja pienet kana piirretään eri tavalla kun teksti juoksee alas sivua — sulku kääntyy istuakseen sarakkeen mukana sen sijaan että makaisi poikkittain, ja pitkän vokaalin merkistä tulee pystyviiva. Piirrä vaakaformaatit pystysarakkeeseen ja jokainen niistä makaa kyljellään
PDFlibPas ottaa muodot fontin omasta pystyominaisuudesta, joten jokainen fontti toimittaa mitä sen suunnittelija piirsi eikä merkistä arvattua korvausta. Tämä ero merkitsee oikeellisuuden kannalta: arvattu korvaustaulu on oikein yleisissä tapauksissa ja väärin fonteissa jotka kohtelevat merkkiä eri tavalla, ja fontti joka ei nimeä pystymuotoja piirretään täsmälleen kuten ennen sen sijaan että se työnnetään taulun läpi jota se ei koskaan pyytänyt
GetVerticalTextHeight mittaa ne muodot jotka todella piirretään, joten sarake jonka merkit muuttavat muotoaan mitataan yhä oikein. Vaakaformojen mittaaminen ja pystymuotojen piirtäminen on klassinen lähde sarakkeille jotka ylittävät laatikkonsa muutamalla merkillä
Yhden ajon piirtäminen muuttamatta tilaa
DrawVerticalText piirtää yksittäisen ajon pystyssä ottaen position, fontin nimen, koon ja tekstin, ja jättää kirjoitustilan rauhaan. Käytä sitä pystyyn poikkeukseen vaaka-asiakirjan sisällä — selän nimike, leima, yksittäinen nimisarake — missä globaalin tilan kytkeminen päälle ja pois jokaisen kutsun ympärillä on enemmän tilaa kuin tehtävä ansaitsee
Yhden fontin vaaka- ja pystymuodot pidetään erillään sisäisesti, joten sivu voi kantaa molempia häiritsemättä toisiaan. Se on mikä tekee sekasisältöisestä sivusta käytännöllisen: japanilainen kirjasivu pystyisellä leipätekstillä ja vaaka-asuisilla juoksevilla ylätunnisteilla, tai kiinalainen todistus pystyisellä otsikolla vaaka-asuisten tietorivien päällä
// 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');
Fontin saaminen oikein ennen muuta
Pystykirjoitus riippuu kokonaan fontista. CJK-fontti kunnollisilla pystymetriikoilla ja pystyominaisuudella tuottaa oikean tulosteen ilman lisätyötä; fontti joka ei niitä kanna tuottaa pystyssä olevia merkkejä jotka etenevät yksi em kerrallaan eivätkä lainkaan muuta muotoaan. Jos pystyteksti näyttää hienovaraisesti väärältä, tutki fonttia ennen koodia
Upotus seuraa tavallisia sääntöjä ja tavallisia kustannuksia. Täysi CJK-fontti on suuri, joten osajoukko ei ole valinnainen asiakirjoille jotka menevät mihinkään — artikkeli PDF-tiedostokoon optimointi ja fontin osajoukkoistaminen käsittelee mitä odottaa, ja artikkeli puuttuvien fonttien upottaminen olemassa olevaan PDF:ään käsittelee korjaustapauksen jossa pystyasiakirja saapuu ilman fonttejaan
Missä pystyteksti yhä tarvitsee asettelupäätöksen sinulta
Sarakejärjestystä. Japanilainen pystyteksti juoksee sarakkeittain oikealta vasemmalle, joten kaksisarakkeinen sivu alkaa oikeasta reunasta, eikä mikään kirjoitustilan asetus voi päätellä sitä tekstistä. Sama koskee asiakirjan sivujärjestystä joka luetaan kokonaisuudessaan oikealta vasemmalle, ja sitä mihin furigana, alaviitteet ja kuvatekstit sijoittuvat
Mitä kirjasto takaa on että jokainen ajo asetetaan oikein: oikeat muodot, oikea eteneminen, purettava teksti. Minne ajot menevät sivulla on asetteluongelma, ja datasta koottuja asiakirjoja varten artikkeli tekstihaku ja sivuelementtien luetteloiminen on hyödyllinen varmistamaan jälkikäteen että se mikä päätyi sivulle on se mitä aiotit
PDFlibPas on natiivi Pascal-PDF-kirjasto Delphille, C++Builderille ja Lazarukselle, ja pysty-CJK-kirjoitus on osa piirto-API:ta eikä lisäosaa — katso PDFlibPas-tuotesivulta teksti- ja fonttiominaisuusluettelo