コンテンツにスキップ
getnextpdf.com

レンダリングおよび I/O のエラー

これらのエントリは、HTML パイプラインがコンテンツをレイアウトし、ページドメディアリゾルバーがページジオメトリを割り当て、テキストシェイパーが複雑なスクリプトを処理し、タイポグラフィステージが行を分割し、ライターがドキュメントをシリアライズし、リーダーが既存の PDF をパースし、 メタデータステージが Extensible Metadata Platform(XMP)パケットを読み取る際に送出される、レンダリングおよび入出力(I/O)の例外を扱います。

以下には 2 つの基底階層が登場します。その違いは、catch の後に読み取れる診断データを決定します。

  • NextPdfExceptionContextAwareExceptionInterface::getContext(): array を実装します。基底実装は空の配列を返します。サブクラスは、getContext() をオーバーライドした場合にのみ構造化されたキーを保持します。オーバーライドしないサブクラスは、 それでも public readonly プロパティを通じてデータを公開します。
  • ここでのいくつかのクラスは、PHP の RuntimeException を直接継承します。これらはコンテキスト対応ではなく getContext() メソッドを持ちません。代わりにその getMessage() と任意の public プロパティを読み取ってください。

各エントリでは、正確なクラス、トリガー条件、保持するコンテキストキーまたは public プロパティ、そして復旧パスを示します。

  • 送出される条件。 break-inside: avoid とマークされたコンテンツ(その break 制約が Avoid であるテーブルセル)の測定された高さが、単一ページの使用可能な高さを超える場合に、HTML レイアウトエンジンがこれを送出します。エンジンは avoid-break 制約とページ境界の両方を満たせないため、サイレントにオーバーフローするのではなく失敗します。
  • 保持するデータ。 NextPdfException を継承しますが getContext() をオーバーライドしないため、getContext() は空の配列を返します。診断データは public readonly プロパティにあります。gridRow(int)、gridCol(int)、 contentHeight(float、ポイント)、pageHeight(float、ポイント)。メッセージはセルの座標と両方の高さを示します。
  • 復旧。 問題のセルの break-inside: avoid 制約を削除するか、 セルのコンテンツを 1 ページに収まるよう減らすか、使用可能な高さがコンテンツに合うようページサイズを大きくするか、そのマージンを減らしてください。
  • 送出される条件。 retained モードのレイアウトプリミティブが、アーキテクチャ決定記録 ADR-020 で定義された 4 つのリソース予算ティアの 1 つが破られ、呼び出し側がソフトフォールバックではなくハードフェイルにオプトインした場合にこれを送出します。デフォルトパスは送出しません。ContainerLayout::acceptChild()false を返し、呼び出し側はブロックレイアウトにフォールバックし、警告が発行されます。この例外は、構成時の検証と、正確な破り方のタプルをアサートするテストのために留保されています。ティアは per-child(捕捉された子のストリームがその上限を超える)、per-container(Tier 1 のノード数予算)、per-document(レイアウトパスまたはネスト深度の予算)、 そして global(SDK 全体の 256 MB のピーク常駐セットサイズの上限)です。
  • 保持するデータ。 getContext() をオーバーライドし、アプリケーションパフォーマンスモニタリング(APM)ツールが消費する、安定した 8 キーの形を返します。budgetTierexceededValuebudgetLimitcontainerTypephasebreachOrigincaptureSizeprocessedItemCount。最初の 4 つのキーは元の v1.0.0 のサブセットであり、常に設定されます。後の 4 つは、コンストラクターがそれらなしで呼び出された場合、null または 0 がデフォルトになります。 getCausalWarningCode() は、(ティア, コンテナータイプ)のタプルを、ソフトフォールバックパスが発行したであろう WarningCode にマッピングします。
  • 復旧。 構成の破りについては、要求された値を文書化された包絡内に戻してください(例: retained ノード予算は Config::withRetainedNodeBudget() を通じて 5,000 から 100,000 を受け付けます)。コンテンツの破りについては、 コンテナーのネストまたはノード数を減らすか、ハードフェイルのサーフェスにオプトインするのではなく、デフォルトのソフトフォールバックのブロックレイアウトに頼ってください。
  • 送出される条件。 ドキュメントが名前付きの @page <ident> { … } ルール(page: <ident> プロパティを通じてコンテンツにバインドされる)を宣言した場合に、ページドメディアステージがこれをフェイルクローズで送出します。CSS Paged Media Level 3 §3.4 および Level 4 §3.2 の名前付きページ(:first:left:right:blank 疑似クラス、および名前付きの size:rotate: のオーバーライドを含む)はパースされますが、それを消費する本番のレイアウトパスは存在しません。ルールを破棄することで生じる、サイレントに不正確なデフォルトのページネーションを出力するのではなく、エンジンは拒否します。
  • 保持するデータ。 getContext() をオーバーライドし、page_names (失敗を引き起こした個別の ident のリスト、ソース順)、 has_size_override(bool)、has_rotate_override(bool)、 has_pseudo_classes(bool)を返します。同じ値は、 pageNameshasSizeOverridehasRotateOverridehasPseudoClasses public プロパティで公開されます。
  • 復旧。 名前付きの @page <ident> ルールと任意の page: <ident> バインディングを削除し、サポートされている無名の @page { … } ルールとその疑似クラス形式を通じて意図したジオメトリを表現してください。あるいは、完全な名前付きページレイアウトのサポートを実装する将来のリリースにピン留めしてください。
  • 送出される条件。 テキストのセグメンテーションが International Components for Unicode(ICU)の行分割イテレーターを必要とするものの、require-ICU ポリシーが有効(NEXTPDF_REQUIRE_ICU=1)で、ext-intl 拡張モジュールと IntlBreakIterator が利用できない場合に、これを送出します。
  • 保持するデータ。 RuntimeException を直接継承するため、コンテキスト対応ではなく getContext() を持ちません。同じコードパスが以前に送出していた汎用例外の厳密な絞り込みであるため、既存の catch (\RuntimeException) ハンドラーは引き続き機能します。
  • 復旧。 ICU の break イテレーターが利用可能になるよう ext-intl をインストールして有効化するか、 require-ICU ポリシーが必須でない場所で非 ICU のセグメンターにフォールバックするには、NEXTPDF_REQUIRE_ICU を解除してください。
  • 送出される条件。 これはスクリプトシェイピングのサービスプロバイダーインターフェイス(SPI)の基底例外です。今日は直接送出されません。代わりに具象サブタイプが送出されます。あらゆるシェイピングの失敗を 1 か所で処理するにはこの型を捕捉してください。
  • 保持するデータ。 RuntimeException を直接継承します。コンテキスト対応ではなく、 getContext() を持ちません。
  • 復旧。 具象サブタイプで分岐してください。現在のリリースで同梱される唯一のサブタイプについては、以下の NotYetImplementedException を参照してください。
  • 送出される条件。 すべてのプレースホルダーのスクリプトシェイパーが、具体的なシェイピングが延期されているスクリプト(モンゴル文字とチベット文字)について、その shape() 本体からこれを送出します。シェイピング SPI の継ぎ目はアーキテクチャ的には準備が整っていますが、実際のシェイピングはネイティブスピーカーが検証したフィクスチャを待っています。サイレントな no-op ではなく例外を送出することで、タグ付きアクセシビリティを謳う PDF にシェイピングされていないテキストを出力するのではなく、誤った本番配線を実行時に表面化させます。
  • 保持するデータ。 ScriptShaperException(したがって RuntimeException)を継承するため、コンテキスト対応ではなく getContext() を持ちません。 診断データはその public readonly プロパティにあります。bcp47LanguageTag (run の BCP-47 タグ、例: mn-Mong または bo-Tibt)と missingCapability(実装が欠いている具体的な能力)です。 メッセージは両方を含みます。
  • 復旧。 本番環境で、未実装のスクリプトの run をシェイパーに通さないでください。言語タグを上流で検出し、 別のレンダリングパスにフォールバックするか、該当するスクリプトのシェイピングを実装する将来のリリースにピン留めしてください。
  • 送出される条件。 ドキュメントが PDF 1.4 出力プロファイル(ISO 19005-1:2005 / PDF/A-1)の下で禁止されている機能を含む場合に、ライターがこれを送出します。これは、後の PDF バージョンで導入された構成要素を禁止します。
  • 保持するデータ。 NextPdfException を継承しますが getContext() をオーバーライドしないため、getContext() は空の配列を返します。診断データはその public readonly プロパティにあります。feature(拒否された機能名)、 reason(なぜ禁止されているか)、isoClause(ISO 条項参照)。 メッセージは 3 つすべてを組み合わせます。
  • 復旧。 拒否された機能を削除するか PDF 1.4 互換の同等品に置き換えるか、その機能を許可するより高い出力プロファイルをターゲットにしてください。
  • 送出される条件。 ドキュメントが strict な PDF 2.0 出力プロファイルの下で禁止されている機能を含む場合に、ライターがこれを送出します。ISO 32000-2:2020 は、 PDF 1.7 がまだ許可していた構成要素を deprecate します。最も顕著なのは Standard 14 Type 1 フォント(§9.6.2)であり、これは準拠する PDF 2.0 ドキュメントで埋め込む必要があります。
  • 保持するデータ。 Pdf14FeatureRejectedException と同じ形です。NextPdfException を継承し、getContext() をオーバーライドせず(空の配列を返す)、 featurereasonisoClausepublic readonly プロパティとして公開します。
  • 復旧。 拒否された機能を是正してください。例: base 14 フォントを埋め込む。あるいは、存在する場合は文書化された脱出口を取ってください(非埋め込みの base 14 フォントについては、Document::allowNonEmbeddedBase14())。
  • 送出される条件。 ドキュメントの encryptionModepubkey(公開鍵の受信者リスト)であるとき、ライター側の公開鍵ストリーム本体暗号化のディスパッチが配線される前に、PdfWriter::build() がエントリポイントでこれを送出します。 事前に拒否することで、呼び出し側が暗号化されていると考えていた未暗号化の PDF をサイレントに出力することを防ぎます。
  • 保持するデータ。 RuntimeException を直接継承するため、コンテキスト対応ではなく getContext() を持ちません。同じ箇所が以前に送出していた汎用例外の厳密な絞り込みであるため、既存の catch (\RuntimeException) ハンドラーは引き続き機能します。
  • 復旧。 公開鍵の受信者リストの代わりに、サポートされている暗号化モード(パスワードベースの暗号化)を使用するか、 公開鍵暗号化のサポートを実装するリリースにピン留めしてください。これが送出された場合、出力を暗号化されているものとして扱わないでください。
  • 送出される条件。 入力 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() を持ちません。UnsupportedPdfStructureReason 型(enum)の public readonly reason プロパティを公開するため、呼び出し側はメッセージをパースすることなく正確なカテゴリーで分岐できます。オプションの detail 文字列と previous の throwable が、限定された機微でないコンテキストを追加することがあります。デフォルトのメッセージは、その理由の情報を漏らさない要約です。
  • 復旧。 reason で分岐してください。EncryptedDocument の場合は、復号がリーダーの範囲外であるため、読み取り前に復号ステップを実行してください。DamagedCrossReferenceTruncatedFile、または CrossReferenceOffsetOutOfBounds の場合は、ファイルを不正または不完全として扱い、 ソースを再取得または修復してください。CyclicReferenceChainNonConformantObjectStream、または IrresolvableObjectCollision の場合は、入力が構造モデルに違反しており、そのままでは読み取れません。
  • 送出される条件。 埋め込み XMP パケットが構成済みのバイト上限を超えた場合に、ストリーミング XMP メタデータリーダーがこれを送出します。これは、エンティティ展開や二次的な膨張スタイルの入力に対する防御的なガードです(ギガバイト規模の埋め込み XMP に対する 128 MB のピーク上限)。
  • 保持するデータ。 NextPdfException を継承しますが getContext() をオーバーライドしないため、getContext() は空の配列を返します。診断データはその public readonly プロパティにあります。byteCount(観測されたバイト数) と cap(構成済みの上限、バイト単位)。メッセージは両方を報告します。
  • 復旧。 過大なメタデータを、悪意のあるものまたは不正なものとして拒否またはスキップしてください。正当なドキュメントが本当により大きなパケットを必要とする場合は、このガードが防ぐために存在するメモリ枯渇のリスクを比較衡量したうえで、構成済みの上限を意図的に引き上げてください。