PHPでPDF帳票を作成する

はじめに

こんにちは、イメージ・マジックのもあいです。

春になり、JリーグやMotoGP等のスポーツも今シーズンが開幕、UCLや欧州サッカーも終盤を迎えて情報を追ったり観戦したりするのが大変な状態です。インターネットが発達してこんなに情報が増えようとは思いもしなかった今日この頃です。 今回はPHPでPDF帳票を作成するために必要だったことをまとめてみました。

使用するライブラリ

FPDFmPDFwkhtmltopdf という選択肢から、mPDFを使用しました。選定した理由は扱いやすさとライブラリ自身がそれなりの頻度で更新されているからです。

インストール

composerでインストールできます。
composer require mpdf/mpdf
そのほかに日本語を表示させるのであれば日本語フォントが必要になります。

使い方

htmlとcssを用意する

mPDFはhtmlとcssでPDF帳票のレイアウトを作成します。htmlなのでポジションを調整するのが難しいと思われますが、cssのposition:absoluteが条件付きで使用することができます。

ドキュメントにも記載されているのですが、body要素の直下の要素にだけposition:absoluteが適用できます。これを使うことによりレイアウトを調整できます。単位もpxでは無くてptやmmが使えますので帳票レイアウトの調整はそれほぞ難しくないです。
下記のようなコードの場合aクラスとbクラスはposition:absoluteが適用できますが、cクラスは適用できません。
<body>
  <div class="a"></div>
  <div class="b">
    <div class="c"></div>
  </div>
</body>

htmlを取得する

弊社ではSymfony4を使用して開発していますので、htmlを取得する場合はコントローラのrenderViewメソッドでtwigとデータを渡すとhtmlが取得できます。

PDFを生成する

mPDFのインスタンスを生成するときに設定情報を配列で引き渡します。この時に用紙の大きさ/向き/マージンやフォントファイルの場所やフォントにkanする方法を引き渡します。 設定情報はだいたい下記の通りです。
$config = [
    'mode' => 'ja+aCJK',
    'format' => [297, 210],
    'dpi' => 200,
    'tempDir' => '/tmp/',
    'margin_left' => 0,
    'margin_right' => 0,
    'margin_top' => 0,
    'margin_bottom' => 0,
    'orientation' => 'P',
    'fontDir' => [
        '/path/to/fontDir/,
    ],
    'fontdata' => [
        'ipag' => [
            'R' => 'ipag.ttf',
        ],
        'ipagp' => [
            'R' => 'ipagp.ttf',
        ],
    ],
];
A4縦でDPIは200、フォントにIPAゴシックとIPAゴシックプロポーショナルを指定し、fontdataの配下のipagとipagpというキーはcssのfont-familyで指定することができます。

設定情報をmPDFのインスタンスに渡してWriteHTMLメソッドを呼び出してからOutputメソッドを呼び出すとPDFを標準出力に出力します。
Symfony4で標準出力の結果をクライアントに送信する場合はStreamedResponseクラスを使用することになります。
$mpdf = new \Mpdf\Mpdf($config);
$mpdf->SetDefaultFont('ipagp');
$mpdf->WriteHTML($html);
$mpdf->Output();

最後に

htmlで帳票を作成するに際に、位置がずれると問題になる帳票を作成した際に調査した結果です。