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に変換できます。