2017年2月3日金曜日

PHPでPDF生成するためにwkhtmltopdfをインストール

wkhtmltopdf_centos7HTMLからPDFを生成するコマンドラインツールwkhtmltopdfをインストールしたときの覚書。

環境: CentOS 7 x86_64

 

目次

  1. YUM経由でインストール
  2. 日本語フォントをインストール
  3. PHPシェルから実行
  4. PHP-FPMから実行するとエラー(2017/02/06 追記)

 


1.YUM経由でインストール

EPELリポジトリにあったのでそちらを使う。
# yum search wkhtmltopdf
# yum info wkhtmltopdf

Version     : 0.12.1
Repo        : epel/x86_64

# yum install wkhtmltopdf

試してみる
# wkhtmltopdf http://dksg.co.jp test.pdf

エラー

wkhtmltopdf: cannot connect to X server

下記QAを参考にした。

# yum search xvfb
# yum install xorg-x11-server-Xvfb

再度試す。
# xvfb-run /usr/bin/wkhtmltopdf http://dksg.co.jp test.pdf

成功したけど、日本語が表示されない。

 


2.日本語フォントをインストール

インストールされているフォント一覧を表示
# fc-list

Google先生が公開しているNoto Sans CJK JPを使う。公式サイトで「Japanese」と検索

ダウンロードと解凍
# cd /usr/share/fonts/
# curl -O https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip
# mkdir NotoSansCJKjp
# unzip -d NotoSansCJKjp/ NotoSansCJKjp-hinted.zip

フォントをインストールして確認
# fc-cache -fv
# fc-list

zipファイルは削除
# rm NotoSansCJKjp-hinted.zip

試す
# xvfb-run /usr/bin/wkhtmltopdf http://dksg.co.jp test.pdf

日本語が表示された。

基本は画面を印刷をした状態のCSSが適用される(@media printが適用される)。

詳しいオプションはヘルプを参照。
# wkhtmltopdf -H

レスポンシブデザインの横幅を変えようと下記コマンドを試してみたけど変わらない。最新にすると可能かもしれない。
# xvfb-run /usr/bin/wkhtmltopdf --dpi 200 --viewport-size 1280x1024 http://dksg.co.jp test.pdf
# xvfb-run --server-args="-screen 0 1024x768x24" /usr/bin/wkhtmltopdf --use-xserver http://dksg.co.jp test.pdf

 


3.PHPシェルから実行

PHPから実行するラッパークラスがある。

内部的にproc_openして、いい感じに実行結果を返してくれるみたい。

今回複雑なパラメータを渡す予定はないのでPHP標準のexecを利用することにした。

 

PHPから実行すると日本語が表示されない。

確認方法(rootユーザーでnginxユーザーとして実行するコマンド)
# sudo -u nginx /usr/bin/xvfb-run /usr/bin/wkhtmltopdf 'http://dksg.co.jp' 'test.pdf'

フォントがあるか確認
# sudo -u nginx fc-list

よく分からないので、WEBフォントを使うことにした。

Early AccessじゃなくなってもいいようにNoto Sansも一応追加しておいた。

<link href="https://fonts.googleapis.com/css?family=Noto+Sans" rel="stylesheet" />
<link href="https://fonts.googleapis.com/earlyaccess/notosansjapanese.css" rel="stylesheet" />

css

body, table {
    font-family: "Noto Sans JP","Noto Sans Japanese","Noto Sans",sans-serif;
}

 


4.PHP-FPMから実行するとエラー(2017/02/06 追記)

実装後にexecするとエラー

which: no xauth in ((null))
xvfb-run: error: xauth command not found

下記サイトを参考に

php.iniを編集して対応する。コメントを外すだけ。
# less /etc/php-fpm.d/www.conf

env[PATH] = /usr/local/bin:/usr/bin:/bin

再起動
# systemctl restart php-fpm

動くようになったけども重すぎてタイムアウトする。

大人しくTCPDFにすれば良かったと思いながらも別プロセスでPDFを生成するように処理を変える。

 

< Related Posts >

コメントを投稿
Related Posts Plugin for WordPress, Blogger...

Blog Archives