WordPressで帳票をPDF出力するには[wkhtmltopdf] on CentOS
2018/03/22
WordPressで入力したデータを整形してPDF出力がしたい。そんな時の手順。
PDF出力側はこちらを参照:PHPでPDFを作成する時はwkhtmltopdf + snappyで戦え
基本的にはここに書いてある順番に実行すれば大丈夫だと思います。
環境:CentOS6.7
wkhtmltopdfのインストール
[code]cd /usr/local/src
wget http://download.gna.org/wkhtmltopdf/0.12/0.12.2.1/wkhtmltox-0.12.2.1_linux-centos6-amd64.rpm
rpm -ivh wkhtmltox-0.12.2.1_linux-centos6-amd64.rpm[/code]
書かれている通り、依存関係で足りないものがあればyum使ってインストールしてください。
日本語フォントのインストール
[code]wget http://dl.ipafont.ipa.go.jp/IPAexfont/IPAexfont00301.zip
unzip IPAexfont00301.zip
mv IPAexfont00301 /usr/share/fonts[/code]
snappyの導入
composerが入ってないと使えないので入ってない場合はインストール。
composerインストール
[code]cd ~
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer[/code]
composerと打ってCOMPOSERって派手な画面が出ればOK。
snappy導入
composerはプロジェクト毎なので、まずはWordpressの wp-contentの中に移動。
[code]composer require knplabs/knp-snappy[/code]
これでOK。はい簡単!
functions.phpをいじる
と、言いつつ、PDF帳票のHTMLが膨大になるので別ファイルにしたいという事で、ThemeフォルダにgeneratePDF.phpというファイルを作って保存。functions.phpから読み込む形にした。
functions.phpにこちらを書き込む。同階層にあるのでファイル名だけかけば読み込んでくれる。
[code]include_once('generatePDF.php');[/code]
次に、generatePDF.phpを作る。
あるpost_idの時に、PDFダウンロード用のリンクを出力して、それをクリックするとPDFがダウンロードされる。
カスタムフィールドの値等は、適宜読み込んであげればPDFに出力することが出来る。
[code]<?php
//----------------------------------------
//キーを追加するためのフィルターフック
//----------------------------------------
//$public_query_varsに、キーを渡す
function add_meta_query_vars( $public_query_vars ) {
$public_query_vars[] = 'outputpdf';
return $public_query_vars;
}
//add_meta_query_vars関数を実行
add_filter( 'query_vars', 'add_meta_query_vars' );
function pdfgenerate(){
if( $post_id == 'ポストIDを指定'){
echo "<a href='". $_SERVER["REQUEST_URI"] ."?outputpdf=y' target='_blank'>ダウンロードボタン</a>";
$pdfquery = get_query_var('outputpdf');
if( $pdfquery == 'y'){
// 変数を読み込む例
$title_to_pdf = get_the_title($post_id);
require_once '/var/www/適宜パスつなげてくださいwp-content/vendor/autoload.php';
$html = <<<EOT
<!DOCTYPE html>
<html>
<head></head>
<body>
ここに中身を書く
<h1>$res_title</h1>
</body>
</html>
EOT;
// wkhtmltopdfの位置をコンストラクタに渡す
$pdf = new Knp\Snappy\Pdf('/usr/local/bin/wkhtmltopdf');
// encoding = utf-8をセット
$pdf->setOption('encoding', 'utf-8');
// PDFをブラウザに出力してダウンロード
header('Content-Disposition: attachment; filename="'.date("Ymd").'.pdf"');
header("Content-Type: application/pdf");
echo $pdf->getOutputFromHtml($html);
}
}
}
add_action( '適当なフック', 'pdfgenerate',10,2);[/code]
こんな感じです。
URLに &outputpdf=y というパラメータがついていたら、PDFが出力されるようにした。
例えば、
https://geeorgey.com/mypdf/
みたいなページだったら
https://geeorgey.com/mypdf/?outputpdf=y
というアクセスになるとPDF出力されるようになる。
wkhtmltopdfがとても良い
今まで、PDF出力って、枠からはみ出る…とか、思うように表示できない…といったイメージが有りましたが、wkhtmltopdfはHTMLをそのままPDF変換してくれるのでとてもよい感じです。
スタイル付けておくと便利です
HTMLのヘッダ部分にスタイルを追加しました。
[code]<style type="text/css">
hr { page-break-after: always; }
tr {
page-break-inside: avoid;
}
</style>[/code]
hrが入ったら、改ページが入るように。
trの設定は、これやっとくと表組みが改ページにかかっちゃった場合にきちんと表示してくれるおまじないです。
文字化けへの対処
たまに特殊文字が入っているとPDFが文字化けすることがある。
参考:http://hakoniwahaniwa.hatenablog.com/entry/2015/11/12/125012
[code]$pdf = new Knp\Snappy\Pdf('/usr/local/bin/wkhtmltopdf', array(), array("LANG" =<span class="synError">></span> "ja_JP.UTF8"));[/code] 第三引数を与えてあげることで解決した。