CodeIgniter + wkhtmltopdf + snappyでWebページをPDFに変換する
あまり利用することがないかもしれませんが、自分で生成したWebページをPDFに変換して出力したいときがあります。その場合wkhtmltopdfとsnappyを使用すると、さくっとPDFを作成することができます。
環境作成
CodeIgniterは以前の記事で作成したものを使用します。 mikawatan.hatenablog.com
wkhtmltopdfをインストールする
今回はwindows環境で作成したため、インストーラーをhttp://wkhtmltopdf.org/downloads.htmlよりダウンロードしてインストールします。
knp-snappyをインストールする
composerを使用してインストールします。
$ composer require knplabs/knp-snappy
PDFの作成
Twigを使用してhtmlを変数に出力します。
$this->load->library('twig'); $html = $this->twig->render('pdf/index.html');
この場合、cssはインラインで記述していないとうまく表示がされません。
<!-- NG --> <link href="css/index.css" rel="stylesheet" type="text/css"> <!-- OK --> <style> p { font-size: 16px; } </style>
Pdfクラスの初期化時にwkhtmltopdfへのパスを設定します。内部的にcommandを実行するためパスはダブルクォーテーションで囲います。
$pdf = new Knp\Snappy\Pdf('"C:\Program Files (x86)\wkhtmltopdf\bin\wkhtmltopdf.exe"');
生成したPDFをダウンロードする場合
headerを出力した後にpdfを出力します。
public function index() { $this->load->library('twig'); $html = $this->twig->render('pdf/index.html'); $pdf = new Knp\Snappy\Pdf('"C:\Program Files (x86)\wkhtmltopdf\bin\wkhtmltopdf.exe"'); // 出力 header('Content-Type: application/pdf'); header('Content-Disposition: attachment; filename="test.pdf"'); echo $pdf->getOutputFromHtml($html); }
生成したPDFをファイルに保存する場合
generateFromHtmlの引数に出力するファイルのパスを指定します。
public function index() { $this->load->library('twig'); $html = $this->twig->render('pdf/index.html'); $pdf = new Knp\Snappy\Pdf('"C:\Program Files (x86)\wkhtmltopdf\bin\wkhtmltopdf.exe"'); // ファイルに保存 $pdf->generateFromHtml($html, APPPATH.'tmp\test.pdf'); }
まとめ
wkhtmltopdfとsnappyを使用すればさくっとWebページをPDFに変換できます。