PDF生成ツールあれこれ [2024年]

(2007.10.1新規作成; 2007.10.7公開)

Ruby on Rails アプリケーションから使えそうなPDF出力ツールを探してみました。

以前日記 (Rails でPDFを生成する) に書きましたが、canvas 機能 (座標を指定して文字を出力したり、線を引いたりする) だけでは帳票を作るのに実用ではありません。レイアウトエンジン (表や罫線、という指定の仕方) が必要です。

Rails アプリケーションに組み込む場合は Ruby で書かれたものでないといけませんが、別コマンドとして呼び出すことができればRubyにこだわることはありません。

(2024年5月)

長らく各所で使われていた wkhtmltopdf が 2023年1月にアーカイブされた。QtWebKit 5.212 に依存していたが, QtWebKit 自体は Qt 5.6 (2016年3月) で削除されており、fork されたものを使っていた。

Red Hat では Bug 1872819 - Retire qt5-qtwebkit, and everything that depends on it が出ている。手元の Fedora 38 だと qt5-qtwebkit パッケージを消しても大丈夫だったが、依存するアプリケィションが多すぎて、リポジトリから削除には至っていない。

結論 [2024年時点]

PDF を描画機能で直接出力しようと思わない前提だと、テンプレートの使いやすさで選ぶのがいい。

2024年現在, WeasyPrint がテンプレートとして HTML + CSS で各種 HTML ツールも使えるし、サポートされる CSS の範囲も広く、ベストでしょう。

次いで, 同じく HTML + CSS の xhtml2pdf. あとは非常に歴史のある Apache FOP が XSL-FO.

独自形式では, Thinreports が軽い感じでよさそう。簡素なフォーマットでもよければ、Asciidoctor-pdf が使える。

別ページで、Apache FOPの使い方をまとめてみました; Apache FOPでPDF生成

Ruby 製

Ruby 製だと、まずベースとして Prawn PDF が PDF 出力を担う。2024 年 3月に v2.5.0.

対抗馬は HexaPDF. ライセンスが AGPL. 商用ライセンスあり。PDF の描画能力を引き出すために、Ruby スクリプトで書いていく。そんなに変な感じではないが、もう少し簡単に行きたい。

Prawn は canvas を提供するので、この上にレイアウトエンジンを載せる。

Thinreports | A PDF generation tools for Ruby
デスクトップアプリのテンプレートエディタでテンプレートファイルを作り、そこに Ruby スクリプトでデータを流し込んで、PDF を生成する。

Prawn を利用。2024年1月に v0.14.2. これはよい。日本語フォント問題なし。複雑な表、1ページを超える表、画像 OK.

Asciidoctor PDF: A native PDF converter for AsciiDoc based on Asciidoctor and Prawn, written entirely in Ruby.
AsciiDoc 文書を PDF に変換する。AsciiDoc は Markdown と異なり、複雑な表も作れて表現力がけっこうあるので、ある程度の内容ならこれが簡単。ただし、ある程度の内容なら、に限る。
Ruby Reports Ruport
Ruby Reports (Ruport) は、Rubyで書かれたリポーティングツール。Ruby on Railsと相性がいい。ActiveRecord のデータを少ないステップでPDF化できる。

2022年に v1.8.0. バックエンドは pdf-writer Prawn に変更. 開発低迷.

Rabbit - Rubyist用プレゼンツール
番外。プレゼンテーションソフト。ジャンルが違う。

2023年に v3.0.3. まさか継続している。

PDF での保存機能がある。このパッケージが gtk3 に依存しており、gtk の機能を使うようだ。

Ruby 以外

コマンドラインで呼び出せば、別に Ruby 製に拘らなくてよい。

Apache™ FOP - a print formatter driven by XSL formatting objects (XSL-FO) and an output independent formatter.
2023年 8月に v2.9. まだ続いている。Java 製

XSL-FO 1.1 XMLデータからPDFを生成する。コマンドラインツールとして使うこともできるし、Javaプログラムに埋め込むこともできる。多少の設定で日本語フォントを扱える。

Open source installation - ReportLab Docs
ReportLab PDF Toolkit は Python で書かれたツールキット。ReportLab Plus は有償。

日本語の出力も、フォント埋め込み、表組みも可能。プログラムで Paragraphオブジェクト (段落)、Tableオブジェクト (表) などを組み合わせる。

下記の xhtml2pdf が ReportLab 上で動く。

WeasyPrint
HTML + CSS を PDF に変換する。Python 製

試してみた。pip コマンド一発で入る。

日本語フォントもOK. CSS のサポートも広い。

これがベストか。

xhtml2pdf/xhtml2pdf: A library for converting HTML into PDFs using ReportLab
これもよい。Python 製, HTML を PDF に変換する。

Debian 12 Bookworm だと apt コマンドで入る。これが簡単。

日本語フォントOK, 表もOK。ただし CSS のサポートは WeasyPrint のほうが優れている。まず WeasyPrint でやってみたほうがいい。

fpdf2
Python 製のライブラリ。依存が少ない。

Primitive な描画機能と、初歩的な HTML からの変換が可能。試していない。

romanlv/trml2pdf: open source implementation for RML language (markup language for PDF generation)
Tiny RML2PDF は XML データをPDFに変換する。内部でReportLabを使っている。'reportlab>=3.2.0', 'six>=1.9.0'

サイトには RML is a more powerfull, simple and flexible alternative to XSL:FO. とある。日本語フォントの出力、TrueTypeフォントの埋め込みも可能。

実際に使ってみると、書き間違えたときのエラーが非常に不親切で、元になるRML XMLデータを作るのが難しい。Tiny ERP に同梱されているもののほうが新しいが、そちらも大して変わらない。

今のバージョンはちょっと苦しい。

iText Community
Java版と .NET 版がある。ライセンスは AGPL

プログラムでPhraseオブジェクト、Paragraphオブジェクト (段落)、Tableオブジェクト (表) などを加えていく。ReportLab みたい。日本語OK、フォント埋め込みも可能。

データを格納するXMLデータとタグマップデータを組み合わせてPDFへ変換することもできる。まだ試してないが、よさそう。

JasperReports® - Free Java Reporting Library
Javaの帳票ツール。GUIプログラムのiReportで帳票テンプレートを作り、JasperReportsでデータベースから取り出したデータを動的に埋め込んでPDFを出力する。あらかじめテンプレートをコンパイルして、PDF生成処理の時間を短縮するようになっている。
ここは中島 靖のホームページです。
PDFJ -- Perlで書かれたPDF生成モジュール。日本語組版ルールを組み込んであり、XMLデータからPDFを作ることもできる (XPDFJ)。
▲ gtkhtml3 + gtk+のPDF出力機能
番外。gtkhtml3 (libgtkhtml) ライブラリはEvolutionの内部で使われているHTMLエンジン。gtk+の印刷ダイアログはPDF出力があるので、組み合わせて何とかならないか試してみた。

HTML文書からPDFは生成できて、日本語も出力できるが、フォントを切り替えることができなかった。デフォルトフォントだけでは見栄えがしない。

最新が 2015年の v4.10.0. 廃れた.