استكشاف الأخطاء وإصلاحها: الخطوط والاقتصار والوسم
النطاق
قسم بعنوان «النطاق»تتناول هذه المداخل حالات فشل العثور على الخطوط وتحليلها التي تُثار عبر NextPDF\Exception\FontNotFoundException وNextPDF\Exception\FontParsingException. وتغطي أيضًا تشخيصات تغطية الصينية واليابانية والكورية (CJK) ومشكلات شجرة البنية التي تؤثر في المخرجات الموسومة. يذكر كل مدخل الاستثناء أو الاختبار الدقيق حتى تتمكن من التحقق من السبب.
مدخل: الخط غير موجود
قسم بعنوان «مدخل: الخط غير موجود»- العَرَض.
FontNotFoundExceptionبرسالة بصيغةFont "<name>" not found. Searched: [<paths>]. - السبب المحتمل. عائلة الخط المطلوبة أو مسار الملف غير موجود، أو غير قابل للقراءة، أو يقع في دليل خطوط يتعذر على وقت التشغيل الوصول إليه. قد تكون بيانات الخط صالحة، لكن المحرك لا يزال غير قادر على الوصول إليها.
- الدليل / التشخيص. تُرجِع
getContext()القيمfont_nameوsearch_pathsوfallback_attempted. استخدمsearch_pathsلمراجعة كل موقع جرّبه المحرك. استخدمfallback_attemptedللتأكد مما إذا كان المحرك قد حاول استخدام خط احتياطي بالفعل. - الحل.
- طابق
font_nameالمطلوب مع ملف الخط الموجود فعليًا. - أضف الدليل الذي يحتوي على الخط إلى دليل الخطوط المُهيّأ، أو صحّح المسار الذي مرّرته.
- تحقق من قدرة مستخدم وقت التشغيل على قراءة الملف.
- أعد تنفيذ الاستدعاء.
- طابق
- ذو صلة. مرجع الاستثناءات.
مدخل: فشل تحليل ملف الخط بنيويًا
قسم بعنوان «مدخل: فشل تحليل ملف الخط بنيويًا»- العَرَض.
FontParsingExceptionبرسالة بصيغةFailed to parse font file "<file>": <reason>. - السبب المحتمل. عثر المحرك على ملف الخط، لكنه تعذّر عليه استخدام محتواه: ترويسة مبتورة، أو دليل جداول غير صالح، أو جدول إلزامي مفقود مثل
headأوhheaأوOS/2. - الدليل / التشخيص. تُرجِع
getContext()القيمتينfont_fileوparse_error. توضّحparse_errorالمشكلة البنيوية. - الحل.
- اقرأ
parse_errorلتحديد الخلل البنيوي. - استبدل ملف الخط بنسخة سليمة معروفة من الوجه نفسه.
- أعد تشغيل الاستدعاء.
- اقرأ
- ذو صلة. مرجع الاستثناءات.
مدخل: فشل الاقتصار بسبب جدول خط مشوّه
قسم بعنوان «مدخل: فشل الاقتصار بسبب جدول خط مشوّه»- العَرَض.
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. - السبب المحتمل. اجتاز الخط التحميل الأولي، لكن جدولًا مطلوبًا للاقتصار مبتور أو يتعذر فك حزمه. يرفض المُقتصِر الخط بدلًا من إصدار مجموعة جزئية تالفة.
- الدليل / التشخيص. عندما يكون جدول
headأوhheaأوmaxpقصيرًا جدًا أو تفشل عملية فك حزمه، يُطلِقsrc/Typography/FontSubsetter.phpالاستثناءFontParsingExceptionمع الرمز الحرفيfont-subsetبوصفه اسم الملف. يدلّك هذا الرمز على أن الفشل وقع أثناء الاقتصار، لا أثناء التحميل الأولي. - الحل.
- استبدل خط المصدر بنسخة كاملة وغير مبتورة من الوجه نفسه.
- إذا كانت أداة البناء تولّد الخط، فأعد توليده وتحقق من اكتمال جداول
headوhheaوmaxp. - أعد تشغيل البناء.
- ذو صلة. التحقق من PDF/A وPDF/UA.
مدخل: نص CJK يُعرَض بمحارف رسومية مفقودة
قسم بعنوان «مدخل: نص CJK يُعرَض بمحارف رسومية مفقودة»- العَرَض. يُعرَض النص الصيني أو الياباني أو الكوري على هيئة مربعات فارغة أو محارف مفقودة، وتكون تغطية الخط لـ CJK غير مؤكدة.
- السبب المحتمل. الخط المحدد لا يغطي كتل Unicode التي يتطلبها النظام الكتابي. يتطلب كل نظام كتابي من أنظمة CJK كتلًا محددة بالإضافة إلى كتل الأيديوغرافات المشتركة.
- الدليل / التشخيص. يوفّر
src/Typography/CjkFontValidator.phpالدالةvalidateCoverage(FontInfo $font, CjkScript $script). تُرجِعCjkCoverageResultمع نسبة التغطية المئوية وأي كتل دون عتبة الإبلاغ البالغة %50. يأخذ المدقق عينات من نقاط الترميز. إنها أداة تشخيص ولا تعدّل تحميل الخطوط. - الحل.
- شغّل
CjkFontValidator::validateCoverage()للخط والنظام الكتابي المستهدف. - اقرأ
missingRangesلمعرفة الكتل غير المغطاة، على سبيل المثال، Bopomofo للصينية التقليدية، وHiragana وKatakana لليابانية، وHangul Syllables للكورية. - حدّد خطًا يغطي تلك الكتل، أو أضف خطًا احتياطيًا يغطيها.
- أعد تنفيذ العرض وأعد فحص التغطية.
- شغّل
- ذو صلة. مرجع الاستثناءات.
مدخل: خريطة 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، فحدد خطًا يتضمنها حتى يستقر الاكتشاف على النظام الكتابي المقصود.
- أعد تنفيذ العرض.
- ذو صلة. مرجع الاستثناءات.
مدخل: المحتوى الموسوم لا يُنتِج شجرة بنية قابلة للاستخدام
قسم بعنوان «مدخل: المحتوى الموسوم لا يُنتِج شجرة بنية قابلة للاستخدام»- العَرَض. لا يُنتِج البناء الموسوم أي بنية، أو يُبلِغ فحص لاحق للإتاحة عن شجرة بنية فارغة أو مفقودة.
- السبب المحتمل. أخرج البناء المحتوى خارج مسار الوسم، فلم يُنشئ أي عناصر بنية. تبقى شجرة البنية فارغة.
- الدليل / التشخيص. يبني
src/Accessibility/StructureTree.phpوsrc/Accessibility/TaggedContentEmitter.phpشجرة البنية من المحتوى الموسوم. يؤكد الاختبارtests/Integration/Accessibility/EmptyTaggedPdfDoesNotAdvertisePdfUa2Test.phpأن شجرة البنية الفارغة لا تُعلن التوافق مع PDF/UA-2. - الحل.
- تأكّد من أن المحتوى يُخرَج عبر مسار الوسم حتى تُنشأ عناصر البنية.
- تحقق من أن كل تسلسل محتوى موسوم يرتبط بعنصر بنية.
- أعد تنفيذ البناء وافحص شجرة البنية.
- ذو صلة. التحقق من PDF/A وPDF/UA.
مدخل: رفض وسم لغة عنصر البنية
قسم بعنوان «مدخل: رفض وسم لغة عنصر البنية»- العَرَض. يفشل البناء لأن قيمة اللغة على عنصر بنية أو على المستند ليست وسمًا صالحًا.
- السبب المحتمل. اللغة المُقدَّمة ليست وسمًا صالحًا من 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. - عيّن اللغة على عنصر البنية المحدد عندما يختلف مقطع عن لغة المستند.
- أعد تنفيذ البناء.
- استبدل قيمة اللغة بوسم صالح من BCP 47، مثل
- ذو صلة. التحقق من PDF/A وPDF/UA.
الحالات الحدّية والمزالق
قسم بعنوان «الحالات الحدّية والمزالق»- يُبلِغ
FontNotFoundExceptionوFontParsingExceptionعن حالات فشل مختلفة. يعني “غير موجود” أنه تعذّر الوصول إلى الملف. ويعني التحليل البنيوي أنه جرى الوصول إلى الملف، لكن وحدات بايت محتواه غير قابلة للاستخدام. اقرأ اسم الصنف لتحديد أي فشل وقع. font-subsetفيfont_fileعلامة مقصودة لمرحلة الاقتصار، وليس مسارًا فعليًا. لا تبحث عن ملف باسمfont-subset.- يأخذ
CjkFontValidatorعينات من نقاط الترميز بدلًا من فحص كل واحدة، لذا فإن رقم التغطية فيه تقدير يساعد على اختيار الخط، وليس تدقيقًا دقيقًا على مستوى البايت. - يُبلَّغ عن شجرة البنية الفارغة بوصفها غير متوافقة مع PDF/UA-2 بحسب التصميم. هذا هو سلوك المحرك الموثّق، وليس خللًا.
انظر أيضًا
قسم بعنوان «انظر أيضًا»المسرد: اقتصار الخطوط · تغطية CJK · شجرة البنية