【Ruby+PDFKit】RubyでHTMLからPDFを生成する

 (出来上がりイメージ)

RubyにPDFKitを入れると、HTMLでマークアップした文書をPDFとして出力することができます。デフォルトオプションでも相当きれいな出力が得られるので、データ解析の結果をまとめたり、日々の実験結果のサマリを自動生成するのにも使えると思います。以下、自分用のログです。

[tmkm-amazon]9784774173221[/tmkm-amazon]

インストール

gemでPDFKitをインストール。

1
2
3
gem install pdfkit

http://wkhtmltopdf.orgにあるwkhtmltopdfという外部プログラムが必要なので、ダウンロードページからダウンロードしてインストールします。

使い方のサンプル

以下のサンプルのように、HTMLをstringとして用意し、PDFKit.new()に渡します。to_pdfメソッドをコールすると、PDFの文字列が戻ってくるので、fileに書き出しています。

なお、<h1>タグではstyleアトリビュートを付与してフォントを選択したり、<h2>タグでは文字色を変更しています。CSSを書いておくと簡単に装飾を変更できます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
require "PDFKit"

htmlString=<<EOS
<h1 style="font-family:'ヒラギノ角ゴ Pro W3','Hiragino Kaku Gothic Pro',sans-serif;">Ruby PDF Example</h1>
<h2 style="color: orange;">Heading 2</h2>
<div>
	This is body text. This is body text. This is body text.
</div>
<div>
	This is body text2. This is body text2. This is body text2.
</div>
<div>
	<ul style="line-height: 3em;">
		<li> Itemize </li>
		<li> Itemize </li>
		<li> Itemize </li>
	</ul>
</div>
EOS

file=open("RubyPDFExample.pdf","w")
file.puts PDFKit.new(htmlString).to_pdf
file.close

で、これをmake_pdf.rbとかに保存して

1
ruby make_pdf.rb

と実行すると、RubyPDFExample.pdfというPDFファイルが生成されるはずです。

画像を挿入するサンプル

タグを使えば、画像の挿入も可能。ぼくがMac環境で試した範囲では、画像ファイルをフルパスで指定する必要がありました(なお、Rubyで相対パスからフルパスを取得する場合はFile.expand_path(“file.png”)がつかえます)。

1
    <img src="/Users/yuasa/Desktop/Taipei.png">

生成されるPDFは以下のような感じになります。

RubyPDFExampleWithImage.pdf

なお、サンプルで使用している写真は台北の國家戲劇院(National Theater)です。 [tmkm-amazon]B00K8BNHEC[/tmkm-amazon]

ソースコード全体は以下のとおりです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
require "PDFKit"

htmlString=<<EOS
<h1 style="font-family:'ヒラギノ角ゴ Pro W3','Hiragino Kaku Gothic Pro',sans-serif;">Ruby PDF Example</h1>
<h2 style="color: orange;">Heading 2</h2>
<div>
	This is body text. This is body text. This is body text.
</div>
<div>
	This is body text2. This is body text2. This is body text2.
</div>
<div>
	<ul style="line-height: 3em;">
		<li> Itemize </li>
		<li> Itemize </li>
		<li> Itemize </li>
	</ul>
</div>
    <img src="/Users/yuasa/Desktop/Taipei.png">   <!-- ←imgタグを追加しています -->
EOS

file=open("RubyPDFExampleWithImage.pdf","w")
file.puts PDFKit.new(htmlString).to_pdf
file.close

[tmkm-amazon]4797359986[/tmkm-amazon] [tmkm-amazon]4767814294[/tmkm-amazon]