Műszaki cikk

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

A PDFlibPas 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

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

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 PDFlibPas 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

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

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

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

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 PDFlibPas 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 PDFlibPas termékoldal tartalmazza