Teknik Makale

Delphi ile PDF'de Dikey Japonca ve Çince Metin

PDFlibPas Japonca ve Çince metni sayfada aşağı doğru çizer. SetVerticalWritingMode dikey yazmayı açar, sıradan DrawText çağrıları aşağı doğru akar ve GetVerticalWritingMode geçerli durumu raporlar. Bu var olmadan önce, metni dikey ayarlamak her karakteri elle yerleştirmek ve aralıkların doğru görünmesini ummak demekti

Dikey yazma, doksan derece döndürülmüş yatay metin değildir. Karakterler dik durur, ilerleme yatay yerine aşağı doğru akar ve bazı karakterler bütünüyle biçim değiştirir; doğal okunan bir belge ile Japon okuyucunun makine tarafından yapılmış olarak hemen tanıdığı bir belgeyi ayıran kısım budur

PDF'in içinde ne değişir?

Bu biçimde çizilen metin, yazı tipinin kendi dikey ölçümlerini taşıyan dikey yazma modunda bir Type0 yazı tipinden geçer. Bu iki yönde önem taşır. Bir okuyucu her karakteri tasarımcısının amaçladığı mesafeyle, tek biçimli bir adımla değil, ilerletir, dolayısıyla sütun yazı tipinin çizildiği ritme sahiptir. Ve metni dışarı kopyalamak özgün karakterleri döndürür, çünkü dikey akış yine de konumlandırılmış glyph dizisi değil, doğru eşlemeye sahip gerçek metindir

Kendi dikey ölçümlerini taşımayan bir yazı tipi karakter başına bir em ilerler; bu da okuyucunun öntanımlı ile yapacağı şeydir. Bu geri dönüş bilinmeye değerdir çünkü doğru bir CJK yazı tipiyle doğru görüntülenen bir belge ile biraz kana içeren Latin bir yazı tipiyle mekanik aralıklı görünen bir belge arasındaki fark budur

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;

Parantezler dikey metinde neden yanlış görünür?

Çünkü bir parantezin iki biçimi vardır ve yalnızca biri bir sütuna aittir. Parantezler, uzun sesli harf işareti ve küçük kanalar metin sayfada aşağı akarken farklı çizilir; bir parantez sütun boyunca oturmak için döner, yatay olarak yatmak yerine ve uzun sesli harf işareti dikey bir çizgi olur. Yatay biçimleri dikey bir sütunda çizerseniz her biri yan tarafına yatar

PDFlibPas biçimleri yazı tipinin kendi dikey özelliğinden alır, dolayısıyla her yazı tipi tasarımcısının çizdiklerini, karakterden tahmin edilen bir ikame yerine sağlar. Bu ayrım doğruluk için önemlidir: tahmin edilen bir ikame tablosu yaygın durumlar için doğrudur ve karakteri farklı ele alan yazı tipleri için yanlıştır; dikey biçim adı olmayan bir yazı tipi ise hiç istemediği bir tablodan zorlanmak yerine tam olarak eskisi gibi çizilir

GetVerticalTextHeight aslında çizilecek olan biçimleri ölçer, dolayısıyla karakterleri biçim değiştiren bir sütun yine de doğru ölçülür. Yatay biçimleri ölçmek ve dikey olanları çizmek, sütunların kutularını birkaç karakterle taşımasının klasik kaynağıdır

Modu değiştirmeden tek bir akış çizmek

DrawVerticalText konumu, yazı tipi adını, boyutu ve metni alarak tek bir akışı dikey çizer ve yazma modunu olduğu gibi bırakır. Yatay bir belgenin içindeki dikey istisna için kullanın; bir sırt etiketi, bir damga, tek bir sütun ad; burada her çağrı etrafında genel bir modu açıp kapatmak, görevin hak ettiğinden daha fazla durum demektir

Bir yazı tipinin yatay ve dikey biçimleri dahili olarak ayrı tutulur, dolayısıyla bir sayfa ikisini de birbirini rahatsız etmeden taşıyabilir. Karma bir sayfayı pratik kılan da budur: dikey gövde metni ve yatay sabit başlıklar içeren bir Japon kitap sayfası veya yatay ayrıntı satırlarının üzerinde dikey başlık içeren bir Çin sertifikası

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

Her şeyden önce yazı tipini doğru seçmek

Dikey yazma tamamen yazı tipine bağlıdır. Doğru dikey ölçümlere ve dikey özelliğe sahip bir CJK yazı tipi, başka bir iş olmadan doğru çıktı üretir; bunları olmayan bir yazı tipi, dik duran karakterleri her seferinde bir em ilerleyen ve hiç biçim değiştirmeyen çıktı üretir. Dikey metin hafifçe yanlış görünüyorsa, kodu incelemeden önce yazı tipini inceleyin

Gömme, her zamanki kuralları ve her zamanki maliyetleri izler. Tam bir CJK yazı tipi büyüktür, dolayısıyla her yere giden belgeler için alt kümeleme seçimlik değildir; PDF dosya boyutu iyileştirmesi ve yazı tipi alt kümeleme notları neler bekleyeceğinizi ele alır ve var olan bir PDF'e eksik yazı tiplerini gömme yazısı dikey bir belgenin yazı tipleri olmadan geldiği onarım durumunu ele alır

Dikey metnin hâlâ sizden bir yerleşim kararı gerektirdiği yer

Sütun sırası. Japonca dikey metin sütun halinde sağdan sola akar, dolayısıyla iki sütunlu bir sayfa sağ kenardan başlar ve hiçbir yazma modu ayarı bunu metinden çıkarsayamaz. Aynısı, bütün olarak sağdan sola okunan bir belgedeki sayfa sırası ve furigana, dipnotlar ile şekil altyazılarının nerede durduğuna da uygulanır

Kitaplığın garanti ettiği şey her akışın doğru ayarlandığıdır: doğru biçimler, doğru ilerlemeler, çıkarılabilir metin. Akışların sayfada nereye gideceği bir yerleşim sorunudur ve veriden birleştirilen belgeler için metin arama ve sayfa öğesi numaralandırma yazısı, sayfaya düşenin niyet ettiğiniz şey olduğunu sonradan doğrulamak için yararlıdır

PDFlibPas, Delphi, C++Builder ve Lazarus için yerel bir Pascal PDF kitaplığıdır ve dikey CJK yazma çizim API'sinin bir parçasıdır, bir eklenti değil; metin ve yazı tipi özellik listesi için PDFlibPas ürün sayfasına bakın