コンテンツにスキップ

mPDF から NextPDF への移行

このガイドでは、mPDF ベースのコードベースを NextPDF コアへ移行する方法を説明します。mPDF の中心的な操作は WriteHTML() であり、これは Document::writeHtml() に直接対応します。主な作業は、コンストラクター設定配列の対応付け(mPDF は new Mpdf([...]) に渡す 1 つの連想配列ですべてを設定します)と、フォント処理の差分への対応です。NextPDF と mPDF は独立したエンジンであるため、移行後のドキュメントは mPDF の出力と 互換性があります が、バイト単位では同一になりません。このガイドでは、操作の対応付け、設定配列の対応付け、フォントの差分、CSS サポートの差分、挙動の違い、そして安全な移行手順を扱います。

この CSS サポートマトリクス が、検証済みの HTML/CSS 機能を示す唯一の根拠です。このガイドは挙動を説明するものであり、mPDF との視覚的な同等性を主張するものではありません。

Terminal window
composer require nextpdf/core:^3

移行期間中は mpdf/mpdf をインストールしたままにしておきます。最終的な切り替え後に削除してください(安全な移行手順を参照)。

mPDF の Mpdf オブジェクトは、1 つの大きなファサードです。コンストラクター配列で設定し、WriteHTML() とページ処理の操作(AddPageSetHTMLHeaderSetHTMLFooter)で動作させます。NextPDF は設定を不変の NextPDF\Core\Config 値オブジェクトへ分離し、コンテンツは Document::writeHtml() で扱います。コンストラクターの「モード」文字列はありません。NextPDF は渡された HTML を解析し、その後 save()output()、または getPdfData() でドキュメントを出力します。

