作業環境
cakephp3.6
centos6.9
apache2.4
mysql5.6
php7.1
概要
cakephp3でPDF作りたかった。
bootstrapとか使ってたらcol効かなかったのでもし横並びで困ったらこの記事をどうぞ
やったこと
●参考
インストールはほぼこのサイトのまま作業できたのでよかった。
ありがたすぎます。
必要なライブラリのインストール
# yum install fontconfig libXrender libXext xorg-x11-fonts-Type1 xorg-x11-fonts-75dpi freetype libpng zlib libjpeg-turbo
Bit数の確認
# uname -a Linux localhost.localdomain 2.6.32-696.30.1.el6.x86_64 #1 SMP Tue May 22 03:28:18 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
x86_64とあるし64bitのようなので64bit用のRPMパッケージのインストール
wget先は下記公式のDLページのURLを使ってるよ
wkhtmltopdf
# wget https://downloads.wkhtmltopdf.org/0.12/0.12.5/wkhtmltox-0.12.5-1.centos6.x86_64.rpm # rpm -Uvh wkhtmltox-0.12.5-1.centos6.x86_64.rpm
一応場所を確認する
# which wkhtmltopdf /usr/local/bin/wkhtmltopdf
日本語フォントを利用する
# wget http://dl.ipafont.ipa.go.jp/IPAexfont/IPAexfont00301.zip # unzip IPAexfont00301.zip # mv IPAexfont00301 /usr/share/fonts
今回はcakephp3で使うのでcomposerでrequreしようと思う
phpで利用するためのラッパークラスがあるそうなので、それもcomposerでインストールする
https://github.com/mikehaertl/phpwkhtmltopdf ちなみにこれ
もしかしたらcakepdf入れなくてもいいかも
# composer require mikehaertl/phpwkhtmltopdf # composer require friendsofcake/cakepdf
cakephpの適当なコントローラーにpdf作ってファイル名返すやつを書いてみる
//ファイルの頭の方でuseする use mikehaertl\wkhtmlto\Pdf; (中略) //PDF作成してjsonでファイル名だけ返す感じのやつ public function pdf(){ $this->autoRender = FALSE; //html本体作成、試したときはヘッダフッタがないとうまく動かなかった $html = <<<EOT <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta content="text/html; charset=UTF-8" http-equiv="content-type"> <meta name="robots" content="noindex,nofollow,noarchive"> <meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no-cache"> <meta http-equiv="Expires" content="0"> <title>PDF</title> </head> <body> <style> /* 強制的にサーバーにある日本語フォントにする */ body { font-family: "PAexGothic", "IPAexゴシック";! important } /* PDFに入れないデータの非表示、PDFに入れるデータの表示 */ .pdf-hide{ display: none !important; } .pdf-show{ display: block !important; } /* 改ページ処理 */ .pdf-page-breaker{ page-break-before: always !important; } </style> <h1>この辺にPDFに変換したいhtmlとか書いておく</h1> </body> </html> EOT; // PDFにする直前のhtmlを保存するとpdfにしたときとの差異がわかる $file = '/var/www/html/pre_pdf.html'; file_put_contents($file, $html); $pdf = new Pdf([ //javascript実行待ち 'javascript-delay' => 1000, 'page-size' => 'A4', // バイナリの位置とエンコード形式 'binary' => '/usr/local/bin/wkhtmltopdf', 'encoding' => 'utf-8', //用紙横向き 'orientation' => 'landscape', 'ignoreWarnings' => true, 'commandOptions' => array( 'procEnv' => array( 'LANG' => 'ja_jp.utf-8', ), ), // PDFを端まで利用するときは0にする 'margin-top' => 5, 'margin-right' => 0, 'margin-bottom' => 0, 'margin-left' => 0, 'no-outline', ]); $pdf->addPage($html); // PDFを保存 $filename = 'main.pdf'; $pdf->saveAs($filename); // json返却 if($pdf->getError() === ''){ $data['message'] = 'OK'; $data['filename'] = $filename; $json = json_encode( $data ); return $this->response->withType('application/json')->withStringBody($json); }else{ $data['message'] = $pdf->getError(); $json = json_encode( $data ); return $this->response->withType('application/json')->withStringBody($json); } }
おわり。