Prawnを使ってモデルから取得した日本語データをPDFとして表示する手順をまとめました。
下記サイトのサンプルコードをベースに作成しました。
http://www.sitepoint.com/pdf-generation-rails/
1)日本語のフォントを入手して配置
下記サイトから入手し、vendor/fonts/ipam.ttfに配置しました。
http://ossipedia.ipa.go.jp/ipafont/index.html
2)ヘッダー画像をapp/assets/images/header.jpgにアップロード
3)PDFを生成するコードをapp/pdfsディレクトリ内に定義
上記サイトのサンプルコードをベースに日本語フォントの設定を追加しました。
・jp_fontの定義
・table_content内の下記コードを削除
row(0).font_style = :bold
$ vi app/pdfs/report_pdf.rb
class ReportPdf < Prawn::Document def initialize(trade_items) super() @trade_items = trade_items header text_content jp_font table_content end def jp_font font "#{Rails.root}/vendor/fonts/ipam.ttf" end def header image "#{Rails.root}/app/assets/images/header.jpg", width: 530, height: 150 end def text_content y_position = cursor - 50 bounding_box([0, y_position], :width => 270, :height => 300) do text "Lorem ipsum", size: 15, style: :bold text "Lorem ・・." end bounding_box([300, y_position], :width => 270, :height => 300) do text "Duis vel", size: 15, style: :bold text "Duis vel ・・" end end def table_content table trade_item_rows do self.header = true self.row_colors = ['DDDDDD', 'FFFFFF'] self.column_widths = [40, 300, 200] end end def trade_item_rows [['#', 'Name']] + @trade_items.map do |trade_item| [trade_item.id, trade_item.trade_item_name] end end end
4)コントローラのindexアクションを定義
上記3)で定義したReportPdfを実行します。
def index @trade_items = TradeItem.all respond_to do |format| format.html format.pdf do pdf = ReportPdf.new(@trade_items) send_data pdf.render, filename: 'report.pdf', type: 'application/pdf' end end end
5)動作確認
http://localhost:3000/trade_items.pdfをブラウザに入力すると”report.pdf”というファイルがダウンロードされます。
ヘッダー画像、サンプルテキスト、モデルから取得した日本語データが表示出来ていることが確認出来ました。