Műszaki cikk

Függőleges japán és kínai szöveg PDF-ben Delphivel

A PDF Library for Delphi lefelé, az oldalon keresztül rajzolja a japán és kínai szöveget. A SetVerticalWritingMode bekapcsolja a függőleges írást, a mindennapi DrawText hívások ezután lefelé futnak, és a GetVerticalWritingMode jelzi az aktuális állapotot. Mielőtt ez létezett, a szöveg függőlegesre állítása minden karakter kézi elhelyezését és a távolságok jó kilátásba helyezését jelentette

A függőleges írás nem kilencven fokkal elforgatott vízszintes szöveg. A karakterek függőlegesek maradnak, az előrehaladás lefelé fut vízszintes helyett, és bizonyos karakterek alakja teljesen megváltozik — ez az a rész, amely elválaszt egy olyan dokumentumot, amely természetesen olvasható, egy olyantól, amelyet egy japán olvasó azonnal gépi eredetűnek ismer fel

PDF Library for Delphi diagram: elforgatott vízszintes szövegsor szemben a valódi függőleges írásmóddal, ahol a glífusok egyenesen maradnak, és az előrehaladás lefelé fut az oldalon
A függőleges írás álló karaktereket helyez el fontonkénti vertikális metrikákkal vízszintes sor forgatása helyett, és egy másolt oszlop karakterről karakterre olvasható vissza

Mi változik a PDF belsejében

Az így rajzolt szöveg egy Type0 betűtípuson át fut, függőleges írásmódban, a betűtípus saját függőleges metrikáit hordozva. Ez két irányban számít. Egy olvasó minden karaktert a tervezője által szánt távolsággal léptet előre, nem egyenletes lépésközzel, így az oszlop megkapja azt a ritmust, amelyre a betűtípust megrajzolták. A szöveg kimásolása visszaadja az eredeti karaktereket, mert a függőleges futam még mindig valódi szöveg megfelelő leképezéssel, nem pedig elhelyezett glyphek sorozata

Egy olyan betűtípus, amely nem hordoz saját függőleges metrikát, karakterenként egy em-et léptet, ami ugyanaz, amit egy olvasó az alapértelézettel tenne. Ezt a tartalékot érdemes ismerni, mert ez a különbség, amelyet akkor látunk, amikor egy dokumentum egy megfelelő CJK betűtípussal helyesen renderelődik, és gépies távolságokkal jelenik meg egy olyan latin betűtípussal, amely épp tartalmaz néhány kanát

var
  Lib: TPDFlib;
  H: Double;
begin
  Lib := TPDFlib.Create;
  try
    Lib.SetOrigin(1);
    Lib.AddTrueTypeFont('MS Mincho', 1);      // 1 = a betűkép beágyazása
    Lib.SetTextSize(12);
    Lib.SetVerticalWritingMode(1);            // a normál DrawText mostantól lefelé fut
    H := Lib.GetVerticalTextHeight('MS Mincho', 12, '第三章 保守点検');
    Lib.DrawText(480, 72, '第三章 保守点検');
    Lib.SetVerticalWritingMode(0);            // vissza vízszintesre
    Lib.DrawText(72, 72 + H, 'Chapter 3');
    Lib.SaveToFile('manual-ja.pdf');
  finally
    Lib.Free;
  end;
end;

Miért néznek ki rosszul a zárójelek függőleges szövegben?

Mert egy zárójelnek két formája van, és csak az egyik való egy oszlopba. A zárójelek, a hosszú magánhangzó-jel és a kis kana máshogy rajzoltatnak, amikor a szöveg lefelé fut az oldalon — egy zárójel elforgatódik, hogy az oszlop mentén álljon, ahelyett hogy keresztben feküdne, a hosszú magánhangzó-jel pedig függőleges vonássá válik. A vízszintes formák megrajzolása egy függőleges oszlopban azt jelenti, hogy mindegyik az oldalán fekszik

A PDF Library for Delphi a formákat a betűtípus saját függőleges funkciójából veszi, így minden betűtípus azt szállítja, amit a tervezője megrajzolt, nem pedig egy karakterből kitalált helyettesítést. Ez a különbség a helyességnél számít: egy kitalált helyettesítési tábla a gyakori eseteknél helyes, és azoknál a betűtípusoknál hibás, amelyek egy karaktert máshogy kezelnek, és egy olyan betűtípust, amely nem nevez meg függőleges formákat, pontosan úgy rajzolnak, mint korábban, ahelyett hogy egy olyan táblán kényszerítenének keresztül, amelyre sosem kért

