Ошибки рендеринга и ввода-вывода
Область применения
Заголовок раздела «Область применения»Эти записи охватывают исключения рендеринга и ввода-вывода (I/O), генерируемые, пока конвейер HTML компонует содержимое, резолвер постраничного вывода назначает геометрию страницы, формирователь текста обрабатывает сложные письменности, типографский этап переносит строки, писатель сериализует документ, читатель разбирает существующий PDF, а этап метаданных читает пакет Extensible Metadata Platform (XMP).
Ниже появляются две базовые иерархии, и различие управляет тем, какие диагностические
данные вы можете прочитать после catch:
NextPdfExceptionреализуетContextAwareExceptionInterface::getContext(): array. Базовая реализация возвращает пустой массив; подкласс несёт структурированные ключи, только когда он переопределяетgetContext(). Подклассы, которые не переопределяют его, всё равно раскрывают свои данные через свойстваpublic readonly.- Несколько классов здесь наследуются напрямую от PHP-класса
RuntimeException. Они не являются контекстно-зависимыми и не имеют методаgetContext(); читайте вместо этого ихgetMessage()и любые публичные свойства.
Каждая запись называет точный класс, условие срабатывания, ключи контекста или публичные свойства, которые он несёт, и путь восстановления.
Компоновка HTML и постраничный вывод
Заголовок раздела «Компоновка HTML и постраничный вывод»UnsplittableContentException
Заголовок раздела «UnsplittableContentException»- Когда генерируется. Движок компоновки HTML генерирует это, когда содержимое, помеченное
break-inside: avoid(ячейка таблицы, чьё ограничение разрыва —Avoid), имеет измеренную высоту, превышающую полезную высоту одной страницы. Движок не может удовлетворить и ограничение avoid-break, и границу страницы, поэтому он завершается сбоем, а не молча допускает переполнение. - Несомые данные. Наследуется от
NextPdfException, но не переопределяетgetContext(), поэтомуgetContext()возвращает пустой массив. Диагностические данные находятся в свойствахpublic readonly:gridRow(int),gridCol(int),contentHeight(float, пункты) иpageHeight(float, пункты). Сообщение называет координаты ячейки и обе высоты. - Восстановление. Уберите ограничение
break-inside: avoidна проблемной ячейке, уменьшите содержимое ячейки, чтобы оно умещалось на одной странице, или увеличьте размер страницы либо уменьшите её поля, чтобы полезная высота вмещала содержимое.
BudgetExceededException
Заголовок раздела «BudgetExceededException»- Когда генерируется. Примитивы компоновки удерживаемого режима генерируют это, когда один из
четырёх уровней бюджета ресурсов, определённых в записи архитектурного решения
ADR-020, нарушен, а вызывающая сторона выбрала жёсткий сбой вместо
мягкого запасного варианта. Путь по умолчанию не генерирует исключение:
ContainerLayout::acceptChild()возвращаетfalse, вызывающая сторона откатывается к блочной компоновке, и выдаётся предупреждение. Исключение зарезервировано для проверки во время конфигурации и для тестов, которые утверждают точный кортеж нарушения. Уровни — этоper-child( захваченный поток дочернего элемента превышает свой предел),per-container(бюджет количества узлов Tier 1),per-document(бюджет прохода компоновки или глубины вложенности) иglobal(потолок пикового resident-set-size в 256 МБ для всего SDK). - Несомые данные. Переопределяет
getContext(), который возвращает стабильную форму из восьми ключей, потребляемую инструментами мониторинга производительности приложений (APM):budgetTier,exceededValue,budgetLimit,containerType,phase,breachOrigin,captureSizeиprocessedItemCount. Первые четыре ключа являются исходным подмножеством v1.0.0 и всегда заполнены; последние четыре по умолчанию равныnullили0, когда конструктор вызван без них.getCausalWarningCode()сопоставляет кортеж (уровень, тип контейнера) сWarningCode, который выдал бы путь мягкого запасного варианта. - Восстановление. Для нарушения конфигурации верните запрошенное значение обратно в
задокументированный диапазон (например, бюджет удерживаемых узлов принимает 5 000–100 000
через
Config::withRetainedNodeBudget()). Для нарушения содержимого уменьшите вложенность контейнеров или количество узлов или положитесь на мягкий запасной вариант по умолчанию с переходом к блочной компоновке вместо выбора поверхности жёсткого сбоя.
UnsupportedNamedPageException
Заголовок раздела «UnsupportedNamedPageException»- Когда генерируется. Этап постраничного вывода генерирует это, с завершением при отказе, когда
документ объявляет именованное правило
@page <ident> { … }(привязанное к содержимому через свойствоpage: <ident>). Именованные страницы из CSS Paged Media Level 3 §3.4 и Level 4 §3.2 — включая псевдоклассы:first,:left,:rightи:blankи именованные переопределенияsize:иrotate:— разбираются, но ни один продакшен-путь компоновки их не потребляет. Движок отказывает, а не выдаёт молча неверную пагинацию по умолчанию, к которой привело бы отбрасывание правила. - Несомые данные. Переопределяет
getContext(), который возвращаетpage_names(список различных идентификаторов, вызвавших сбой, в порядке исходного кода),has_size_override(bool),has_rotate_override(bool) иhas_pseudo_classes(bool). Те же значения раскрыты в публичных свойствахpageNames,hasSizeOverride,hasRotateOverrideиhasPseudoClasses. - Восстановление. Уберите именованные правила
@page <ident>и любые привязкиpage: <ident>и выразите задуманную геометрию через поддерживаемое неименованное правило@page { … }и его формы псевдоклассов. Либо закрепитесь на будущем релизе, в котором появится полная поддержка компоновки именованных страниц.
Типографика и формирование текста
Заголовок раздела «Типографика и формирование текста»IcuRequirementException
Заголовок раздела «IcuRequirementException»- Когда генерируется. Сегментация текста генерирует это, когда ей нужен
итератор переноса строк International Components for Unicode (ICU), но политика
require-ICU активна (
NEXTPDF_REQUIRE_ICU=1), при этом расширениеext-intlиIntlBreakIteratorнедоступны. - Несомые данные. Наследуется напрямую от
RuntimeException, поэтому он не является контекстно-зависимым и не имеетgetContext(). Это строгое уточнение обобщённого исключения, которое тот же путь кода ранее генерировал, поэтому существующие обработчикиcatch (\RuntimeException)продолжают работать. - Восстановление. Установите и включите
ext-intl, чтобы итератор переноса ICU был доступен, или сбросьтеNEXTPDF_REQUIRE_ICU, чтобы откатиться к не-ICU сегментатору там, где политика require-ICU не обязательна.
ScriptShaperException
Заголовок раздела «ScriptShaperException»- Когда генерируется. Это базовое исключение для интерфейса поставщика услуг формирования письменности (SPI). Сегодня оно не генерируется напрямую; вместо него генерируются конкретные подтипы. Перехватывайте этот тип, чтобы обработать любой сбой формирования в одном месте.
- Несомые данные. Наследуется напрямую от
RuntimeException; не контекстно-зависимо, нетgetContext(). - Восстановление. Ветвитесь по конкретному подтипу. См.
NotYetImplementedExceptionниже — единственный подтип, поставляемый в текущем релизе.
NotYetImplementedException
Заголовок раздела «NotYetImplementedException»- Когда генерируется. Каждый формирователь-заглушка письменности генерирует это из своего
тела
shape()для письменностей, чьё конкретное формирование отложено (монгольская и тибетская). Шов SPI формирования архитектурно готов, но реальное формирование ожидает фикстуру, проверенную носителем языка. Генерация исключения вместо молчаливого отсутствия операции выявляет случайное продакшен-подключение во время выполнения, вместо того чтобы выдавать несформированный текст в PDF, который заявляет тегированную доступность. - Несомые данные. Наследуется от
ScriptShaperException(и, следовательно,RuntimeException), поэтому он не является контекстно-зависимым и не имеетgetContext(). Диагностические данные находятся в его свойствахpublic readonly:bcp47LanguageTag(тег BCP-47 прогона, такой какmn-Mongилиbo-Tibt) иmissingCapability(конкретная возможность, которой не хватает реализации). Сообщение включает обе. - Восстановление. Не направляйте прогоны в нереализованных письменностях через формирователь в продакшене. Определяйте языковой тег выше по потоку и либо откатывайтесь к другому пути рендеринга, либо закрепляйтесь на будущем релизе, в котором появится формирование для затронутой письменности.
Профили вывода писателя и шифрование
Заголовок раздела «Профили вывода писателя и шифрование»Pdf14FeatureRejectedException
Заголовок раздела «Pdf14FeatureRejectedException»- Когда генерируется. Писатель генерирует это, когда документ содержит возможность, запрещённую под профилем вывода PDF 1.4 (ISO 19005-1:2005 / PDF/A-1), который запрещает конструкции, введённые в более поздних версиях PDF.
- Несомые данные. Наследуется от
NextPdfException, но не переопределяетgetContext(), поэтомуgetContext()возвращает пустой массив. Диагностические данные находятся в его свойствахpublic readonly:feature(имя отклонённой возможности),reason(почему она запрещена) иisoClause(ссылка на пункт ISO). Сообщение объединяет все три. - Восстановление. Уберите или замените отклонённую возможность совместимым с PDF 1.4 эквивалентом или нацельтесь на более высокий профиль вывода, разрешающий эту возможность.
Pdf20FeatureRejectedException
Заголовок раздела «Pdf20FeatureRejectedException»- Когда генерируется. Писатель генерирует это, когда документ содержит возможность, запрещённую под строгим профилем вывода PDF 2.0. ISO 32000-2:2020 объявляет устаревшими конструкции, которые PDF 1.7 ещё разрешал — в первую очередь шрифты Standard 14 Type 1 (§9.6.2), которые должны быть внедрены в соответствующий документ PDF 2.0.
- Несомые данные. Та же форма, что и у
Pdf14FeatureRejectedException: наследуется отNextPdfException, не переопределяетgetContext()(возвращает пустой массив) и раскрываетfeature,reasonиisoClauseкак свойстваpublic readonly. - Восстановление. Устраните отклонённую возможность — например, внедрите базовые 14
шрифтов — или воспользуйтесь задокументированной лазейкой там, где она есть (для невнедрённых
базовых 14 шрифтов —
Document::allowNonEmbeddedBase14()).
PublicKeyEncryptionUnsupportedException
Заголовок раздела «PublicKeyEncryptionUnsupportedException»- Когда генерируется.
PdfWriter::build()генерирует это в точке входа, когдаencryptionModeдокумента равенpubkey(список получателей с открытым ключом), прежде чем диспетчеризация шифрования тела потока с открытым ключом на стороне писателя подключена. Отказ заранее предотвращает молчаливый выпуск незашифрованного PDF, который вызывающая сторона считала зашифрованным. - Несомые данные. Наследуется напрямую от
RuntimeException, поэтому он не является контекстно-зависимым и не имеетgetContext(). Это строгое уточнение обобщённого исключения, которое тот же участок ранее генерировал, поэтому существующие обработчикиcatch (\RuntimeException)продолжают работать. - Восстановление. Используйте вместо этого поддерживаемый режим шифрования (шифрование на основе пароля), а не список получателей с открытым ключом, или закрепитесь на релизе, в котором появится поддержка шифрования с открытым ключом. Не считайте вывод зашифрованным, когда это генерируется.
Ввод читателя и метаданных
Заголовок раздела «Ввод читателя и метаданных»UnsupportedPdfStructureException
Заголовок раздела «UnsupportedPdfStructureException»- Когда генерируется. Читатель графа объектов генерирует это, с завершением при отказе, когда
входной PDF выходит за пределы поддерживаемого диапазона. Читатель поддерживает классические
таблицы перекрёстных ссылок (ISO 32000-2:2020 §7.5.4), потоки перекрёстных ссылок
(§7.5.8), сжатые объектным потоком объекты (§7.5.7), многоревизионные цепочки
/Prev(§7.5.6) и файлы с гибридными ссылками через/XRefStm(§7.5.8.4). Всё за пределами этого диапазона проявляется этим исключением, а не частичным или угаданным разбором. Именованные конструкторы сопоставлены со случаями причин:encrypted(),damagedCrossReference(),cyclicReferenceChain(),nonConformantObjectStream(),irresolvableObjectCollision(),truncatedFile()иcrossReferenceOffsetOutOfBounds(). - Несомые данные. Наследуется напрямую от
RuntimeException, поэтому он не является контекстно-зависимым и не имеетgetContext(). Он раскрывает свойствоpublic readonlyreasonтипаUnsupportedPdfStructureReason(перечисление), чтобы вызывающие стороны ветвились по точной категории без разбора сообщения; необязательная строкаdetailиprevious-throwable могут добавить ограниченный, нечувствительный контекст. Сообщение по умолчанию — нераскрывающая сводка причины. - Восстановление. Ветвитесь по
reason. ДляEncryptedDocumentвыполните шаг расшифровки перед чтением, поскольку расшифровка вне области действия читателя. ДляDamagedCrossReference,TruncatedFileилиCrossReferenceOffsetOutOfBoundsсчитайте файл некорректным или неполным и повторно получите либо восстановите источник. ДляCyclicReferenceChain,NonConformantObjectStreamилиIrresolvableObjectCollisionввод нарушает структурную модель и не может быть прочитан как есть.
PacketTooLargeException
Заголовок раздела «PacketTooLargeException»- Когда генерируется. Потоковый читатель метаданных XMP генерирует это, когда встроенный пакет XMP превышает настроенный байтовый потолок. Это защитная мера против входных данных в стиле раскрытия сущностей и квадратичного взрыва (потолок пика 128 МБ против встроенного XMP гигабайтного масштаба).
- Несомые данные. Наследуется от
NextPdfException, но не переопределяетgetContext(), поэтомуgetContext()возвращает пустой массив. Диагностические данные находятся в его свойствахpublic readonly:byteCount(наблюдаемое число байтов) иcap(настроенный предел в байтах). Сообщение сообщает оба. - Восстановление. Отклоните или пропустите слишком большие метаданные как вредоносные или некорректные. Если законному документу действительно нужен больший пакет, повысьте настроенный предел осознанно, взвесив риск исчерпания памяти, ради предотвращения которого мера существует.
См. также
Заголовок раздела «См. также»- Указатель справочника по ошибкам
- Устранение неполадок со шрифтами и тегированием — для симптомов
NotYetImplementedException,ScriptShaperExceptionиIcuRequirementException. - Устранение неполадок при проверке PDF/A и PDF/UA — для симптомов
Pdf14FeatureRejectedExceptionиPdf20FeatureRejectedException. - Устранение неполадок с шифрованием и разрешениями — для
PublicKeyEncryptionUnsupportedExceptionи причиныEncryptedDocumentчитателя.