PDF出力機能

この記事について

本記事は、2023年9月に社内で実施した勉強会の内容を基に、社外向けに再編集したものです。
記載の内容は執筆当時の情報であり、現在の仕様やベストプラクティスと異なる可能性があります。
実装にあたっては、必ず最新の公式ドキュメントをご確認いただくようお願いいたします。

RailsでPDF出力する際によく利用されるGem

  • Wicked PDF
    HTML/CSSをPDFに変換できるGemで、レイアウトの自由度が高く、細かいカスタマイズも可能です。
    Railsのビューテンプレートを使ってPDFを出力できます。
    ※更新が最近あまり活発ではない可能性があります。
  • Prawn
    PDFを直接生成できるGemで、柔軟性が高く、カスタムレポートや独自ドキュメントの作成に向いています。
    PDFを直接生成するため、柔軟性が高く、カスタムなPDF出力を実現できます。
  • grover
  • thinreports

Prawn

参考:
Prawn公式GitHub
https://github.com/prawnpdf/prawn

Gemfile

gem 'prawn'
gem 'prawn-table'

PDFの出力データ

class PokedexPdf < Prawn::Document
  def initialize(pokedex)
    super(page_size: 'A4') # 新規PDF作成
    # フォントのパスを指定
    font "app/assets/fonts/pkmn_r.ttf"
    # 名前の出力
    text_box pokedex.name_ja
  end
end

※Prawnは日本語に対応していないため、日本語を出力する場合はフォントの指定が必要です。

PDF出力の呼び出し元

    poke = Pokedex.new({name_en: "abcdef", name_ja: "ふしぎだね"})
    pokedex_pdf = PokedexPdf.new(poke).render
    # PDF出力に必要なオプション
    send_data pokedex_pdf,
      filename: 'pokedex_pdf.pdf',
      type: 'application/pdf',
      disposition: 'inline' #PDFをブラウザ上に出力 外すとダウンロード
目次

Prawnで実現可能なこと

具体的な記載例は公式マニュアルに掲載されています。

参考資料:
Prawn公式マニュアル(2023年9月閲覧)
https://prawnpdf.org/manual.pdf

PDF出力時に注意すべき点

  • 表示に関する考慮
    PDF/A や PDF/X などの規格の違いや、フォントが埋め込まれていなかったり、閲覧環境によって、文字化け・レイアウト崩れが発生することがあります。

  • 印刷設定による見た目の差
    解像度や余白設定によっては、プリンタやドライバの違いで印刷結果が変わる場合があります。

  • 内部データの違い
    一見同じ見た目のPDFでも、作成方法によって内部構造が異なることがあります。

  • ページをまたぐ明細の扱い
    明細行が多い場合、ページをまたぐ際の表示仕様(ヘッダーの繰り返し、改ページ位置など)に注意が必要です。

  • 文字数が多い場合の表示処理
    テキストが長い場合は、折り返し・省略などの表示ルールを明確にしておくことが重要です。

  • 専用用紙への印刷対応
    ミリ単位での位置合わせが求められることがあります。

  • ウォータマーク(電子透かし)の扱い
    ウォータマークを付与する場合は、出力方式に工夫が必要です。

  • セキュリティ設定
    パスワードによる暗号化や、機能制限のが必要な場合があります。

  • フォントライセンスの確認
    使用するフォントのライセンス条件にも注意が必要です。

  • 伝票系PDFの生成タイミング
    データ変更の影響を防ぐため、伝票類などは一度きりの生成に留める仕組みを設けるのが望ましいです。

  • 画像を含むPDFのパフォーマンス
    高解像度の画像を多く含むPDFは、生成時や閲覧時にメモリ・CPUを多く消費するため注意が必要です。

参考

20220125_令和版!RailsアプリでPDF生成するテクニック集 in 銀座Rails#41, 森 雅智 / @morimorihoge(2023年9月閲覧)

役に立ったらシェアしていただけると嬉しいです
  • URLをコピーしました!
  • URLをコピーしました!
目次