コンテンツにスキップ

NextPDF Artisan の概要

NextPDF Artisan は、NextPDF 向けの Chrome ブリッジです。HTML フラグメントを Chrome DevTools Protocol 経由でヘッドレス Chrome プロセスに送信し、printToPDF の出力を取得して、その結果を Form XObject として対象ドキュメントに埋め込みます。埋め込まれたテキストは、選択可能かつ検索可能な状態で保持されます。

Artisan パッケージ(nextpdf/artisan)は、レイアウトを Chrome に委譲するレンダラーによって、オープンソースの NextPDF エンジンを拡張します。NextPDF のネイティブ HTML パイプラインは、すでに広範な CSS サブセットをカバーしています。Artisan ブリッジは、Chrome 相当のレイアウト(CSS の flexbox やグリッド、data URI から読み込まれるカスタム Web フォント、複雑なセレクター)を必要とするドキュメント向けに用意されており、ラスタライズされたスクリーンショットではなくベクターテキストを生成します。

このブリッジは、単一の目的を持つ小さなコンポーネントで構成されたパイプラインです。ChromeHtmlRenderer はレンダリングを統括します。ChromeSecurityPolicy は入力を検証し、それを厳格に制限された HTML ドキュメントでラップします。BrowserPool は Chrome プロセスのライフサイクルを管理します。ViewportCalculator は PDF のポイントを CSS ピクセルにマッピングします。NextPDF\Parser リーダーが Chrome の出力を解析し、PageImporter がそれを Form XObject に変換します。各コンポーネントは final で宣言され、コンストラクター注入され、PHPStan レベル 10 で型付けされています。

このブリッジは 外部依存に制約されます。chrome-php/chrome ライブラリ(^1.15)と、PHP プロセスから到達可能な Chrome または Chromium バイナリが必要です。どちらも同梱されていません。ライブラリが存在しない場合、ブリッジは黙って機能を低下させるのではなく、ChromeNotAvailableException をスローします。/integrations/artisan/troubleshooting/ ページの /integrations/artisan/failure-modes/ を参照してください。

入力が ChromeSecurityPolicy::validate() を通過するまで、レンダリングが Chrome に到達することはありません。また、Chrome が受け取るドキュメントは、常に厳格な Content-Security-Policy と多層防御の CDP ネットワークブロックでラップされています。このブリッジは信頼できない可能性のある HTML を処理するため、その転送と分離に関する方針は、ここで要約せず、/integrations/artisan/security-and-operations/ ページで明示的に文書化しています。

これは、出荷されたパッケージで観測された動作であり、src/Artisan/ および tests/Unit/Artisan/ スイートに対して検証されています。インタラクティブな Chrome ブラウザーとのピクセル単位の一致を主張するものではありません。アニメーションは最終フレームでキャプチャされ、レイアウトは JavaScript に依存せず、Chrome の最初のページのみがインポートされます。

HTML fragment

ChromeSecurityPolicy::validate()

ChromeSecurityPolicy::wrapHtml()

CSP + reset CSS

BrowserPool

headless Chrome

CDP: Network.setBlockedURLs '*'

Page.setDocumentContent

Chrome printToPDF

NextPDF\\Parser\\PdfReader

PageImporter → Form XObject

Embedded in target PDF

(text selectable)

Diagram
コンポーネント責務ソース
ChromeHtmlRenderer単一レンダリングの統括と ChromeRenderResult の返却src/Artisan/ChromeHtmlRenderer.php
ChromeRendererConfigイミュータブルな構成値オブジェクトsrc/Artisan/ChromeRendererConfig.php
ChromeSecurityPolicy入力検証 + 安全な HTML エンベロープsrc/Artisan/ChromeSecurityPolicy.php
BrowserPoolChrome プロセスのライフサイクルと再起動ポリシーsrc/Artisan/BrowserPool.php
ViewportCalculator72 pt/inch ↔ 96 px/inch の変換src/Artisan/ViewportCalculator.php
ChromeRenderResult型付けされたレンダリング出力(ChromeRenderResultInterfacesrc/Artisan/ChromeRenderResult.php
PageImporter解析された Chrome ページ → ImportedFormXObjectsrc/Artisan/PageImporter.php
EInvoiceServiceFactoryPremium の電子請求書コントラクト向けコンテナーレスファクトリーsrc/Artisan/EInvoiceServiceFactory.php
  • バージョンの系譜。 公開されている Composer アーティファクトには v0.1.0 のタグが付けられています。ソースの docblock には @since 1.7.0(Chrome ブリッジ)と @since 1.1.0(電子請求書ファクトリー)が記載されており、いずれもリネーム前の nextpdf/core のバージョン系列から継承されています。このパッケージは nextpdf/artisan にリネームされ、その変更は 2.0.0 の CHANGELOG エントリで行われました。Composer のタグを正規のインストールバージョンとして扱い、@since マーカーはエンジンバージョンの由来として扱ってください。
  • 最初のページのみ。 PageImporter::import() は、デフォルトでページインデックス 0 を使用します。Chrome の 2 ページ目にはみ出したコンテンツは、明示的な高さが指定されていない限りクリップされます。詳細は /integrations/artisan/production-usage/ ページで説明しています。
  • DI コンテナーなし。 Artisan はコンテナーレスです。EInvoiceServiceFactory は、サービスコンテナーを持たない環境でも一貫してインスタンス化できる手段を提供します。詳細は /integrations/artisan/boot-and-discovery/. を参照してください。

各レンダリングでは、呼び出しごとに 1 回、Chrome のページ読み込みと printToPDF のコストが発生します。BrowserPool はレンダリング間も Chrome プロセスを存続させ、メモリ増加を抑えるために 100 回のレンダリングごとに再起動します。Big-O を支配するのは、ブリッジ自体ではなく、Chrome による入力のレイアウトです。このページのリファレンスフローで計測された予算については、フロントマターの performance_budget と /integrations/artisan/production-usage/ ページを参照してください。

このブリッジは、信頼できない可能性のある HTML を Chrome 内でレンダリングします。入力は、Chrome が受け取る前にサイズとコンテンツを検証されます。ラップされたドキュメントには default-src 'none' が付与されます。CDP レベルのブロックにより、すべてのサブリソースリクエストが停止されます。Chrome のサンドボックスフラグに対する明示的な制限を含め、転送と分離の完全なモデルは /integrations/artisan/security-and-operations/ ページにあります。このセクションを完全なセキュリティ体制として扱わないでください。

オープンソースのブリッジは、HTML を PDF にレンダリングします。Premium ティアは、レンダリング済みドキュメントの上に、準拠した電子請求書の埋め込み(Pro)と検証(Enterprise)を重ねて提供します。これらのティアがインストールされていない場合、EInvoiceServiceFactorynull を返すため、オープンソース側の処理経路はそれらがなくても完全に機能し続けます。

  • /integrations/artisan/install/(インストール)
  • /integrations/artisan/configuration/(構成ガイド)
  • /integrations/artisan/quickstart/(クイックスタート)
  • /integrations/artisan/chrome-renderer-setup/(Chrome レンダラーのセットアップ)
  • /integrations/artisan/security-and-operations/(セキュリティと運用)
  • /integrations/artisan/production-usage/(本番環境での使用)