Artikel Teknis

Teks Vertikal Jepang dan Mandarin dalam PDF dengan Delphi

PDF Library for Delphi menggambar teks Jepang dan Mandarin ke bawah halaman. SetVerticalWritingMode mengaktifkan tulisan vertikal, panggilan DrawText biasa kemudian berjalan ke bawah, dan GetVerticalWritingMode melaporkan status saat ini. Sebelum ini ada, menuliskan teks secara vertikal berarti menempatkan setiap karakter secara manual dan berharap spasi terlihat benar

Tulisan vertikal bukan teks horizontal yang diputar sembilan puluh derajat. Karakter tetap tegak, advance berjalan ke bawah alih-alih menyamping, dan sejumlah karakter berubah bentuk sepenuhnya — yang merupakan bagian yang memisahkan dokumen yang terbaca alami dari yang segera dikenali pembaca Jepang sebagai buatan mesin

Diagram PDF Library for Delphi yang membandingkan baris teks horizontal yang diputar dengan mode penulisan vertikal sejati, di mana glyph tetap tegak dan advance berjalan turun menyusuri halaman
Penulisan vertikal menata karakter tegak dengan metrik vertikal per-face alih-alih memutar satu baris horizontal, dan kolom yang disalin tetap terbaca karakter demi karakter

Apa yang berubah di dalam PDF

Teks yang digambar dengan cara ini melalui font Type0 dalam mode tulis vertikal yang membawa metrik vertikal dari font itu sendiri. Itu penting dalam dua arah. Pembaca memajukan setiap karakter sejarak yang dimaksudkan desainernya alih-alih dengan langkah seragam, sehingga kolom memiliki ritme yang menjadi dasar tipografi itu digambar. Dan menyalin teks keluar mengembalikan karakter asli, karena run vertikal masih merupakan teks nyata dengan mapping yang benar alih-alih urutan glyph yang diposisikan

Font yang tidak membawa metrik vertikalnya sendiri memajukan satu em per karakter, yang merupakan apa yang akan dilakukan pembaca dengan default. Fallback itu patut diketahui karena itulah perbedaan yang akan Anda lihat ketika dokumen dirender dengan benar dengan font CJK yang layak dan terlihat spasi mekanis dengan font Latin yang kebetulan berisi beberapa kana

var
  Lib: TPDFlib;
  H: Double;
begin
  Lib := TPDFlib.Create;
  try
    Lib.SetOrigin(1);
    Lib.AddTrueTypeFont('MS Mincho', 1);      // 1 = sematkan face
    Lib.SetTextSize(12);
    Lib.SetVerticalWritingMode(1);            // DrawText biasa sekarang berjalan ke bawah
    H := Lib.GetVerticalTextHeight('MS Mincho', 12, '第三章 保守点検');
    Lib.DrawText(480, 72, '第三章 保守点検');
    Lib.SetVerticalWritingMode(0);            // kembali ke horizontal
    Lib.DrawText(72, 72 + H, 'Chapter 3');
    Lib.SaveToFile('manual-ja.pdf');
  finally
    Lib.Free;
  end;
end;

Kenapa tanda kurung terlihat salah dalam teks vertikal?

Karena tanda kurung punya dua bentuk dan hanya satu yang berada di kolom. Tanda kurung, tanda vokal panjang dan kana kecil digambar berbeda ketika teks berjalan ke bawah halaman — kurung diputar untuk duduk di sepanjang kolom alih-alih terbaring melintang, dan tanda vokal panjang menjadi goresan vertikal. Menggambar bentuk horizontal di kolom vertikal membuat semuanya berbaring menyamping

PDF Library for Delphi mengambil bentuk itu dari fitur vertikal font itu sendiri, jadi setiap font menyediakan apa yang digambar desainernya alih-alih substitusi yang ditebak dari karakter. Distinksi itu penting untuk kebenaran: tabel substitusi yang ditebak benar untuk kasus umum dan salah untuk font yang memperlakukan karakter secara berbeda, dan font yang tidak menamai bentuk vertikal apa pun digambar persis seperti sebelumnya alih-alih dipaksa melalui tabel yang tidak pernah dimintanya

