Fon: bagian yang sulit
ISO 32000-2 §9 Evidence: Mixed evidence
Sekilas
Bagian berjudul “Sekilas”Fon adalah tempat sebuah PDF bisa tampak sepenuhnya benar, tetapi tetap rusak secara diam-diam. Sebuah halaman dapat merender glif yang tepat, tetapi tetap mustahil dicari, mustahil disalin sebagai teks, dan tidak konform terhadap profil arsip. Semua itu dapat terjadi sekaligus, tanpa tanda visual apa pun yang memperingatkan Anda. Halaman ini membahas tiga hal yang harus berjalan dengan benar — penyematan, subsetting, pengodean — dan apa yang dilakukan NextPDF untuk masing-masing.
Mengapa ini penting
Bagian berjudul “Mengapa ini penting”“Kelihatannya baik-baik saja” adalah kalimat paling berbahaya dalam pekerjaan PDF, dan fon adalah area tempat asumsi itu paling merusak. Ada tiga hal independen yang harus terpenuhi:
- Penyematan — program fon ikut dibawa di dalam berkas, sehingga dirender sama di mesin yang tidak memiliki fon tersebut terpasang.
- Subsetting — hanya glif yang benar-benar digunakan yang dibawa, sehingga fon CJK 20 MB tidak membengkakkan setiap dokumen.
- Pengodean — tersedia pemetaan yang benar dari kode karakter di halaman kembali ke Unicode, sehingga teks dapat dicari, disalin, diindeks, dan dibaca oleh teknologi bantu.
Perenderan visual hanya membuktikan sebagian dari hal yang pertama. Sebuah dokumen dapat menampilkan glif yang sempurna, tetapi tetap gagal sepenuhnya pada hal yang ketiga — teksnya berupa gambar kata-kata, bukan kata-kata sebagai teks. Kegagalan seperti ini lolos dari setiap tinjauan “kelihatannya baik-baik saja”, lalu muncul sebagai masalah dalam audit kepatuhan atau permintaan penyingkapan (discovery).
Versi singkatnya
Bagian berjudul “Versi singkatnya”- Sebuah fon di dalam PDF adalah sebuah dictionary yang biasanya disertai sebuah aliran program fon tersemat.
- Subsetting menulis ulang program itu agar hanya berisi glif yang digunakan. Nama fon subset mendapat tag enam huruf kapital dan sebuah
+sehingga pembaca memperlakukannya sebagai sesuatu yang berbeda. - Pengodean adalah masalah terpisah berupa pemetaan kode karakter ke Unicode. Sebuah CMap
/ToUnicodeadalah hal yang membuat teks dapat dicari dan disalin — dan ia independen dari apakah glif terlihat benar. - Teks yang terlihat benar tanpa (atau dengan)
/ToUnicodeyang salah adalah kegagalan senyap yang klasik: sempurna di layar, tidak dapat dicari dalam praktik. - NextPDF mensubset fon TrueType, mempertahankan identitas glif untuk perenderan yang benar, dan memancarkan sebuah CMap
/ToUnicodeagar ekstraksi berfungsi — serta dapat menegakkan aturan penyematan PDF 2.0, bukan sekadar memperingatkan.
Bagaimana NextPDF menanganinya
Bagian berjudul “Bagaimana NextPDF menanganinya”Subsetting. FontSubsetter (src/Typography/FontSubsetter.php) mengurai direktori tabel TrueType asli dan membaca cmap untuk memetakan codepoint Unicode ke ID glif. Ia menangani baik format 4 BMP maupun format 12 full-Unicode, yang dibutuhkan oleh CJK. Kemudian ia melakukan langkah yang dilewatkan oleh subsetter naif: menyelesaikan dependensi glif komposit melalui penutupan transitif. Sebuah glif beraksen yang dibangun dari huruf dasar ditambah tanda penggabung mereferensikan glif lain sebagai komponen. Jika komponen-komponen itu dibuang, glif tersebut dirender salah. Subsetter menelusuri graf itu sampai tidak ada komponen baru yang muncul, dengan penjaga siklus agar fon cacat tidak masuk ke loop tanpa akhir.
Ada dua keputusan rekayasa di berkas itu yang layak disebutkan. Pertama, ID glif dipertahankan, tidak dipetakan ulang — slot yang tidak digunakan diisi nol di glyf/loca sehingga indeks glif asli aliran konten tetap valid di bawah CIDToGIDMap /Identity. Pemetaan ulang akan menghasilkan berkas yang lebih kecil, tetapi itu akan mengharuskan penulisan ulang setiap referensi glif. Mempertahankan identitas itu membuat pendekatan ini benar berdasarkan konstruksinya. Kedua, penelusuran dilakukan secara terurut (menaik berdasarkan gid) sehingga subset bersifat deterministik per byte — fon yang sama dan kumpulan glif terpakai yang sama menghasilkan byte subset yang sama, yang merupakan syarat build yang dapat direproduksi. Jika subsetting akan menghemat kurang dari ~10% ukuran berkas, fon asli dikembalikan tanpa perubahan. Beban tambahannya tidak sepadan dengan keuntungan yang marginal.
Penyematan. Kebijakan eksplisit menentukan apakah program fon dibawa atau tidak — tidak pernah berdasarkan tebakan. Pdf20FontEmbeddingPolicy (src/Writer/Pdf20FontEmbeddingPolicy.php) memiliki dua mode. Di bawah profil PDF 2.0, Strict menolak referensi Type 1 standar yang tidak tersemat (“Base14”) dengan eksepsi bertipe — perilaku yang benar dari sisi konformansi. AllowBase14 mempertahankan jalur advisori historis. Selama jendela migrasi, ia memancarkan deskriptor fon minimal yang masih diharuskan oleh standar dan mengirimkan peringatan alih-alih melempar eksepsi. Pemanggil membuat pilihan itu secara eksplisit pada dokumen; pilihan itu tidak pernah diinferensikan dari fon.
Pengodean. Untuk fon komposit (Type 0), EmbeddedTtfFontDictBuilder (src/Writer/EmbeddedTtfFontDictBuilder.php) memancarkan turunan CIDFontType2, induk Type0, dan sebuah aliran CMap /ToUnicode sehingga kode karakter dapat diuraikan kembali menjadi Unicode. Aliran /ToUnicode boleh tidak hadir hanya dalam satu kasus: ketika sebuah CMap CJK terdefinisi yang mendeskripsikan diri sendiri sudah memberikan pemetaan karakter-ke-Unicode kepada pembaca. Di situ CMap itulah yang menjadi pengodean, sehingga profil polos menghilangkan aliran /ToUnicode yang redundan untuk menghemat byte. Di luar kasus itu, aliran /ToUnicode adalah hal yang menjaga teks tetap menjadi teks.
| Perhatian | Apa yang dijaminnya | Apa yang tidak dijaminnya | Kegagalan senyap jika salah |
|---|---|---|---|
| Penyematan | Perenderan yang sama tanpa fon terpasang | Bahwa teks dapat dicari | Fon yang disubstitusi; metrik yang salah di mesin lain |
| Subsetting | Berkas kecil; hanya glif yang digunakan | Apa pun tentang pengodean | Komponen komposit yang hilang → glif beraksen yang rusak |
Pengodean (/ToUnicode) | Teks yang dapat dicari, disalin, dan diakses | Bahwa glif dirender dengan benar | Halaman yang terlihat sempurna, tidak dapat dicari / kacau saat disalin |
Ketiga aspek fon bersifat independen. Penyematan dan subsetting berkaitan dengan tampilan dan ukuran; pengodean berkaitan dengan makna. Sebuah halaman dapat lolos pada dua yang pertama dan gagal pada yang ketiga tanpa tanda visual apa pun yang menunjukkannya.
Apa kata bukti
Bagian berjudul “Apa kata bukti”Aturan penamaan subset bersifat normatif dan presisi.
Spec: ISO 32000-2, §9.9.2 ISO 32000-2 §9.9.2 mengharuskan bahwa nama PostScript dari sebuah subset fon
— BaseFont dan FontName deskriptor —
dimulai dengan tag yang terdiri dari tepat enam huruf kapital, lalu tanda tambah,
lalu nama PostScript fon aslinya. Ia juga mengharuskan bahwa subset
yang berbeda dari fon yang sama dalam satu berkas menggunakan tag yang berbeda. Aturan itulah yang
memungkinkan pembaca membedakan dua subset dan menggabungkan dokumen dengan benar. Evidence: Standard-backed
Pengodean berada pada klausa yang terpisah dari perenderan.
Spec: ISO 32000-2, §9.10.3 ISO 32000-2 §9.10.3 mendefinisikan /ToUnicode
sebagai sebuah aliran yang berisi CMap yang memetakan kode karakter ke nilai Unicode,
dan prosedur ekstraksi teks di
Spec: ISO 32000-2, §9.10.2 ISO 32000-2 §9.10.2 menggunakan CMap itu untuk
mengonversi kode karakter menjadi Unicode untuk pencarian dan pengindeksan. Tidak ada bagian dari
mesin penggambar glif yang menyentuh /ToUnicode — yang justru menjadi alasan mengapa
teks dapat terlihat benar dan diekstraksi salah.
Untuk penyematan, standar menyatakan bahwa sebagian besar dictionary fon membawa deskriptor fon; aliran berkas-fon tersemat di dalamnya bersifat opsional tetapi sangat direkomendasikan. PDF 2.0 memperketat hal ini khusus untuk keempat belas fon Type 1 standar. Kebijakan NextPDF yaitu Strict adalah pembacaan yang benar dari sisi konformansi atas pengetatan tersebut. AllowBase14 adalah jalan keluar kompatibilitas-mundur yang eksplisit dan sengaja bersifat ikut serta (opt-in) — mesin tidak pernah menurunkan tingkat secara diam-diam.
| Edition | Availability |
|---|---|
| Core | Tersedia. Subsetting, pemancaran |
| Pro | Menambahkan penegakan konformansi dan pelaporan yang lebih dalam seputar penyematan fon pada tingkat profil. |
| Enterprise | Menambahkan penegakan konformansi yang sama di lingkungan operasional enterprise. |
Contoh praktis
Bagian berjudul “Contoh praktis”Berikut dua bagian dari sebuah fon komposit yang tersemat, disubset, dan dapat dicari dengan benar. Tag subset mengikuti aturan enam huruf dari standar; referensi /ToUnicode menjaga teks tetap dapat diekstraksi.
% The Type 0 (composite) font dictionary20 0 obj<< /Type /Font /Subtype /Type0 /BaseFont /ABCDEF+NotoSans % six-letter subset tag + '+' /Encoding /Identity-H /DescendantFonts [21 0 R] /ToUnicode 23 0 R >> % the map that makes text searchableendobj
% The descendant CIDFontType2 (carries the subsetted program)21 0 obj<< /Type /Font /Subtype /CIDFontType2 /BaseFont /ABCDEF+NotoSans /CIDToGIDMap /Identity % glyph IDs preserved, not remapped /FontDescriptor 22 0 R >>endobj/ToUnicode 23 0 R milik Objek 20 adalah pembeda antara dokumen yang dapat dicari dan gambar dokumen. Hapus elemen itu (di luar kasus CMap terdefinisi), dan setiap glif tetap tergambar sempurna, namun pencarian kata apa pun di halaman tidak menemukan apa-apa.
Kesalahpahaman yang umum
Bagian berjudul “Kesalahpahaman yang umum”Jebakannya, terus terang, adalah bahwa glif yang dirender dengan benar tidak mengatakan apa pun tentang apakah teks tersebut adalah teks. Perenderan mengikuti jalur pengodean-ke-glif. Pencarian dan penyalinan mengikuti jalur kode-ke-Unicode (/ToUnicode). Keduanya adalah mekanisme berbeda yang membaca bagian berbeda dari dictionary fon. Oleh karena itu sebuah dokumen dapat memiliki keluaran visual yang sempurna dan /ToUnicode yang tidak ada atau salah. Hasilnya adalah halaman yang terlihat otoritatif dan secara fungsional tidak dapat dicari — kegagalan yang lolos dari setiap tinjauan visual, karena menurut definisinya tidak ada yang dapat dilihat.
Jebakan terkait: berasumsi bahwa “fon sudah tersemat, jadi kita aman untuk arsip.” Penyematan perlu tetapi tidak cukup. Profil seperti PDF/A juga mengharapkan subset yang dinamai sesuai aturan enam huruf dan pengodean yang benar. Tersemat-tetapi-tidak-dapat-dicari tetap gagal.
Batas dan batasan
Bagian berjudul “Batas dan batasan”Subsetter NextPDF secara khusus adalah subsetter TrueType. Ia memerlukan tabel TrueType esensial dan mengembalikan fon asli tanpa perubahan ketika tabel-tabel itu hilang atau keuntungannya di bawah ambang ~10%. Subsetting dan sebuah CMap /ToUnicode membuat teks dapat diekstraksi, tetapi keduanya tidak dapat menyelamatkan fon sumber yang tidak memiliki informasi untuk memetakan glif kembali ke karakter yang bermakna. Ketika tidak ada nilai Unicode yang dapat ditentukan, pemancaran CMap sebanyak apa pun tidak menciptakannya.
Halaman ini membahas pembuatan struktur fon yang benar dalam dokumen yang ditulis oleh NextPDF. Ini bukan alat perbaikan fon untuk PDF input sembarang. Memancarkan subset serta pengodean yang konform saja tidak menyertifikasi dokumen terhadap profil arsip yang lengkap — itu adalah pemeriksaan yang terpisah dan lebih luas.
Mini-FAQ
Bagian berjudul “Mini-FAQ”Mengapa tag enam huruf — mengapa bukan nama fon? Agar pembaca dapat membedakan dua subset berbeda dari fon yang sama dan menggabungkan dokumen tanpa benturan kumpulan glifnya. Subset berbeda, tag berbeda, sesuai aturan.
Kapan ketiadaan /ToUnicode dapat diterima? Ketika sebuah CMap CJK terdefinisi yang mendeskripsikan diri sendiri sudah menyediakan pemetaan karakter-ke-Unicode. Di situ CMap itulah yang menjadi pengodean. Sebuah /ToUnicode yang terpisah akan redundan. Di luar itu, ketiadaannya adalah sebuah cacat.
Apakah subsetting pernah merugikan? Hanya jika dilakukan secara salah. Menjatuhkan komponen glif komposit merusak glif beraksen. Memetakan ulang ID glif tanpa menulis ulang referensi merusak perenderan. NextPDF menghindari keduanya dengan menyelesaikan penutupan komponen dan mempertahankan identitas glif.
Dokumen terkait
Bagian berjudul “Dokumen terkait”- Aliran dan filter — program fon tersemat adalah objek aliran terfilter dengan kontrak dekodenya sendiri.
- Apa sebenarnya PDF itu — model objek tempat dictionary fon dan aliran program berada.
- PDF 2.0: apa yang berubah — termasuk ekspektasi penyematan fon yang diperketat dari baseline 2.0.
Glosarium
Bagian berjudul “Glosarium”- Program fon tersemat — berkas fon yang sebenarnya (TrueType/CFF/Type 1) yang dibawa di dalam PDF sebagai sebuah aliran, sehingga perenderan tidak bergantung pada fon yang terpasang di pembaca.
- Subsetting — menulis ulang program fon agar hanya berisi glif yang digunakan dokumen, untuk mengurangi ukuran.
- Tag subset — prefiks enam huruf kapital yang wajib ditambah
+pada nama fon subset (misalnya,ABCDEF+NotoSans). /ToUnicode— sebuah aliran CMap yang memetakan kode karakter ke nilai Unicode; yang membuat teks PDF dapat dicari, disalin, dan diakses.- Glif komposit — sebuah glif yang dibangun dengan mereferensikan glif lain sebagai komponen; komponen-komponennya harus dipertahankan saat subsetting.
CIDToGIDMap /Identity— mode ketika indeks glif aliran konten adalah ID glif milik fon itu sendiri tanpa perubahan; NextPDF mempertahankan identitas glif agar ini tetap valid.- Base14 — keempat belas fon Type 1 standar; PDF 2.0 mengharapkan fon disematkan, bukan direferensikan berdasarkan nama.