(この記事は Redmine Advent Calendar 2018 - Adventar の13日目の記事です。)
Redmine の PDF 出力機能で使われている 私が作成した RBPDF gem ライブラリについてのお話です。
RBPDF は下記のような特徴があります。
- Pure Ruby
- HTMLからのPDF変換対応 (CSS 一部サポート)
- PNG/JPEG/GIF形式画像のPDF出力対応 (8bit PNG画像以外は RMagick が必要です。)
- CJKV(中国語・日本語・朝鮮語・ベトナム語) 対応
- 組み込みサブセットFont対応
- アラビア語などのRTL (Right-To-Left) 言語サポート
- 目次・しおり ※PDFへのリンクです。
- 図形 ※PDFへのリンクです。
- 円グラフ ※PDFへのリンクです。
実際にどのような事ができるかは Examples をご覧下さい。
なお、RBPDFは一から作成したものではなくPHPのPDF出力ライブラリTCPDFを、Redmineで使用するために Ruby に移植したものになります。
Redmine の PDF出力機能の歴史
RBPDFを作成することになった経緯を Redmine の PDF出力機能の歴史と合わせてお話しします。
Redmine の PDF出力機能は 1.0 の頃は FPDF という PHPのライブラリを Ruby に移植した RFPDF が使われていました。 このころは日本語が文字化けするなど多くの問題を抱えていましたが、Defect #61: Broken character encoding in pdf export - Redmine のチケットで edwinmoss さんが開発された 同じくPHP由来のTCPDFベースの RFPDF に置き換え & 修正作業を行うことで無事、Redmine 1.2 で CJK(日本・韓国・中国語)と多くの言語の文字化けが解決しました。
なお、これが私のRedmine での初の採用パッチになります。 詳細は、第2回勉強会 - redmine.tokyo (当時は shinagawa.redmine)で LTをさせて頂きました。
RFPDF(TCPDFベース)の機能で画像出力や(Textileから変換された)HTMLの変換などにも対応可能な事がわかったので、Redmine 1.3 で Textileによる書式設定 Feature #69: Textilized description in PDF - Redmine や画像出力 Feature #3261: support attachment images in PDF export - Redmine の対応を実施しました。
ただ、この対応時に多くの課題が見えてきたので、抜本的に解決を図るため edwinmoss さんから RFPDF の開発を引き継ぎ、ベースのTCPDFのバージョンを5.2まで上げる形でPHPからRubyへ移植を実施、RBPDF 1.18 として gem を作成しました。 これは Redmine 2.6 の PDFエクスポートの改善として取り込まれました。
TCPDFをベースとしてgem パッケージを開発した理由は下記になります。
- Redmine コミッターの @marutosijp さんから、PDF出力機能は複雑なので Redmine 本体から分離したいと伺っていた。
- Redmine にパッチが採用されるためにはWindows/Linux OS環境で動作しなければならない。
- Redmine のライセンス(GPL2)と互換のあるLGPL 2.1ライセンスのTCPDF 5.2(PHP)をRubyに移植できれば、RTL言語対応や埋め込みフォント対応、HTMLサポートの改善などが見込める。
詳細は、LTthon | RubyHiroba 2014で発表させて頂きました。
www.slideshare.net
その後、RBPDF 1.19 で埋め込みサブセットフォントをサポートし、Defect #19017: Wiki PDF Export: <pre> not rendered with monospaced font - Redmine で Redmine 3.2 で取り込まれCJK 以外の言語の PDFファイルで発生していた(対象言語の全フォント埋め込みによる)肥大化問題が解決されました。 これで自分の当初のゴールとしていた内容の対応は完了しました。
Redmine の PDF出力機能で改善されるといいなと思っている点
PDF出力機能の基盤部分の改善は実施しましたが、使い勝手の部分では時間が取れず手が回っていないのですが、今後、下記が改善されるといいなと思いっています。
- Feature #6851: Change PDF page size - Redmine
- Feature #13576: Setup page orientation for PDF export - Redmine
- PDF出力は、現状A4サイズ固定ですが、A3とかになればチケット一覧が見やすくなります。
- Defect #19133: PDF Export loses {{toc}} - Redmine
- しおりつけたいですね。
- Feature #11998: PDF export svg support - Redmine
以上です。