Hatena::ブログ(Diary)

130単位

2012-09-05

PDF生成gemライブラリ 4種類比較

関わっているRailsアプリPDF出力の要件があり、いくつかgemを試してみました。以前はPrawnを使いましたが、それとは異なるHTMLPDF化というアプローチは魅力的に感じました。それぞれ深くは検証していませんが、雑感などまとめてみます。ちなみにすべてHerokuでも動きます。

Wicked PDF

  • HTMLからPDF生成
    • 要wkhtmltopdf
  • 2バイト文字出力の際に「<meta http-equiv="content-type" content="text/html; charset=utf-8" />」の記述が必要
    • render のオプションに :encoding => 'UTF-8' を付けてviewから出力する場合は不要
  • CSS/JSでSprocketsが絡んでも問題なく動く
Usage
WickedPdf.new.pdf_from_string('<h1>hello</h1>')

#in Rails controller
#using views/layouts/pdf.html.erb and views/resources/action.pdf.erb
render :pdf  => 'filename', :layout => 'pdf', :encoding => 'UTF-8'

PDFKit

Usage
PDFKit.new('<h1>hello</h1>').to_pdf

Prawn

Usage
Prawn::Document.new{ text 'hello' }.render

Thinreports

Usage
ThinReports::Report.new(:layout => 'report.tlf').start_new_page{ item(:title).value('hello') }.generate

#in Rails view
#using views/resources/action.pdf.thinreports and views/resources/action.tlf
report.set_layout 
report.start_new_page
report.page.values title: 'hello'
まとめ

試した中で個人的に良いと思ったのは、Wicked PDFです。

やはり特にWebアプリであれば、PrawnのようなDSLを覚えたりするよりはHTMLPDF化のほうが効率的といえるでしょう。PDFKitは要件さえ合えばコード追加なしでいけると思いますが、PDFHTMLが全く同じ内容ということは少ないでしょうし、ミドルウェアにした場合デフォルトで全ページがPDF化対象になるのも引っかかるところです。あとはSprockets絡みで固まった経験が印象悪くしました。

Wicked PDFで、特定のアクションのみPDF出力、ビューはHTMLPDFでファイルを別にしておいて共通部分はパーシャルを利用する方針でいこうと考えています。

参考リンク

関連記事

2012-09-02

Heroku wkhtmltopdfで日本語フォントを利用する

wkhtmltopdfは、HTMLからPDFを生成するツールです。RailsではWicked PDFやPDFKitというラッパーgemが使えます。ただHerokuで日本語を含むPDFを生成する場合、そのままだと文字化けしてしまいます。

解決方法ですが、検索で見つけた記事を引用させていただきます。

fontconfigを使う環境では追加のTTFフォントを ~/.fonts に入れておくだけで大丈夫な模様。(参考:書体関係 Wiki - unixuser200403-2

なので、日本語フォント対応するには、IPAフォントなりをダウンロードし、.fontsディレクトリを作成してTTFファイルを突っ込んだ上でherokuにpushしておけばOK。

Heroku の PhantomJS buildpack - snippets from shinichitomita’s journal

こちらの内容でほぼ解決できたと思われますが、具体的な手順を書いてみることにします。

利用手順

Gemfile
gem 'wicked_pdf' # OR gem 'pdfkit'
gem 'wkhtmltopdf-binary' # OR gem 'wkhtmltopdf-heroku', :group => [:production]

wkhtmltopdf-binaryのほうがMac/Linux(Heroku)どの環境でも使えて便利と思います。

Wicked PDF sample
respond_to do |format|
  format.html
  format.pdf do
    html = '<meta http-equiv="content-type" content="text/html; charset=utf-8" /><h1>にほんご</h1>'
    render :text => WickedPdf.new.pdf_from_string(html)
  end
end

例としてコントローラーで簡単に出力していますが、本来はビューを利用するのがいいでしょう。

日本語フォント入手

無料リンク集などから適当な日本語対応フォントダウンロードします。上記引用ではTTFと書いてありますが、OTFフォントでも問題ありませんでした。

フォント追加とデプロイ
cd /path/to/project_root/
mkdir .fonts
cp ~/Downloads/fonts/xxx.ttf .fonts/
git add .fonts
git commit
git push heroku master

これでHerokuでHTMLから日本語PDFの生成が可能になります。

参考リンク

Wicked PDF/PDFKitの詳細な使い方はGitHubのREADMEをご確認ください。