フォント: mPDF はフォントディレクトリに加えて、fontdata マップと「コアフォント」のフォールバックセットを同梱します。NextPDF は、単一のフォントディレクトリと CSS の font-family マッチングを通じてフォントを解決(resolve)し、埋め込みフォントを 常に サブセット化します(ISO 32000-2 §9、iso32000_2_sec9#x1.x45.p7)。フォントの matching/fallback はエンジン固有であるため(CSS Fonts 4 §5.5、css_fonts_4#x1.x5.x5.x1.p13)、グリフの置換が異なる場合があります。これが主な可視差分であり、フォント処理の差分で扱います。

NextPDF の HTML API については、Html モジュールのリファレンスを参照してください。中心となるエントリーポイントは、Document::createStandalone()Document::writeHtml(string $html): staticDocument::writeHtmlCell(...)Document::addPage()Document::output(?string, OutputDestination)Document::save(string $path): voidDocument::getPdfData(): string、そして NextPDF\Core\Config 値オブジェクトです。

以下の mPDF の公開メソッド名は、上流の公開リポジトリ(mpdf/mpdfdevelopment)に対して確認済みです。リポジトリ内の _source-sidecar-upstream-api.md 来歴サイドカーを参照してください。上流のドキュメント本文は複製していません。

mPDFNextPDF備考
new Mpdf([...])Document::createStandalone($config)mPDF の設定配列は NextPDF\Core\Config に対応付けられます。設定の対応付けを参照してください。長時間稼働するワーカーでは DocumentFactory を使用してください。
$mpdf->WriteHTML($html)$doc->writeHtml($html)直接対応。mPDF の 2 番目の $mode 引数(完全なドキュメント/CSS のみ/要素)には NextPDF に相当するものがありません。完全な HTML を渡してください。
$mpdf->WriteFixedPosHTML(...)$doc->writeHtmlCell(...)位置・サイズを指定した HTML 領域。x/y/width/height の引数を対応付けます。
$mpdf->AddPage(...)$doc->addPage()mPDF の呼び出しごとの orientation/format/余白オーバーライドは、NextPDF では引数ではありません。代わりに、呼び出しの間でドキュメントモデルを変更してください。
$mpdf->SetHTMLHeader($html) / SetHTMLFooter($html)Layout API による header/footermPDF の running HTML ヘッダーは、本文先頭のインライン HTML ではなく、NextPDF の header/footer メカニズムに対応付けられます。
$mpdf->Output($name, $dest)$doc->output($name, OutputDestination::…)mPDF の出力先文字(I/D/F/S)は、OutputDestination 列挙型(Inline/Download、file は save() 経由、string は getPdfData() 経由)に対応付けられます。
$mpdf->Output('','S')$doc->getPdfData()バイト列を返します。
$mpdf->Output($path,'F')$doc->save($path)ファイルパスに書き込みます。
$mpdf->SetTitle($t)$doc->setTitle($t)ISO 32000-2 §14 の情報辞書 / XMP に格納されます(iso32000_2_sec14#x1.x5.p5)。
$mpdf->SetProtection($perms,...)$doc->setEncryption(...)(セキュリティ API)権限はアクセス制御ではなく、リーダーの協力に依存します。セキュリティに関する注意事項を参照してください。
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
// mPDF:
// $mpdf = new \Mpdf\Mpdf();
// $mpdf->WriteHTML('<h1>Invoice</h1>');
// $mpdf->Output('out.pdf', \Mpdf\Output\Destination::FILE);
// NextPDF — default page is A4 portrait:
$doc = Document::createStandalone();
$doc->setTitle('Invoice');
$doc->addPage();
$doc->writeHtml('<h1>Invoice</h1>');
$doc->save(__DIR__ . '/out.pdf');
echo "Wrote out.pdf\n";

これは、このガイドのフォント処理の概念を裏付ける実行可能なサンプルである examples/04-text-and-fonts.php と整合しています。明示的なページサイズ、余白、そしてフォント選択を行う本文コンテンツを使用しています。

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Contracts\OutputDestination;
use NextPDF\Core\Config;
use NextPDF\Core\Document;
use NextPDF\ValueObjects\Margin;
use NextPDF\ValueObjects\PageSize;
// Equivalent of: new Mpdf(['format'=>'A4','margin_left'=>20, ...]).
// Margin constructor order is (top, right, bottom, left) — NOT L,R,T,B.
$config = new Config(
pageSize: new PageSize(595.276, 841.890, 'A4'),
margins: new Margin(16.0, 20.0, 16.0, 20.0), // top,right,bottom,left in points
fontsDirectory: __DIR__ . '/fonts',
);
$doc = Document::createStandalone($config);
$doc->setTitle('Quarterly Report');
$doc->addPage();
$html = <<<'HTML'
<h1 style="font-family:'DejaVu Sans';color:#1E3A8A;">Quarterly Report</h1>
<p>Body text resolves through CSS font-family matching against the configured
fonts directory. mPDF's fontdata map has no direct analogue — register the
family via CSS and the fonts directory instead.</p>
HTML;
$doc->writeHtml($html);
// Equivalent of $mpdf->Output('report.pdf', Destination::DOWNLOAD):
$doc->output('report.pdf', OutputDestination::Download);
  • $mode 引数(WriteHTML の引数)。 mPDF の WriteHTML($html, $mode)(2 = CSS のみ、1 = 要素)には相当するものがありません。渡す HTML に CSS をインライン化してください。「CSS を書いてから本文を書く」という手順はありません。
  • AddPage ごとのオーバーライド。 mPDF では、AddPage() の引数を介してドキュメントの途中で format/orientation を変更できます。NextPDF の addPage() はそのような引数を取りません。サイズの変更はページ呼び出しではなく、ドキュメントを通じて行います。
  • ヘッダー/フッターの HTML。 mPDF の running ヘッダーは、別途登録される HTML フラグメントです。本文に貼り付けないでください。NextPDF の header/footer メカニズムに対応付けます。
  • フォント名。 mPDF はフォント名を fontdata/core-font テーブルを通じて正規化します。NextPDF は CSS の font-family をフォントディレクトリと照合します。暗黙的に解決されていた mPDF のエイリアスには、明示的な @font-face/family 宣言が必要になる場合があります。
  • 出力先文字。 'I'/'D'/'F'/'S' は受け付けられません。OutputDestination 列挙型、または save()/getPdfData() を使用してください。

writeHtml() はシングルパスです(ADR-001)。ピークメモリは保持された DOM ではなく、ドキュメントサイズに比例します。このガイドのサンプルの予算: wall_ms: 2000, peak_mb: 128。長いドキュメントでは、1 つの巨大な文字列ではなく addPage() でコンテンツをページ分割してください。これは mPDF の $mode によるチャンク分割にも当てはまる助言ですが、NextPDF ではページモデルを通じて表現されます。

  • 権限はリーダーの協力に依存します。 SetProtection()setEncryption() は機密性を提供しますが、アクセス制御は提供しません。ISO の権限ビットは、協力するリーダーに依存します。暗号化をアクセス制御としてユーザーに提示しないでください。
  • メタデータ。 SetTitle() とドキュメント情報は、ISO 32000-2 §14 の情報辞書 / XMP に格納されます(iso32000_2_sec14#x1.x5.p5)。そこに秘密情報を保存しないでください。
  • NextPDF はドキュメント内のスクリプトを実行しません。ここでスクリプトを有効にする mPDF のディレクティブはありません。
記述仕様条項リファレンス ID
フォントは embedded/subset フォントプログラムとして書き込まれます。ISO 32000-2§9
ページの format/margins は、ページ境界ボックスに対応付けられます。ISO 32000-2§7
タイトル / 保護メタデータは、情報辞書 / XMP に格納されます。ISO 32000-2§14
フォントのマッチング / フォールバックはエンジン固有です。CSS Fonts 4 の仕様§5.5

NextPDF は ISO 32000-2 コンテンツを生成します。mPDF との視覚的な同一性は主張しません。レンダラーを変更する場合は、出力の再レビューが必要です。

該当しません。コアは、ここで説明する mPDF の移行パスをカバーします。


サーバーサイドの HTML→PDF のために mpdf/mpdf を運用しているチームが対象です。使用しているサーフェスが new Mpdf([...]) + WriteHTML + Output(および任意の header/footer)であれば、動詞の対応付け設定の対応付けが対応範囲をカバーします。

スコープ内: Mpdf コンストラクター設定配列、WriteHTML/Output/AddPage、headers/footers、フォント、保護、メタデータ。スコープ外: mPDF の内部クラス、および QR/バーコード/透かしのヘルパーサーフェス(それらは対応する NextPDF モジュール(Barcode、Graphics)に対応付けてください。ここでは扱いません)。

挙動の互換性であり、ドロップインのシムではありませんMpdf クラスのシムはありません。すべての呼び出し箇所を書き換える必要があります。CSS 機能の期待値は、CSS サポートマトリクスの検証済み行です。

mPDF の設定キーは、上流の公開リポジトリ(mpdf/mpdfdevelopment)に対して確認済みです。上流のドキュメント本文は複製していません。

mPDF 設定キーNextPDF備考
mode(相当なし)mPDF のモード文字列('utf-8''c''+aCJK'、…)は font/script の挙動を選択します。NextPDF は常に Unicode です。CJK はモードではなく、フォント選択で処理されます。このキーは削除してください。
formatConfig->pageSizePageSize VO)名前付きフォーマットは明示的なポイント寸法になります。配列 [w,h]PageSize に対応付けられます。
orientation入れ替え: PageSize の width/height方向フラグはありません。横向き = 幅 > 高さ。
default_font_sizeCSS の基本 font-sizeコンストラクターキーではなく、基本スタイルシートで設定します。
default_fontCSS の font-family / 登録済みフォントデフォルトのファミリーは CSS / フォント登録を介して設定します。
margin_left / margin_right / margin_top / margin_bottomConfig->marginsMargin VO、単位はポイント)1 つの Margin 値オブジェクトです。そのコンストラクターの順序は、mPDF のキー順ではなく Margin(top, right, bottom, left) です(src/ValueObjects/Margin.php で確認してください)。
margin_header / margin_footerLayout API による header/footer オフセットコンストラクターキーではなく、NextPDF の header/footer 設定に対応付けます。
  • 単一のフォントディレクトリ。 mPDF のフォントディレクトリのリスト + fontdata マップ + コアフォントのフォールバックは、Config->fontsDirectory と CSS の font-family マッチングに集約(aggregate)されます。
  • 常にサブセット化。 NextPDF は埋め込みフォントを常にサブセット化します(ISO 32000-2 §9、iso32000_2_sec9#x1.x45.p7)。mPDF のサブセットフラグには相当するものがなく、必要ありません。
  • マッチングはエンジン固有。 フォントの matching/fallback はエンジンによって異なります(CSS Fonts 4 §5.5、css_fonts_4#x1.x5.x5.x1.p13)。mPDF のフォントエイリアスには、明示的な @font-face または正確なファミリー名が必要になる場合があります。移行後にグリフのレンダリングを再ベースライン化してください。置換の違いは欠陥ではなく、想定される動作です。
  • フォントの置換(上記参照) — 主な目に見える差分。
  • $modeWriteHTML にない — インライン CSS を含む完全な HTML を渡してください。
  • AddPage ごとのフォーマットオーバーライドがない — サイズの変更はドキュメントを通じて行います。
  • 権限はリーダーの協力に依存するセキュリティに関する注意事項を参照)。
  • 独立したレイアウトエンジン — 行の折り返し / ページネーションは、内容が密なドキュメントで異なります。視覚的な差分を再ベースライン化してください。

これらは文書化された挙動の違いであり、いずれのエンジンの欠陥でもありません。

  • mode コンストラクター文字列 — モデル化されていません(常に Unicode)。
  • 呼び出しごとの AddPage() の format/orientation/margin 引数 — NextPDF では引数ではありません。
  • mPDF の fontdata マップ — フォントディレクトリ + CSS マッチングに置き換えられます。
  • mPDF の 'I'/'D'/'F'/'S' 出力先文字 — OutputDestination 列挙型 + save()/getPdfData() に置き換えられます。
  1. 追加: nextpdf/corempdf/mpdf と並行して追加します(当面は mPDF を維持)。
  2. リスクの低いドキュメントを 1 つ選びます。 new Mpdf([...])設定の対応付けを介して変換し、WriteHTML/Output動詞の対応付けを介して変換します。
  3. ドキュメントが使用するフォントを Config->fontsDirectory に登録し、mPDF のエイリアスには明示的な @font-face/family 宣言を追加します。
  4. 同じ入力に対して両方の PDF を生成し、視覚的に差分を取ります。差分(フォントの置換、行の折り返し)は独立したエンジンでは想定されるものです。ドキュメントごとに許容してください。
  5. header/footer の HTML を NextPDF の header/footer メカニズムに対応付けます。
  6. リスクの低いものから順に、ドキュメントごとに繰り返します。最後の切り替えまで mPDF をインストールしたままにしておきます。
  7. 最終的な切り替え後に、mpdf/mpdfcomposer.json から削除します。
  • コードを変更する前に、代表的なドキュメントの mPDF 出力をスナップショットします(ゴールデン入力。バイト列は異なります)。
  • 移行したドキュメントごとに、独自の受け入れチェック(視覚的な差分 + テキスト抽出)で検証してください。NextPDF のフォント/HTML の挙動は、examples/04-text-and-fonts.phpexamples/08-html-basic.php、およびコアの tests/ Html/Font スイートで検証されています。移行の受け入れはドキュメント固有であり、利用側の責任です。
  • 移行したドキュメントごとに回帰テストを追加します。

このページ上の NextPDF の挙動に関するすべての記述は、リポジトリ内のテスト、サンプル、ソースのシグネチャ、または ADR によって裏付けられています。あるいは、それが PDF フォーマットのプロパティである場合は、RAG でピン留めされた ISO 32000-2 / CSS の条項(フロントマターの citations:準拠表にあるもの)によって裏付けられています。mPDF の挙動は「独立したエンジン — 文書化された違いを想定」としてのみ主張されており、リポジトリ内の成果物が証明しない同等性は主張していません。

NextPDF の挙動に関する主張リポジトリ内のエビデンス(パス)
WriteHTML()Document::writeHtml(string $html): static に直接対応します。src/Core/Concerns/HasTextOutput.phpwriteHtml())。examples/08-html-basic.php
WriteFixedPosHTML(...)writeHtmlCell(...) に対応付けられます。src/Core/Concerns/HasTextOutput.phpwriteHtmlCell())。
createStandalone() のデフォルトページは A4 縦向き(595.276 × 841.890 pt)です。src/Core/Config.php(デフォルトの PageSize)。tests/Unit/Core/DocumentCreateStandaloneAndConfigWithersEdgeCaseTest.php
Margin のコンストラクターの順序は (top, right, bottom, left) です。src/ValueObjects/Margin.php(昇格プロパティの順序)。
出力先は NextPDF\Contracts\OutputDestination 列挙型です。'I'/'D'/'F'/'S' は受け付けられません。src/Contracts/OutputDestination.php(ケース Inline/Download/File/String)。tests/Unit/Core/Concerns/DocumentOutputDestinationDispatchTest.php
Output('','S')getPdfData()Output($path,'F')save($path)src/Core/Concerns/HasOutput.phpgetPdfData()save()output())。
SetProtection()setEncryption(...) に対応付けられます。権限はリーダーの協力に依存します。src/Core/Concerns/HasSecurity.phpsetEncryption())。ISO 32000-2 §14(フロントマターの citations:)。
SetTitle()setTitle()。メタデータは情報辞書 / XMP に格納されます。src/Core/Concerns/HasMetadata.phpsetTitle())。tests/Unit/Core/Concerns/DocumentInfoMetadataSetterBaselineTest.php。ISO 32000-2 §14(フロントマターの citations:)。
フォントは常にサブセットプログラムとして埋め込まれます。tests/Unit/Core/Concerns/DocumentTextOutputFontSubsettingAndBorderEdgeCaseTest.phpexamples/04-text-and-fonts.php。ISO 32000-2 §9(フロントマターの citations:)。
フォントのマッチング / フォールバックはエンジン固有です(置換の差分)。CSS Fonts 4 §5.5(フロントマターの citations: + 準拠)。
writeHtml() はシングルパスです。ピークメモリはドキュメントサイズに比例します。docs/architecture/adr/ADR-001-stream-based-rendering-pipeline.md

両方のパッケージは最終的な切り替えまでインストールされたままになるため、呼び出し箇所ごとのロールバックは、その呼び出し箇所を mPDF のパスに戻すことです。最終的な切り替え後のロールバックは、mpdf/mpdf とそれ以前のコードをバージョン管理から復元することです。データの移行は伴いません。

詳しくは パフォーマンスを参照してください。シングルパスモデルにより、mPDF の保持バッファのコストがなくなります。ドキュメントごとの新しいコストは積極的なフォント解決(手順 3)であり、これはフォントディレクトリを介してキャッシュ可能です。

  • mode キーを残し、それによる CJK の挙動を期待すること(このキーは削除されます。CJK はフォント選択です)。
  • WriteHTML($html, 2)(CSS のみのモード)を渡すこと。代わりに CSS をインライン化してください。
  • header/footer の HTML を本文に貼り付けること。
  • 明示的なファミリーなしで、mPDF のエイリアスに同じフォントを期待すること。
  • byte/pixel-identical な出力を期待すること(独立したエンジン — このガイドはドロップインや 100% の互換性を一切主張しません)。
  • CSS サポートマトリクスを参考情報として扱うこと — これは検証済み機能の唯一の根拠です。