Artisan パッケージには、相互に関連する 2 つの役割があります。Chrome で HTML をレンダリングすることと、生成された PDF ページを NextPDF ドキュメントにインポートすることです。デバッグ時は、Chrome、パーサー、インポーターの各境界を個別に扱ってください。
レンダラーの統合、長時間稼働するワーカー、パーサーの診断、または nextpdf/artisan 周辺のテスト作成に取り組む際は、このガイドを参照してください。
| レイヤー | 所有者 | 責務 | ここに置かないもの |
|---|
| アプリケーション | アプリケーション | HTML 生成の承認、レンダラー構成の選択。 | ブラウザープロセスの管理。 |
| HTML ポリシー | アプリケーションとパッケージ | レンダリング前の、安全でない HTML やサイズ超過 HTML の拒否。 | テナント承認やビジネス上の判断。 |
| Chrome レンダラー | nextpdf/artisan | HTML から、Chrome が生成する単独 PDF へのレンダリング。 | 一般的な PDF 修復や任意の PDF 編集。 |
| パーサー/インポーター | nextpdf/artisan | レンダリング済み PDF の解析、および 1 ページのフォーム XObject としてのインポート。 | 完全な PDF 適合性検証。 |
| コアエンジン | nextpdf/nextpdf | インポート済みフォームオブジェクトの配置、最終ドキュメントの書き出し。 | Chrome CDP のライフサイクル。 |
| ステージ | 動作 | 開発者のアクション |
|---|
| 構成の作成 | ChromeRendererConfig による、バイナリ、タイムアウト、CSS、入力サイズ、サンドボックス動作の定義。 | ハードコードされたランタイム推測ではなく、環境固有の構成の使用。 |
| レンダラーの作成 | ChromeHtmlRenderer による BrowserPool の所有。 | ワーカー内でのレンダラー再利用、シャットダウン時のクローズ。 |
| HTML の検証 | セキュリティポリシーによるサイズチェックと、デフォルト CSS でのドキュメントのラップ。 | このステージ前の、呼び出し元の承認検証。 |
| Chrome での印刷 | CDP による単独 PDF のレンダリング。 | レビュー済みのポリシーで許可されない限り、外部リソースのブロック維持。 |
| PDF の解析 | PdfReader::parse() による、xref データ、ページ、オブジェクト、リソース、リビジョンの読み取り。 | 診断目的でない限り、パーサー失敗のレンダリング失敗としての扱い。 |
| ページのインポート | PageImporter::import() による、ページのコンテンツ、メディアボックス、リソース、埋め込みオブジェクトの抽出。 | ワークフローが意図的に別のページを選択する場合を除く、ページ 0 のインポート。 |
| パス | 目的 |
|---|
app/Pdf/Renderers/* | アプリケーション側ラッパーによる ChromeHtmlRenderer のラップ。 |
app/Pdf/Templates/* | HTML テンプレートのレンダリング、DTO からビューへのマッピング。 |
app/Pdf/Policies/* | HTML サイズ、リソース、テナントのレンダリングポリシー。 |
tests/Pdf/Renderer/* | 小さな HTML フィクスチャを使ったレンダラーのスモークテスト。 |
tests/Pdf/Parser/* | インポートされた Chrome 出力用のパーサーフィクスチャ。 |
テンプレートのレンダリングは、ブラウザーのレンダリングとは切り離してください。レンダラーには、最終的な HTML と既知のページ幅を渡す必要があります。
use NextPDF\Artisan\ChromeHtmlRenderer;
use NextPDF\Artisan\ChromeRendererConfig;
use NextPDF\Artisan\PageImporter;
use NextPDF\Parser\PdfReader;
$renderer = new ChromeHtmlRenderer(new ChromeRendererConfig(
$result = $renderer->render($html, widthPt: 595.28);
$reader = new PdfReader($result->getPdfData());
$form = (new PageImporter())->import($reader);
ワーカープロセスごと、またはリクエストスコープごとに、レンダラーを 1 つ作成してください。レンダラーを再利用すると、Chrome 起動コストの繰り返しを避けられます。明示的にクローズすれば、ワーカーのシャットダウン時にプロセスがリークするのを防げます。
final class InvoiceChromeRenderer
public function __construct(
private readonly ChromeHtmlRenderer $renderer,
public function renderInvoice(string $html): string
->render($html, widthPt: 595.28)
public function close(): void
$this->renderer->close();
パーサー API は、Chrome 出力のインポートが失敗した場合に役立ちます。診断は読み取り専用にとどめ、インポートが成功した後はパーサーの状態を変更しないでください。
| 診断の問い | 使用する API | 期待されるシグナル |
|---|
| ファイルの解析可否。 | PdfReader::parse() | 無効な PDF 構造の場合の例外。 |
ページ 0 の存在有無。 | PdfReader::getPage(0) | 返り値としての PdfObject。 |
| コンテンツの有無。 | PdfReader::getPageContentStream($page) | 空でないコンテンツストリーム。 |
| リソースの存在有無。 | PdfReader::getPageResources($page) | リソース辞書の配列。 |
| 増分リビジョンの有無。 | PdfReader::getRevisionCount() | 1 より大きいカウント。 |
| 失敗したオブジェクトの特定。 | PdfTokenizer::getOffset() とパーサー例外のコンテキスト。 | フィクスチャ縮小用のバイトオフセット。 |
| 拡張ポイント | 用途 | 制約 |
|---|
ChromeRendererConfig::fromArray() | フレームワーク構成のマッピング。 | 不明な値や型が誤ったオプション値の、デフォルトへのフォールバック。 |
HtmlSecurityPolicyInterface | 解析レイヤーの HTML ポリシー。 | トランスポート、プロセス、承認の制御の代替ではないこと。 |
LoggerInterface | レンダリングとブラウザーの診断。 | デフォルトでは HTML コンテンツをログに記録しないこと。 |
BrowserPool | 長時間稼働する Chrome プロセスの再利用。 | ワーカーのシャットダウン時のクローズ必須。 |
PageImporter | 解析済み外部ページの埋め込み。 | 事前のリーダー解析が必要。 |
| パーサークラス | 診断、およびインポートされた Chrome 出力。 | 一般的な PDF 修復ツールキットではないこと。 |
- HTML フラグメントを、最小限のレンダリングテストとして再現します。
- 次の項目を検証します。
maxHtmlSize、デフォルト CSS、Chrome バイナリのパス。
- ポイント単位の固定幅でレンダリングします。
- 返された PDF バイトを
PdfReader::parse() で解析します。
- ワークフローが意図的に別のページを選択する場合を除き、ページ
0 をインポートします。
- 各失敗を再現できる最小の HTML に対して、フィクスチャテストを追加します。
- ワーカーのシャットダウンフックでレンダラーをクローズします。
| 失敗 | 処理すべき場所 | 推奨される対応 |
|---|
| Chrome バイナリが見つからない | デプロイ時チェックと、レンダラーの構築パス。 | レンダリングトラフィック受け入れ前の readiness 失敗。 |
| サイズ超過の HTML | HTML ポリシー。 | Chrome 起動前の拒否。 |
| ブラウザーのタイムアウト | レンダラーの境界。 | レンダリングの失敗化、およびテンプレート名、サイズ、幅、タイムアウトの記録。 |
| パーサーの失敗 | インポートの境界。 | ポリシーで許可される場合の、デバッグ用の小さなサニタイズ済みフィクスチャの保存。 |
| ブラウザープロセスのリーク | ワーカーのライフサイクル。 | シャットダウン時のクローズ、および制御されたレンダリング回数後の再起動。 |
| 関心事 | デフォルト | オーバーライドするタイミング |
|---|
| レンダリングのタイムアウト | 30 秒。 | 計測済みで範囲が限定されたドキュメントの場合のみ増加。 |
| HTML の最大サイズ | 5,000,000 バイト。 | パブリックエンドポイントでの低減。 |
| サンドボックス | 有効。 | コンテナーの制約上必要であり、かつホストが分離されている場合にのみ無効化。 |
| 高さ | 自動化条件は heightPt <= 0。 | 厳密なレイアウト契約での固定高さの使用。 |
| 外部リソース | レンダラーポリシーによるブロック。 | レビュー済みリソースポリシー経由でのみ許可。 |
- レンダリングテストでは、代表的な HTML と CSS をカバーします。
- セキュリティテストでは、サイズ超過の HTML と、ブロックされたリソースへのアクセス試行をカバーします。
- インポートテストでは、返されたフォームオブジェクトにコンテンツ、メディアボックス、リソースがあることをアサートします。
- パーサーテストでは、xref テーブル、xref ストリーム、オブジェクトストリーム、不正な形式のフィクスチャのケースをカバーします。
- ワーカーテストでは
close() を呼び出し、ブラウザープロセスが残っていないことを検証します。
- パフォーマンステストでは、テンプレートおよびコンテンツサイズごとのレンダリング時間を記録します。