Artikel Teknis

Teks Vertikal Jepang dan Mandarin dalam PDF dengan Delphi

PDFlibPas 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

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

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

PDFlibPas 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

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

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

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

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

PDFlibPas 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 PDFlibPas untuk daftar fitur teks dan font