こんにちはWEBの佐野です。
今回はPHPでPDFを出力する方法について調べる機会があったの共有したいと思います。
使用したのはdompdfと言うライブラリになります。
dompdfを試すにあたって下記のポイントで躓く人もいるかと思ったので今回は備忘録も兼ねて対応方法についてまとめています。
・画像出力
PDF出力のライブラリは他にもありますが、dompdfはHTMLの書式をPDFにしてくれるものでコーディングの知識があれば自由度が高く、楽にレイアウトが作れるので便利です。
もしPDF出力を検討されている方がいれば候補として試してみてはいかがでしょうか。
もくじ
dompdfの導入
インストール方法について、ここでは手動インストールの手順になります。
下記のページからファイル一式(ZIP)をダウンロードしましょう。
今回試したのはDompdf 1.2.2になります。
ZIPをダウンロードできたら解凍して作業フォルダに配置してください。
ここでは下記の構成でlibフォルダにdompdfの名前で配置しました。
└index.php
└/lib/dompdf/ ← ここに解凍後のファイル一式をコピーしています
└/img/
PDFを出力
必要ファイルを配置できたら、さっそくPDFを出力してみましょう。
下記のソースをindex.phpに記述して、ブラウザでアクセスしてみてください。
<?php
// dompdfの読み込み
require_once("./lib/dompdf/autoload.inc.php");
use Dompdf\Dompdf;
// PDFにする内容をHTMLで記述
$html = <<< EOM
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<div>this is dompdf sample!</div>
<div>これはPDFのサンプルです!</div>
</body>
</html>
EOM;
// PDFの設定~出力
$dompdf = new Dompdf();
$dompdf->loadHtml($html);
$options = $dompdf->getOptions();
$options->set(array('isRemoteEnabled' => false));
$dompdf->setOptions($options);
$dompdf->setPaper('A4', 'landscape');
$dompdf->render();
$dompdf->stream("smaple.pdf", array("Attachment" => 0));
?>
するとこんな感じで出力されると思います。すごく簡単ですね!
しかし日本語の部分が文字化けしています。
そう、dompdfは日本語に対応していないのです。
日本語の対応方法
dompdfで日本語を扱うにはフォントを追加する必要があります。
1.load_font.phpの用意
下記のページからload_font.phpをダウンロードしてdompdfフォルダ直下に設置してください。
2.使用するフォントをダウンロード
次に日本語フォントの準備です。
今回はIPAフォントを使用しますが、もし別で使いたいフォントがあれば別途用意してください。(ttf形式ならおそらく対応できるはずです)
下記サイトからIPAゴシックをダウンロードして使います。
3.dompdf用にフォントファイルを生成
最初に用意したload_font.phpを使ってフォントファイルを生成します。
下記コマンドの【】を適宜修正してコマンド実行(コマンドプロンプトやPowerShellとかで)してください。
php 【1でダウンロードしたファイルがあるフォルダ】/load_font.php 【任意(cssで指定するfont名になる)】 【2のフォントがあるフォルダ】/【フォントファイル】
少し見辛くなったので実際に私が使用したコマンドも載せておきます。
ちなみフォントをload_font.phpと同階層にコピーしていて、コマンドプロンプトではコピーした階層まで移動した状態で実行しています。
php load_font.php ipag ipag.ttf
これを実行するとdompdfフォルダ内のfontsフォルダにフォントが生成されます。
4.cssでフォントを指定
index.php内のHTMLにフォントを指定すれば日本語が使えるようになります。
<style>
html{
font-family: ipag;
}
</style>
これで日本語の対応は完了で、先ほどのPDFを改めて確認すると。
無事に日本語が正しく表示されました!
画像を表示
続いてdompdfで画像を表示する方法についてです。
理由まではわかりませんが、HTMLに<img src=”img/sample.png”>とタグを打ち込んでも
こんな感じで[Image not found or type unknown]と表示されます。
このエラーは画像指定をbase64にすることで回避できます。
<?php
// dompdfの読み込み
require_once("./lib/dompdf/autoload.inc.php");
use Dompdf\Dompdf;
// 使用する画像をbase64に変換
$file = "img/sample.png";
$image = base64_encode(file_get_contents($file));
// PDFにする内容をHTMLで記述
$html = <<< EOM
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<img src="data:image/png;base64,$image">
</body>
</html>
EOM;
// PDFの設定~出力
$dompdf = new Dompdf();
$dompdf->loadHtml($html);
$options = $dompdf->getOptions();
$options->set(array('isRemoteEnabled' => false));
$dompdf->setOptions($options);
$dompdf->setPaper('A4', 'landscape');
$dompdf->render();
$dompdf->stream("smaple.pdf", array("Attachment" => 0));
?>
最低限で書きましたが、コードとしてはこれで画像が表示されます。
上記のコードはpngでの書き方になるので、別の拡張子を扱う場合はimgタグの書式を拡張子に合わせた形に直してください。
最初、画像が表示されなかった時は焦りましたが方法さえ知っていれば難しいものではないですね!
いかがだったでしょうか、dompdfはコーディングの知識があればかなり自由に組めるライブラリで使い勝手がすごくいいです。
でも日本語対応だったり少し面倒な作業があったりと”とりあえず”で触るには少し手間に感じる方もいるかなとも思いました。
なので「便利そうだし使ってみたい!」と思いつつ今回紹介した箇所で躓いている方がいれば少しでも助けになれば幸いです。
それではまた!