Pemecahan masalah: fon, subsetting, dan penandaan
Cakupan
Bagian berjudul “Cakupan”Entri-entri ini mencakup kegagalan resolusi dan parsing fon yang muncul melalui NextPDF\Exception\FontNotFoundException dan NextPDF\Exception\FontParsingException. Entri-entri ini juga mencakup diagnostik cakupan bahasa Tionghoa, Jepang, dan Korea (CJK) serta masalah pohon struktur yang memengaruhi output bertanda. Setiap entri menyebutkan eksepsi atau pengujian yang tepat agar Anda dapat memverifikasi penyebabnya.
Entri: fon tidak ditemukan
Bagian berjudul “Entri: fon tidak ditemukan”- Gejala.
FontNotFoundExceptiondengan pesan berbentukFont "<name>" not found. Searched: [<paths>]. - Kemungkinan penyebab. Famili fon atau jalur berkas yang diminta tidak ada, tidak dapat dibaca, atau berada di direktori fon yang tidak dapat diakses oleh runtime. Data fon mungkin valid, tetapi mesin tetap tidak dapat mengaksesnya.
- Bukti / diagnosis.
getContext()mengembalikanfont_name,search_paths, danfallback_attempted. Gunakansearch_pathsuntuk memeriksa setiap lokasi yang dicoba oleh mesin. Gunakanfallback_attempteduntuk memastikan apakah fallback sudah dijalankan. - Penyelesaian.
- Bandingkan
font_nameyang diminta dengan berkas fon yang sebenarnya ada. - Tambahkan direktori yang berisi fon tersebut ke direktori fon yang dikonfigurasi, atau perbaiki jalur yang Anda berikan.
- Verifikasi bahwa pengguna runtime dapat membaca berkas tersebut.
- Jalankan kembali pemanggilan tersebut.
- Bandingkan
- Terkait. Referensi eksepsi.
Entri: berkas fon gagal di-parse
Bagian berjudul “Entri: berkas fon gagal di-parse”- Gejala.
FontParsingExceptiondengan pesan berbentukFailed to parse font file "<file>": <reason>. - Kemungkinan penyebab. Mesin menemukan berkas fon, tetapi tidak dapat memakai isinya: header yang terpotong, direktori tabel yang tidak valid, atau tabel wajib yang hilang seperti
head,hhea, atauOS/2. - Bukti / diagnosis.
getContext()mengembalikanfont_filedanparse_error.parse_errormenyebutkan masalah strukturalnya. - Penyelesaian.
- Baca
parse_erroruntuk mengidentifikasi cacat strukturalnya. - Ganti berkas fon dengan salinan tepercaya dari muka huruf yang sama.
- Jalankan kembali pemanggilan tersebut.
- Baca
- Terkait. Referensi eksepsi.
Entri: subsetting gagal pada tabel fon yang cacat
Bagian berjudul “Entri: subsetting gagal pada tabel fon yang cacat”- Gejala.
FontParsingExceptiondengan nilaifont_fileberupafont-subsetdanparse_errorsepertiInvalid head table: too short,Invalid hhea table: too short,Invalid maxp table: too short, atauFailed to unpack font data. - Kemungkinan penyebab. Fon berhasil melewati pemuatan awal, tetapi sebuah tabel yang diperlukan untuk subsetting terpotong atau tidak dapat dibongkar. Subsetter menolak fon tersebut alih-alih menghasilkan subset yang rusak.
- Bukti / diagnosis. Ketika tabel
head,hhea, ataumaxpterlalu pendek atau pembongkaran gagal,src/Typography/FontSubsetter.phpmemunculkanFontParsingExceptiondengan token harfiahfont-subsetsebagai nama berkas. Token tersebut memberi tahu Anda bahwa kegagalan terjadi selama subsetting, bukan pemuatan awal. - Penyelesaian.
- Ganti fon sumber dengan salinan utuh yang tidak terpotong dari muka huruf yang sama.
- Jika sebuah alat build menghasilkan fon, hasilkan ulang dan verifikasi bahwa tabel
head,hhea, danmaxplengkap. - Jalankan kembali build.
- Terkait. Validasi PDF/A dan PDF/UA.
Entri: teks CJK ditampilkan dengan glif yang hilang
Bagian berjudul “Entri: teks CJK ditampilkan dengan glif yang hilang”- Gejala. Teks bahasa Tionghoa, Jepang, atau Korea ditampilkan sebagai kotak kosong atau karakter yang hilang, dan cakupan CJK pada fon tersebut belum pasti.
- Kemungkinan penyebab. Fon yang dipilih tidak mencakup blok Unicode yang dibutuhkan oleh skrip tersebut. Setiap skrip CJK membutuhkan blok-blok tertentu selain blok ideograf bersama.
- Bukti / diagnosis.
src/Typography/CjkFontValidator.phpmenyediakanvalidateCoverage(FontInfo $font, CjkScript $script). Fungsi ini mengembalikanCjkCoverageResultdengan persentase cakupan dan blok apa pun yang berada di bawah ambang pelaporan 50%. Validator ini mengambil sampel titik kode. Validator ini bersifat diagnostik dan tidak mengubah pemuatan fon. - Penyelesaian.
- Jalankan
CjkFontValidator::validateCoverage()untuk fon dan skrip target. - Baca
missingRangesuntuk melihat blok mana yang tidak tercakup, misalnya Bopomofo untuk bahasa Tionghoa Tradisional, Hiragana dan Katakana untuk bahasa Jepang, dan Hangul Syllables untuk bahasa Korea. - Pilih fon yang mencakup blok-blok tersebut, atau tambahkan fon fallback yang mencakupnya.
- Jalankan kembali proses rendering dan periksa ulang cakupannya.
- Jalankan
- Terkait. Referensi eksepsi.
Entri: CMap pradefinisi tidak cocok dengan skrip CJK
Bagian berjudul “Entri: CMap pradefinisi tidak cocok dengan skrip CJK”- Gejala. Teks CJK dipetakan ke glif yang salah, atau dokumen menggunakan CMap pradefinisi yang tidak cocok dengan bahasanya.
- Kemungkinan penyebab. Skrip yang terdeteksi menentukan nama CMap pradefinisi Adobe. Fon yang hanya mencakup blok ideograf bersama, tanpa blok khusus skrip, terdeteksi sebagai bahasa Tionghoa Sederhana sesuai rancangan.
- Bukti / diagnosis.
CjkFontValidator::detectScript()mengembalikan skrip yang terdeteksi, danresolvePredefinedCMapName()memetakannya: bahasa Tionghoa Sederhana keUniGB-UTF16-H, bahasa Tionghoa Tradisional keUniCNS-UTF16-H, bahasa Jepang keUniJIS-UTF16-H, dan bahasa Korea keUniKS-UTF16-H. Jika tidak ada blok khusus skrip yang tersedia, deteksi akan kembali ke bahasa Tionghoa Sederhana. - Penyelesaian.
- Pastikan fon menyertakan blok khusus skrip: Bopomofo untuk bahasa Tionghoa Tradisional, Hiragana atau Katakana untuk bahasa Jepang, dan Hangul untuk bahasa Korea.
- Jika dokumen berbahasa Tionghoa Tradisional tetapi fon tidak memiliki blok Bopomofo, pilih fon yang menyertakannya agar deteksi menghasilkan skrip yang dimaksud.
- Jalankan kembali proses rendering.
- Terkait. Referensi eksepsi.
Entri: konten bertanda tidak menghasilkan pohon struktur yang dapat dipakai
Bagian berjudul “Entri: konten bertanda tidak menghasilkan pohon struktur yang dapat dipakai”- Gejala. Build bertanda tidak menghasilkan struktur, atau pemeriksaan aksesibilitas di tahap hilir melaporkan pohon struktur yang kosong atau hilang.
- Kemungkinan penyebab. Build memancarkan konten di luar jalur penandaan, sehingga elemen struktur tidak dibuat. Pohon struktur tetap kosong.
- Bukti / diagnosis.
src/Accessibility/StructureTree.phpdansrc/Accessibility/TaggedContentEmitter.phpmembangun pohon struktur dari konten bertanda. Pengujiantests/Integration/Accessibility/EmptyTaggedPdfDoesNotAdvertisePdfUa2Test.phpmemastikan bahwa pohon struktur kosong tidak menyatakan diri sebagai PDF/UA-2. - Penyelesaian.
- Pastikan konten dipancarkan melalui jalur penandaan agar elemen struktur dibuat.
- Verifikasi bahwa setiap urutan marked-content dipetakan ke sebuah elemen struktur.
- Jalankan kembali build dan periksa pohon strukturnya.
- Terkait. Validasi PDF/A dan PDF/UA.
Entri: tag bahasa elemen struktur ditolak
Bagian berjudul “Entri: tag bahasa elemen struktur ditolak”- Gejala. Build gagal karena nilai bahasa pada sebuah elemen struktur atau pada dokumen bukan tag valid.
- Kemungkinan penyebab. Bahasa yang diberikan bukan tag BCP 47 yang valid. Validator menolak tag yang cacat alih-alih memancarkannya.
- Bukti / diagnosis.
src/Accessibility/Bcp47Validator.phpmemvalidasi tag tersebut. Tag yang tidak valid memunculkansrc/Accessibility/InvalidBcp47TagException.php.tests/Unit/Conformance/PdfUa2Section844LangStrictTest.phpmenguji persyaratan bahasa PDF/UA-2 yang ketat. - Penyelesaian.
- Ganti nilai bahasa dengan tag BCP 47 yang valid, seperti
en-US,de-DE, atauzh-Hant-TW. - Atur bahasa pada elemen struktur tertentu ketika sebuah bagian berbeda dari bahasa dokumen.
- Jalankan kembali build.
- Ganti nilai bahasa dengan tag BCP 47 yang valid, seperti
- Terkait. Validasi PDF/A dan PDF/UA.
Kasus khusus & jebakan
Bagian berjudul “Kasus khusus & jebakan”FontNotFoundExceptiondanFontParsingExceptionmelaporkan kegagalan yang berbeda. Tidak ditemukan berarti berkas tidak dapat dijangkau. Parsing berarti berkas dapat dijangkau, tetapi byte-nya tidak dapat digunakan. Baca kelas tersebut untuk mengidentifikasi kegagalan mana yang terjadi.font-subsetdi dalamfont_fileadalah penanda yang memang disengaja untuk tahap subsetting, bukan jalur yang sebenarnya. Jangan mencari berkas bernamafont-subset.CjkFontValidatormengambil sampel titik kode alih-alih memeriksa setiap titik kode, sehingga angka cakupannya merupakan perkiraan untuk pemilihan fon, bukan audit yang akurat byte demi byte.- Pohon struktur kosong dilaporkan sebagai bukan PDF/UA-2 sesuai rancangan. Ini adalah perilaku mesin yang terdokumentasi, bukan cacat.
Lihat juga
Bagian berjudul “Lihat juga”Glosarium: subsetting fon · cakupan CJK · pohon struktur