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件)
- 今日のトップ記事
- 昨日
- 5日前
- 6日前
- 7日前
- ホワイトペーパー
- 話題のタグ
Database
小技
HTML
RIA
Webデザイン
脆弱性
開発環境
Firefox
Microsoft
Windows XP
JavaScript
ブラウザ
データベース
UI
iPod touch
Windows Vista
プログラミング言語
Ajax
マイクロソフト
WebKit
オープンソース
iPhone 3G
Opera
Safari
Chrome
インストール
OS
仮想化
Tips
セキュリティ
リファレンス
Internet Explorer
CSS
ソフトウェア開発
Windows
Webサービス
Java
Mac OS X
Flash
Apple
Linux
Google
Off Topic
モバイル
iPhone
アプリケーション
クラウド
Firefox 3
Mozilla
Windows 7
話題のタグを見る »
「Google Chrome」の拡張機能、開発者からのアップロード受付を開始
IMAPでGmailを受信、最も手っ取り早いのは?Windows 7、Ubuntu 9.10、Snow Leopardのメーラー比較
Snow LeopardではNTFSをサポート--その源流を訪ねる(2)
MS運営のオープンソース開発プロジェクト支援サイト「CodePlex」を探検する(2)
Snow LeopardではNTFSをサポート--その源流を訪ねる(1)
フォトレポート:「Windows Server 2008 R2」--あまり知られていない有用な機能10選
高まるiSCSIストレージへの注目度
大丈夫?あなたの会社のセキュリティ対策
100万円で実現!中小企業の情報漏えい対策
【最終警告】パンデミック対策特集
企業ITシステムの企画、構築、運用のイロハ
電力に"ふた"をする独自の省エネ機能とは!?
―エン・ジャパン厳選求人☆毎週更新―