การแก้ไขปัญหา: ฟอนต์ การทำ subset และการแท็ก
รายการต่อไปนี้ครอบคลุมความล้มเหลวในการค้นหาฟอนต์และการแยกวิเคราะห์ที่เกิดขึ้นผ่าน NextPDF\Exception\FontNotFoundException และ NextPDF\Exception\FontParsingException รวมถึงการวินิจฉัยความครอบคลุมของภาษาจีน ญี่ปุ่น และเกาหลี (CJK) และปัญหา structure tree ที่ส่งผลต่อเอาต์พุตที่มีการแท็ก แต่ละรายการระบุข้อยกเว้นหรือการทดสอบที่เฉพาะเจาะจง เพื่อให้ตรวจสอบสาเหตุได้
รายการ: ไม่พบฟอนต์
หัวข้อที่มีชื่อว่า “รายการ: ไม่พบฟอนต์”- อาการ
FontNotFoundExceptionพร้อมข้อความรูปแบบFont "<name>" not found. Searched: [<paths>] - สาเหตุที่เป็นไปได้ ตระกูลฟอนต์หรือพาธของไฟล์ที่ร้องขอไม่มีอยู่ ไม่สามารถอ่านได้ หรืออยู่ในไดเรกทอรีฟอนต์ที่ runtime เข้าถึงไม่ได้ ข้อมูลฟอนต์อาจถูกต้อง แต่เอนจินยังเข้าถึงข้อมูลฟอนต์ไม่ได้
- หลักฐาน / การวินิจฉัย
getContext()จะคืนค่าfont_name,search_pathsและfallback_attemptedใช้search_pathsเพื่อตรวจสอบทุกตำแหน่งที่เอนจินพยายามค้นหา ใช้fallback_attemptedเพื่อยืนยันว่ามีการเรียกใช้ fallback ไปแล้วหรือไม่ - การแก้ไข
- เปรียบเทียบ
font_nameที่ร้องขอกับไฟล์ฟอนต์ที่มีอยู่จริง - เพิ่มไดเรกทอรีที่มีฟอนต์อยู่เข้าไปยังไดเรกทอรีฟอนต์ที่กำหนดค่าไว้ หรือแก้ไขพาธที่ส่งเข้ามาให้ถูกต้อง
- ตรวจสอบว่าผู้ใช้ของ runtime สามารถอ่านไฟล์ได้
- เรียกใช้งานอีกครั้ง
- ที่เกี่ยวข้อง ข้อมูลอ้างอิงข้อยกเว้น
รายการ: การแยกวิเคราะห์ไฟล์ฟอนต์ล้มเหลว
หัวข้อที่มีชื่อว่า “รายการ: การแยกวิเคราะห์ไฟล์ฟอนต์ล้มเหลว”- อาการ
FontParsingExceptionพร้อมข้อความรูปแบบFailed to parse font file "<file>": <reason> - สาเหตุที่เป็นไปได้ เอนจินพบไฟล์ฟอนต์แล้ว แต่ไม่สามารถใช้เนื้อหาภายในได้ เช่น ส่วนหัวถูกตัดทอน ไดเรกทอรีตารางไม่ถูกต้อง หรือตารางบังคับขาดหายไป เช่น
head,hheaหรือOS/2 - หลักฐาน / การวินิจฉัย
getContext()จะคืนค่าfont_fileและparse_errorparse_errorจะระบุปัญหาเชิงโครงสร้าง - การแก้ไข
- อ่าน
parse_errorเพื่อระบุข้อบกพร่องเชิงโครงสร้าง - แทนที่ไฟล์ฟอนต์ด้วยสำเนาที่ทราบว่าใช้งานได้ของฟอนต์หน้าตาเดียวกัน
- เรียกใช้งานอีกครั้ง
- ที่เกี่ยวข้อง ข้อมูลอ้างอิงข้อยกเว้น
รายการ: การทำ subset ล้มเหลวเนื่องจากตารางฟอนต์ผิดรูปแบบ
หัวข้อที่มีชื่อว่า “รายการ: การทำ subset ล้มเหลวเนื่องจากตารางฟอนต์ผิดรูปแบบ”- อาการ
FontParsingExceptionโดยที่font_fileมีค่าเป็นfont-subsetและมีparse_errorเช่นInvalid head table: too short,Invalid hhea table: too short,Invalid maxp table: too shortหรือFailed to unpack font data - สาเหตุที่เป็นไปได้ ฟอนต์ผ่านการโหลดเริ่มต้นแล้ว แต่ตารางที่จำเป็นสำหรับการทำ subset ถูกตัดทอนหรือไม่สามารถ unpack ได้ ตัวทำ subset จะปฏิเสธฟอนต์แทนที่จะสร้าง subset ที่เสียหาย
- หลักฐาน / การวินิจฉัย เมื่อตาราง
head,hheaหรือmaxpสั้นเกินไปหรือการ unpack ล้มเหลวsrc/Typography/FontSubsetter.phpจะส่งFontParsingExceptionโดยใช้โทเค็นตามตัวอักษรfont-subsetเป็นชื่อไฟล์ โทเค็นนี้บ่งบอกว่าความล้มเหลวเกิดขึ้นระหว่างการทำ subset ไม่ใช่ระหว่างการโหลดเริ่มต้น - การแก้ไข
- แทนที่ฟอนต์ต้นทางด้วยสำเนาที่สมบูรณ์และไม่ถูกตัดทอนของฟอนต์หน้าตาเดียวกัน
- หากมีเครื่องมือ build สร้างฟอนต์ขึ้น ให้สร้างฟอนต์ใหม่และตรวจสอบว่าตาราง
head,hheaและmaxpสมบูรณ์ - เรียกใช้งาน build อีกครั้ง
- ที่เกี่ยวข้อง การตรวจสอบความถูกต้องของ PDF/A และ PDF/UA
รายการ: ข้อความ CJK แสดงผลโดยมีกลีฟขาดหายไป
หัวข้อที่มีชื่อว่า “รายการ: ข้อความ CJK แสดงผลโดยมีกลีฟขาดหายไป”- อาการ ข้อความภาษาจีน ญี่ปุ่น หรือเกาหลีแสดงผลเป็นกล่องว่างหรืออักขระขาดหายไป และความครอบคลุม CJK ของฟอนต์ยังไม่แน่ชัด
- สาเหตุที่เป็นไปได้ ฟอนต์ที่เลือกไม่ครอบคลุมบล็อก Unicode ที่สคริปต์ต้องการ สคริปต์ CJK แต่ละแบบต้องใช้บล็อกเฉพาะเพิ่มเติมจากบล็อกอักษรภาพที่ใช้ร่วมกัน
- หลักฐาน / การวินิจฉัย
src/Typography/CjkFontValidator.phpมีvalidateCoverage(FontInfo $font, CjkScript $script)ซึ่งคืนค่าCjkCoverageResultพร้อมเปอร์เซ็นต์ความครอบคลุมและบล็อกใด ๆ ที่ต่ำกว่าเกณฑ์การรายงาน 50% ตัวตรวจสอบจะสุ่มตัวอย่าง codepoint เพื่อใช้เป็นเครื่องมือวินิจฉัย และจะไม่เปลี่ยนการโหลดฟอนต์ - การแก้ไข
- เรียกใช้
CjkFontValidator::validateCoverage()สำหรับฟอนต์และสคริปต์เป้าหมาย - อ่าน
missingRangesเพื่อดูว่าบล็อกใดไม่ถูกครอบคลุม เช่น Bopomofo สำหรับภาษาจีนตัวเต็ม Hiragana และ Katakana สำหรับภาษาญี่ปุ่น และ Hangul Syllables สำหรับภาษาเกาหลี - เลือกฟอนต์ที่ครอบคลุมบล็อกเหล่านั้น หรือเพิ่มฟอนต์ fallback ที่ครอบคลุม
- เรียกใช้การเรนเดอร์อีกครั้งและตรวจสอบความครอบคลุมอีกครั้ง
- ที่เกี่ยวข้อง ข้อมูลอ้างอิงข้อยกเว้น
รายการ: CMap ที่กำหนดไว้ล่วงหน้าไม่ตรงกับสคริปต์ CJK
หัวข้อที่มีชื่อว่า “รายการ: CMap ที่กำหนดไว้ล่วงหน้าไม่ตรงกับสคริปต์ CJK”- อาการ ข้อความ CJK ถูกแมปไปยังกลีฟที่ไม่ถูกต้อง หรือเอกสารใช้ CMap ที่กำหนดไว้ล่วงหน้าซึ่งไม่ตรงกับภาษาของเอกสาร
- สาเหตุที่เป็นไปได้ สคริปต์ที่ตรวจพบจะกำหนดชื่อ CMap ที่กำหนดไว้ล่วงหน้าของ Adobe ฟอนต์ที่ครอบคลุมเฉพาะบล็อกอักษรภาพที่ใช้ร่วมกัน แต่ไม่มีบล็อกเฉพาะของสคริปต์ จะถูกตรวจพบเป็นภาษาจีนตัวย่อตามการออกแบบ
- หลักฐาน / การวินิจฉัย
CjkFontValidator::detectScript()จะคืนค่าสคริปต์ที่ตรวจพบ และresolvePredefinedCMapName()จะแมปสคริปต์นั้น: ภาษาจีนตัวย่อไปยังUniGB-UTF16-Hภาษาจีนตัวเต็มไปยังUniCNS-UTF16-Hภาษาญี่ปุ่นไปยังUniJIS-UTF16-HและภาษาเกาหลีไปยังUniKS-UTF16-Hหากไม่มีบล็อกเฉพาะของสคริปต์ การตรวจหาจะถอยกลับไปเป็นภาษาจีนตัวย่อ - การแก้ไข
- ยืนยันว่าฟอนต์มาพร้อมบล็อกเฉพาะของสคริปต์: Bopomofo สำหรับภาษาจีนตัวเต็ม Hiragana หรือ Katakana สำหรับภาษาญี่ปุ่น และ Hangul สำหรับภาษาเกาหลี
- หากเอกสารเป็นภาษาจีนตัวเต็มแต่ฟอนต์ไม่มีบล็อก Bopomofo ให้เลือกฟอนต์ที่มีบล็อกดังกล่าว เพื่อให้การตรวจหาแก้ไขไปยังสคริปต์ที่ต้องการ
- เรียกใช้การเรนเดอร์อีกครั้ง
- ที่เกี่ยวข้อง ข้อมูลอ้างอิงข้อยกเว้น
รายการ: เนื้อหาแบบแท็กไม่สร้าง structure tree ที่ใช้งานได้
หัวข้อที่มีชื่อว่า “รายการ: เนื้อหาแบบแท็กไม่สร้าง structure tree ที่ใช้งานได้”- อาการ การ build แบบแท็กไม่สร้างโครงสร้าง หรือการตรวจสอบการช่วยการเข้าถึงในขั้นถัดไปรายงานว่า structure tree ว่างเปล่าหรือขาดหายไป
- สาเหตุที่เป็นไปได้ การ build สร้างเนื้อหานอกเส้นทางการแท็ก จึงไม่ได้สร้างองค์ประกอบโครงสร้างใด ๆ และ structure tree จะยังคงว่างเปล่า
- หลักฐาน / การวินิจฉัย
src/Accessibility/StructureTree.phpและsrc/Accessibility/TaggedContentEmitter.phpจะสร้าง structure tree จากเนื้อหาแบบแท็ก การทดสอบtests/Integration/Accessibility/EmptyTaggedPdfDoesNotAdvertisePdfUa2Test.phpยืนยันว่า structure tree ที่ว่างเปล่าจะไม่ประกาศตัวเป็น PDF/UA-2 - การแก้ไข
- ยืนยันว่ามีการสร้างเนื้อหาผ่านเส้นทางการแท็ก เพื่อให้องค์ประกอบโครงสร้างถูกสร้างขึ้น
- ตรวจสอบว่าลำดับ marked-content แต่ละชุดถูกแมปไปยังองค์ประกอบโครงสร้าง
- เรียกใช้งาน build อีกครั้งและตรวจสอบ structure tree
- ที่เกี่ยวข้อง การตรวจสอบความถูกต้องของ PDF/A และ PDF/UA
รายการ: แท็กภาษาขององค์ประกอบโครงสร้างถูกปฏิเสธ
หัวข้อที่มีชื่อว่า “รายการ: แท็กภาษาขององค์ประกอบโครงสร้างถูกปฏิเสธ”- อาการ การ build ล้มเหลวเนื่องจากค่าภาษาบนองค์ประกอบโครงสร้างหรือบนเอกสารไม่ใช่แท็กที่ถูกต้อง
- สาเหตุที่เป็นไปได้ ภาษาที่ระบุไม่ใช่แท็ก BCP-47 ที่ถูกต้อง ตัวตรวจสอบจะปฏิเสธแท็กที่มีรูปแบบไม่ถูกต้องแทนที่จะสร้างแท็กเหล่านั้นออกมา
- หลักฐาน / การวินิจฉัย
src/Accessibility/Bcp47Validator.phpจะตรวจสอบความถูกต้องของแท็ก แท็กที่ไม่ถูกต้องจะทำให้เกิดsrc/Accessibility/InvalidBcp47TagException.phpส่วนtests/Unit/Conformance/PdfUa2Section844LangStrictTest.phpทดสอบข้อกำหนดด้านภาษาที่เข้มงวดของ PDF/UA-2 - การแก้ไข
- แทนที่ค่าภาษาด้วยแท็ก BCP-47 ที่ถูกต้อง เช่น
en-US,de-DEหรือzh-Hant-TW - กำหนดภาษาบนองค์ประกอบโครงสร้างที่เฉพาะเจาะจง เมื่อข้อความบางส่วนแตกต่างจากภาษาของเอกสาร
- เรียกใช้งาน build อีกครั้ง
- ที่เกี่ยวข้อง การตรวจสอบความถูกต้องของ PDF/A และ PDF/UA
กรณีขอบเขตและข้อควรระวัง
หัวข้อที่มีชื่อว่า “กรณีขอบเขตและข้อควรระวัง”FontNotFoundExceptionและFontParsingExceptionรายงานความล้มเหลวคนละประเภท ไม่พบ หมายความว่าไม่สามารถเข้าถึงไฟล์ได้ การแยกวิเคราะห์ หมายความว่าเข้าถึงไฟล์ได้แล้ว แต่ไบต์ของไฟล์ใช้งานไม่ได้ อ่านคลาสเพื่อระบุว่าความล้มเหลวใดเกิดขึ้นfont-subsetในfont_fileเป็นเครื่องหมายที่กำหนดไว้โดยเจตนาสำหรับขั้นการทำ subset ไม่ใช่พาธจริง อย่ามองหาไฟล์ที่ชื่อfont-subsetCjkFontValidatorสุ่มตัวอย่าง codepoint แทนการตรวจสอบทุกตัว ดังนั้นค่าความครอบคลุมจึงเป็นค่าประมาณสำหรับการเลือกฟอนต์ ไม่ใช่การตรวจสอบที่แม่นยำระดับไบต์- structure tree ที่ว่างเปล่าจะถูกรายงานว่าไม่เป็น PDF/UA-2 ตามการออกแบบ นี่คือพฤติกรรมของเอนจินที่มีการบันทึกไว้ ไม่ใช่ข้อบกพร่อง
ดูเพิ่มเติม
หัวข้อที่มีชื่อว่า “ดูเพิ่มเติม”อภิธานศัพท์: การทำ subset ฟอนต์ · ความครอบคลุม CJK · structure tree