A GetVerticalTextHeight azokat a formákat méri, amelyek tényleesen megrajzolódnak, így egy olyan oszlop, amelynek karakterei alakot váltanak, még mindig helyesen van mérve. A vízszintes formák mérése és a függőlegesek rajzolása az a klasszikus forrása azoknak az oszlopoknak, amelyek néhány karakterrel túllépnek a dobozukon

PDF Library for Delphi diagram: a betűkészlet vertikális jellemzője adja a zárójel és a hosszított hangjel alakokat, amelyek függőleges oszlop mentén fekszenek, miközben a közönséges karakterek változatlanul állnak, mind a GetVerticalTextHeight mérése alatt
A font saját vertikális funkciója dönti el, mely glifák változnak alakot az oszlopban, és a GetVerticalTextHeight azokat az alakokat méri, amelyek ténylegesen megrajzolódnak

Egy futam rajzolása a mód megváltoztatása nélkül

A DrawVerticalText egyetlen futamot rajzol függőlegesen, átveszi a pozíciót, a betűtípusnevet, a méretet és a szöveget, és békén hagyja az írásmódot. Használjuk egy vízszintes dokumentumban lévő függőleges kivételhez — gerinc-címke, pecsét, egyetlen oszlop név —, ahol egy globális mód minden hívás körüli be- és kikapcsolása több állapot, mint amennyit a feladat megérdemel

Egy betűtípus vízszintes és függőleges formái belsőleg külön tartózkodnak, így egy oldal hordozhatja mindkettőt anélkül, hogy bármelyik zavarná a másikat. Ez teszi praktikussá egy vegyes oldalt: egy japán könyvoldal függőleges törzsszöveggel és vízszintes futó fejlécekkel, vagy egy kínai bizonyítvány függőleges címmel a vízszintes részletsorok felett

// Egy függőleges futam egy egyébként vízszintes oldalon belül
Lib.DrawVerticalText(520, 96, 'MS Mincho', 14, '保守点検記録');
// A körülötte lévő vízszintes szöveget ez nem érinti
Lib.DrawText(72, 96, 'Maintenance inspection record');

A betűtípus rendbe tétele minden más előtt

A függőleges írás teljes mértékben a betűtípustól függ. Egy megfelelő függőleges metrikákkal és függőleges funkcióval rendelkező CJK betűtípus további munka nélkül helyes kimenetet állít elő; egy ilyen nélküli betűtípus függőleges karaktereket állít elő, amelyek egyszerre egy em-et léptetnek, és semmilyen alakváltozás nem történik. Ha a függőleges szöveg finoman hibásnak tűnik, előbb a betűtípust vizsgáljuk meg, mint a kódot

A beágyazás a szokásos szabályokat és a szokásos költségeket követi. Egy teljes CJK betűtípus nagy, így a részbetűkészlet-képzés nem opcionális az olyan dokumentumoknál, amelyek bárhova kerülnek — a PDF fájlméret-optimalizálás és betűtípus-részbetűkészítés jegyzetei azt mutatják, mire számítsunk, a hiányzó betűtípusok meglévő PDF-be ágyazása átjárása pedig azt a javítási esetet tárgyalja, amikor egy függőleges dokumentum a betűtípusai nélkül érkezik

Hol kell a függőleges szövegnek még egy elrendezési döntés tőled

Az oszlopsorrend. A japán függőleges szöveg oszloponként jobbról balra fut, tehát egy kéthasábos oldal a jobb szélen kezdődik, és ezt egyetlen írásmód-beállítás sem tudja a szövegből kikövetkeztetni. Ugyanez vonatkozik egy olyan dokumentum oldalsorrendjére, amely egészként jobbról balra olvas, és arra is, hova kerülnek a furigana, a lábjegyzetek és az ábrafeliratok

PDF Library for Delphi diagram a DrawVerticalText-ről: egy egyenes függőleges futás kerül a közönséges vízszintes DrawText sorok mellé egy közös oldalon a globális írásmód érintése nélkül
A DrawVerticalText saját fontot, méretet és pozíciót hordoz, így egyetlen függőleges oszlop együtt él a körülötte lévő vízszintes hívásokkal

Amit a könyvtár garantál, az az, hogy minden futam helyesen van szedve: helyes formák, helyes előrehaladás, kinyerhető szöveg. Az, hogy a futamok hova kerülnek az oldalon, elrendezési probléma, és az adatokból összeállított dokumentumoknál a szövegkeresés és oldalelem-felsorolás átjárása hasznos annak utólagos ellenőrzésére, hogy ami az oldalra került, az az, amit szántál

A PDF Library for Delphi natív Pascal PDF könyvtár Delphihez, C++Builderhez és Lazarushoz, és a függőleges CJK írás a rajzoló API része, nem pedig kiegészítő — a szöveg- és betűtípus-funkciók listáját a PDF Library for Delphi termékoldal tartalmazza