Rubyでどう書く?:RubyでPDF履歴書を作成する
高倉利明(KBMJ)
2008/05/07 13:00
第2回目のテーマは「RubyでPDF文書を作成する」と題しまして、RubyでPDFの文書を作成する方法について解説したいと思います。
問題
Webアプリケーションを開発していると、「PDF文書を作成してほしい」との要望をクライアントから頂くことがあります。しかし、Rubyの実際のサービスでPDFを出力しているものはあまりありませんでした。
ここでは以前、私が行った開発を元にノウハウを紹介したいと思います。
仕様
- Ruby on Railsを使用(実際に必要になるケースはRoRプロジェクトがほとんどと考えました)
- Rfpdfプラグインを使用(インストール方法はRoR Wiki 翻訳 Wiki - Rfpdfを参照)
- 出力するフォーマットは図1のイメージ
図1 イメージ画像
回答例
class Resume
class << self
# PDF出力メソッド
def output
pdf = Pdf.new("高倉 利明", "タカクラ トシアキ")
file = File.open("C:\\resume.pdf", "wb")
file.write(pdf.generate)
end
end
# pdf作成クラス
class Pdf
IC_SJIS = Iconv.new('SJIS', 'UTF-8')
def initialize(name, kana)
# 出力データ
@name, @kana = name, kana
# マージン
@lm, @tm = 10, 10
# 基本となる罫線の横、縦サイズ
@width, @height = 120, 20
@pdf = FPDF.new
@pdf.extend(PDF_Japanese)
@pdf.AddSJISFont
end
# PDF(バイナリデータ)を作成
def generate
@pdf.SetMargins(@lm, @tm)
@pdf.AddPage
drow_format(@lm, @tm)
drow_data(@lm, @tm)
return @pdf.Output
end
# フォーマット描画
def drow_format(left, top)
@pdf.SetXY(left, top)
setBoldLine
@pdf.Cell(@width, @height, '', 1)
@pdf.SetXY(left, top)
setThinLine
# 氏名(フリガナ)欄
@pdf.SetXY(left, top)
@pdf.SetFont('SJIS','', 8)
@pdf.Cell(20, 5, ic('フリガナ '), 'B', 0)
@pdf.Cell(@width - 20, 5, '', 'B', 1)
# 氏名欄
y = @pdf.GetY
setBoldLine
@pdf.Cell(@width, 15, '', 'B', 0)
@pdf.SetXY(left, y)
@pdf.SetFont('SJIS','', 8)
@pdf.Cell(20, 5, ic('氏名 '), 0, 2)
@pdf.Cell(20, 10, '', 0, 0)
@pdf.SetXY(left + 20, y)
@pdf.Cell(@width - 20, 15, '', 0, 1)
end
# データ描画
def drow_data(left, top)
@pdf.SetXY(left, top)
write_string(left + 25, top + 3, 10, @kana)
write_string(left + 25, top + 13, 14, @name)
end
def write_string(left, top, font_size, string)
@pdf.SetXY(left, top)
@pdf.SetFont('SJIS','', font_size)
@pdf.Write(0, ic(string))
end
def setBoldLine
@pdf.SetLineWidth(0.3)
end
def setThinLine
@pdf.SetLineWidth(0.1)
end
def ic(str)
IC_SJIS.iconv(str)
end
end
end
本ソースをresume.rbとしてRoRプロジェクトののmodelディレクトリに配置し、以下のコマンドを実行することで「C:\resume.pdf」で出力されます。
ruby script/runner Resume.output
解説
本サンプルでは、
- マージン、枠の縦横サイズの初期化「initialize」「generate」
- 罫線などのフォーマットを描画「drow_format」
- 各項目の値を描画「drow_data」
というステップにわけて処理をしています。
RFPDFライブラリを使用する場合は、
- FPDF.newでオブジェクト生成
- 日本語が扱えるようにextendやAddSJISFontメソッドで指定
- AddPageメソッドでページを追加
- ページに表示する内容を描画
- 座標:SetXY、SetX、SetY、GetX、GetYなどを利用
- 文字フォント:SetFontで指定
- 罫線サイズ:SetLineWidthで指定
- 罫線:Cellメソッドで描画(第三引数に文字列を指定することで、同時に文字の描画も可能)
- 文字:Writeメソッドで描画
- Outputメソッドでバイナリを出力
という流れとなります。
日本語を出力する際は、Iconvを使用してSJISに変換しています(ソースをUTF8で書いているため)。
なお、RFPDFの詳しい使用方法は、FPDFのWebサイト「FPDF」を参考にしてください。
最後に──
駆け足で説明しましたが、いかがだったでしょうか?
実際のところ、RFPDFは1年近く更新されておらず、また日本語を扱う上でまだバグが見られるのが現状です。
また、罫線などの枠線をプログラムで引いている関係上、直観的ではない作りになってしまうのが欠点です。
もっと良い方法があれば、コメントやbuilderブログなどで是非教えていただきたいと思います。
- 特集: Rubyでどう書く? (7件)
- ホワイトペーパー
- 企画特集
ESBでIT投資の無駄を劇的に解消する
インターネット上の悪意を未然に防ぐには?
セキュリティ&ユーザ事例【SIer Club】
そのストレージで仮想化に対応できますか?
◆エン・ジャパン厳選求人☆毎週更新◆
【徹底対談】運用管理ツールの賢い使い方
中小企業のセキュリティリスクとは?
SOA、BPM、SaaS −今、企業に必要なこと
パンデミック対策特集
ストレージメディア特設サイト開設
集積度も性能も、業界最高水準のブレードPC
今注目の「サジェスト検索」−デモ掲載中
ロリポップ!がリニューアル
御社のログ活用しませんか!?
仮想環境を実現するソリューション特集
- サーバー監視・運用のコストを削減するには
- サービス・ドリヴン・データセンター
- エンタープライズにおけるSUSEの強み
- ■ストレージ容量50%削減保証■
- 話題のタグ
プログラミング言語
Mac OS X
開発環境
セキュリティ
インストール
JavaScript
仮想化
OS
Safari
CSS
脆弱性
Chrome
iPod touch
モバイル
Google
Mozilla
Linux
Apple
Adobe
リファレンス
小技
Windows 7
iPhone
ソフトウェア開発
RIA
Windows Vista
Tips
オープンソース
Off Topic
UI
PHP
Microsoft
Flash
Java
Firefox
Database
Opera
ブラウザ
Windows
アプリケーション
Webサービス
データベース
iPhone 3G
HTML
Webデザイン
Firefox 3
WebKit
Internet Explorer
SOA
Ajax
話題のタグを見る »
Windows 7はLinuxへの切替が簡単:注目の仮想ディスクフォーマット「VHD」
iPhone OS 3.0で変わった「絵文字」
OSSのクラウド基盤「Eucalyptus」を使う(4)--インストール〜ノード構築
俳優経験者が指南する「人前で上手く話すためのティップス10選」
「うるまでるびペイント」登場:絵は上手下手ではなく制作過程に楽しみが
待てば回路の日和あり--「iPhone 3GS」発売、しかし――