Устранение неполадок: шрифты, создание подмножеств и тегирование
Область применения
Заголовок раздела «Область применения»В этих записях разобраны сбои при разрешении и разборе шрифтов, возникающие через 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сообщают о разных сбоях. Not-found означает, что файл недоступен. Parsing означает, что файл доступен, но его байты непригодны для использования. Проверьте класс исключения, чтобы определить, какой сбой произошёл.font-subsetвfont_file— это намеренный маркер этапа создания подмножества, а не фактический путь. Не ищите файл с именемfont-subset.CjkFontValidatorберёт выборку кодовых точек вместо проверки каждой из них, поэтому его показатель покрытия является оценкой для выбора шрифта, а не побайтовым аудитом.- Пустое дерево структуры по замыслу помечается как не соответствующее PDF/UA-2. Это задокументированное поведение движка, а не дефект.
См. также
Заголовок раздела «См. также»Глоссарий: создание подмножеств шрифтов · покрытие CJK · дерево структуры