GetVerticalTextHeight mengukur bentuk yang benar-benar akan digambar, jadi kolom yang karakternya berubah bentuk tetap diukur dengan benar. Mengukur bentuk horizontal dan menggambar bentuk vertikal adalah sumber klasik kolom yang melampaui kotaknya sebesar beberapa karakter

Diagram PDF Library for Delphi yang menunjukkan bagaimana fitur vertikal font menyediakan bentuk tanda kurung dan prolonged sound mark yang terbentang sepanjang kolom vertikal sementara karakter biasa berdiri tak berubah, semuanya diukur oleh GetVerticalTextHeight
Fitur vertikal milik face sendiri yang memutuskan glyph mana yang berubah bentuk dalam satu kolom, dan GetVerticalTextHeight mengukur bentuk yang benar-benar akan digambar

Menggambar satu run tanpa mengubah mode

DrawVerticalText menggambar satu run secara vertikal, mengambil posisi, nama font, ukuran dan teks, dan meninggalkan mode tulis apa adanya. Gunakan untuk pengecualian vertikal di dalam dokumen horizontal — label punggung, stempel, satu kolom nama — di mana mengaktifkan dan menonaktifkan mode global di sekitar setiap panggilan adalah lebih banyak state daripada yang layak untuk tugas itu

Bentuk horizontal dan vertikal dari satu font tetap terpisah secara internal, jadi halaman dapat membawa keduanya tanpa satu mengganggu yang lain. Itulah yang membuat halaman campuran praktis: halaman buku Jepang dengan teks isi vertikal dan running head horizontal, atau sertifikat Mandarin dengan judul vertikal di atas baris detail horizontal

// Satu run vertikal di dalam halaman yang sebaliknya horizontal
Lib.DrawVerticalText(520, 96, 'MS Mincho', 14, '保守点検記録');
// Teks horizontal di sekitarnya tidak terpengaruh
Lib.DrawText(72, 96, 'Maintenance inspection record');

Memperbaiki font sebelum yang lainnya

Tulisan vertikal sepenuhnya bergantung pada font. Font CJK dengan metrik vertikal yang layak dan fitur vertikal menghasilkan output yang benar tanpa pekerjaan lebih lanjut; font tanpa itu menghasilkan karakter tegak yang memajukan satu em pada satu waktu tanpa perubahan bentuk sama sekali. Jika teks vertikal terlihat samar-samar salah, periksa font sebelum memeriksa kode

Penanaman mengikuti aturan dan biaya yang biasa. Font CJK penuh besar, jadi subsetting tidak opsional untuk dokumen yang pergi ke mana pun — catatan tentang optimasi ukuran file PDF dan subsetting font membahas apa yang diharapkan, dan panduan menanam font yang hilang ke PDF yang ada membahas kasus perbaikan ketika dokumen vertikal tiba tanpa fontnya

Di mana teks vertikal masih membutuhkan keputusan layout dari Anda

Urutan kolom. Teks vertikal Jepang berjalan dari kanan ke kiri per kolom, jadi halaman dua kolom dimulai dari tepi kanan, dan tidak ada pengaturan mode tulis yang dapat menyimpulkan itu dari teks. Hal yang sama berlaku untuk urutan halaman dalam dokumen yang terbaca dari kanan ke kiri secara keseluruhan, dan untuk tempat furigana, catatan kaki dan keterangan gambar berada

Diagram PDF Library for Delphi tentang DrawVerticalText yang menempatkan satu run vertikal tegak di samping baris DrawText horizontal biasa pada halaman bersama tanpa menyentuh mode penulisan global
DrawVerticalText membawa font, ukuran, dan posisinya sendiri, sehingga satu kolom vertikal berdampingan dengan panggilan horizontal di sekitarnya

Apa yang dijamin library adalah setiap run ditulis dengan benar: bentuk yang benar, advance yang benar, teks yang dapat diekstrak. Ke mana run pergi pada halaman adalah masalah layout, dan untuk dokumen yang dirakit dari data panduan pencarian teks dan enumerasi elemen halaman berguna untuk memverifikasi setelahnya bahwa apa yang mendarat di halaman adalah yang Anda maksud

PDF Library for Delphi adalah library PDF Pascal native untuk Delphi, C++Builder dan Lazarus, dan tulisan CJK vertikal adalah bagian dari API menggambar alih-alih tambahan — lihat halaman produk PDF Library for Delphi untuk daftar fitur teks dan font