まめ畑

ゆるゆると書いていきます

RubyでPDF作成してみる

RubyでPDFがを生成できないかと思って調べてみました。
その結果、何種類かライブラリが見つかりましたが日本語が出力出来るものは以下の2つのようでした。

  • Haru Free PDF Library2
  • pdf-writer

1つ目のものは、Cで書かれたライブラリです。しかし、様々な言語から扱えるifを持っています。
2つ目はgemでインストール出来るのですが、日本語化にはパッチを当てる必要があります。しかし、調べたところ、gemでインストール出来る最新版の物に対応したパッチは無く、1つ古いバージョンの物をインストールする必要があります。


今回は、Haru Free PDF Library2を使ってみました。
このライブラリは圧縮や暗号化に対応しています。

Ruby用のドキュメントが見当たらないのですが、PHP版のドキュメントが日本語で結構充実しているので、そちらを参考にするといいかと思います。
メソッド名などが若干違いますが、methodsなどを使って調べれば似たようなものが見つかります。
PHP版のドキュメントはこのあたりを参考にしました。ページが見つかりませんでした | MAKIZOU.COM
後は、Demoのソースコードが入っているので参考になります。

インストール方法(Windows)

公式ページHaru Free PDF Library
今回はWindowsを使用したので、バイナリを使用しました。
Linuxで使用する場合はこちらを参考にビルドしてください。

DLするファイルは

  • libharu_2_0_8_ruby_win32.zip

まずは、DLしたファイルを解凍します。
libharu-2.0.8-win32rubyフォルダ中の「hpdf.so」を

path_to_ruby\lib\ruby\site_ruby\1.8\i386-msvcrt

にコピーします。
これで完了です。

他Platformや「C# Delphi」のバインディングの説明はこちらに掲載されています。


使ってみる

Demoフォルダに既に日本語フォントを扱うものやパスワードをかけるデモが入っています。
以下では、簡単にメソッドの説明をしてます。


日本語フォントを扱う場合は

require "hpdf"

pdf = HPDFDoc.new
pdf.set_compression_mode(HPDFDoc::HPDF_COMP_ALL)
pdf.use_jp_fonts         #日本語フォントを有効
pdf.use_jp_encodings   #日本語エンコーディングを有効
pdf.get_font("MS-Gothic", "90ms-RKSJ-H")   #埋め込みフォントを取得

という感じで日本語フォントを扱えるようにします。


後は

encoder = pdf.get_encoder("90ms-RKSJ-H")
root = pdf.create_outline(nil, "日本語フォント", encoder);

マルチバイトエンコーディング指定します。
こちらで指定できるエンコード一覧は先ほどのPHP版の解説ページに一覧があります。
これはアウトラインを作成する際に指定するもので、本文は先に指定したフォントになっています。


各ページを作成するには

page = pdf.add_page   #ページを作成
page.begin_text       #内容の開始
page.set_font_and_size(font, 10.0)   #文字のフォントやサイズを変える場合に使用する   
page.show_text(SAMP_TEXT2)      #文字を描画
page.end_text            #内容の終了

pdf.set_password(owner_passwd, user_passwd)   #パスワードかける場合に使用

pdf.save_to_file("hoge.pdf")         #ファイルへ書き込む


基本的にはこんな感じですが、線を引いたり、文字位置を指定したりするメソッドも多数用意されています。
画像も指定出来ます。
また、用紙サイズや塗りつぶし印刷位置、拡大・縮小も指定出来ます。

その他

組み込みフォント以外も使えます
自分で用意したフォントを使うには

#load_ttfont_from_fileの第2引数はフォントを埋め込むかどうか。
#第3引数は文字エンコードの指定
get_font(pdf.load_ttfont_from_file("TTFファイル名", HPDFDoc::HPDF_TRUE), 'EUC-H')

PHP版ではTTCやType1フォントも読み込めるメソッドがありますが、Rubyではないようです。


ファイル情報も書き込めます
HPDFDocのインスタンスメソッドです。

  • 作成日時の埋め込み
set_info_date_attr(HPDFDoc::HPDF_INFO_CREATION_DATE, year, mon, mday, hour, min, sec, '+', 9, 0)
  • もろもろの情報の埋め込み
#Subject
set_info_attr(HPDFDoc::HPDF_INFO_SUBJECT, "HogePDF")

#作成者
set_info_attr(HPDFDoc::HPDF_INFO_CREATOR, "con_mame")

#タイトル
set_info_attr(HPDFDoc::HPDF_INFO_TITLE, "HogeHoge")

#キーワード
set_info_attr(HPDFDoc::HPDF_INFO_KEYWORDS, "Ruby,PDF")


まだ、色々試していませんが、埋めこみフォントやフォントの埋めこみで日本語も問題なく使用出来る感じです。
しかし、変形したエリア(円状に文字を配置)などをすると物によっては文字化けするようです。
文字コードSJISEUCが使用できます。


探し方が悪いのかもしれませんが、Ruby用のドキュメントが見つからないので、定数などがわかりにくいです。
ページサイズとか定数を使用して指定します。
オフセットとかそのあたりは数値の入力ですが。