PAGE TOP


HTMLをPDFで出力できるPHPライブラリ mpdf

2016年12月23日Wordpress, PHP

HTMLをPDFで出力する際に、便利なのが、mpdfライブラリです。使い方自体は、mpdfライブラリを読み込み、表示したい内容を関数の中に投げるだけなので、非常に簡単にPDF出力が実現できます。今回は、特に、Wordpressの実装でPDF出力が必要になったので、利用してみました。実装したいものは、Wordpressのカスタム投稿より、投稿された記事がPDFで出力することです。具体的には、管理者が、見積書や納品所などの書類を投稿時に拡張したカスタムフィールドで指定したユーザーに表示するような機能をつけることです。

まずは、ライブラリを読み込み、任意箇所に設置し、それを出力側のファイルで読み込みます。そして、関数の引数に、表示したい、情報を設置し、出力関数を設置することでPDFで出力できるページを生成します。

まずは、ライブラリのダウンロードです。こちらは、mPDFを配布しているこちらのサイトより、新しいものをダウンロードします。

mpdf

新しいバージョンのmPDF version 6.0 (.zip file 52MB)をダウンロードして解凍し、任意の箇所に設置します。今回はWordpressのカスタム投稿のシングルページに実装したので、テンプレートフォルダにライブラリ置き場用の libを設置して、そのなかに、ダウンロードしたフォルダをまるごと入れることにしました。コードは下記のようになります。

single-example.php (カスタム投稿のシングルページ)

<?php
require_once(__DIR__ . '/lib/mpdf60/mpdf.php');
$mpdf=new mPDF('ja', 'A4');
?>


<?php while ( have_posts() ) : the_post();?>

<?php
$title = '<h2>'. get_the_title() .'</h2>'  ;
$content = apply_filters('the_content',get_the_content());

$mpdf->WriteHTML('<div style="white-space: pre-wrap;">');
$mpdf->WriteHTML($title);
$mpdf->WriteHTML($content);

$mpdf->WriteHTML('</div>');
?>
<?php $mpdf->Output(); ?>
<?php endwhile;?>

はじめは、$content = get_the_content();と普通によみこんでいたのですが、この場合は、出力時に改行などのタグ情報が反映されないので下記のようにフィルターを実行して、正常どおりに呼び出しました。

$content = apply_filters('the_content',get_the_content());

また、PDFで出力した文字が日本語に対応していないため、変更する必要があります。
デフォルトでは、cjkフォントの部分が日本語に適してないフォントの設定になっており、
ダウンロードした、ライブラリのmpdf60/ttfonts/に使用するフォントファイルをアップロードして、その後に、設定ファイルのconfig_fonts.phpの該当箇所を変更します。詳細は<a href="https://mpdf browse around this website.github.io/fonts-languages/fonts-in-mpdf-6-x.html”>mPDFマニュアル(英語)にもあります。

デフォルトでは、下記の3つのファイルが設定されていますが、日本語に表記に不要なものもあるので、いならなものは消して、必要なものだけ読み込みでOKです。

/* CJK fonts 変更前*/
    "sun-exta" => array(
        'R' => "Sun-ExtA.ttf",
        'sip-ext' => 'sun-extb',        /* SIP=Plane2 Unicode (extension B) */
        ),
    "sun-extb" => array(
        'R' => "Sun-ExtB.ttf",
        ),
    "unbatang" => array(    /* Korean */
        'R' => "UnBatang_0613.ttf",
        ),

);

例えば、xxxxxxx.ttfにしたい場合は、

/* CJK fonts 変更後*/
    "sun-exta" => array(
        'R' => "xxxxxxx.ttf",
        ),
);