Tekninen artikkeli

Japanilaista ja kiinalaista pystytekstiä PDF:ssä Delphillä

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