Ruby
prawn

YAMLで履歴書を作る

はじめに

履歴書、書いてますか?>挨拶

僕もいま任期付きなもんで履歴書を書いては送る日々なわけですが、履歴書ってなんであんなに書きづらいんでしょうね?

で、これまでは履歴書をLaTeXで書いて管理してたのですが、ちょっとスタイルを修正するのもすごく面倒だし、そもそもデータとスタイルの分離がよろしくないのがストレスでした。そんな時にこの【退職】履歴書をGit管理したかってん【しました】という記事を見て、僕も履歴書をもう少し扱いやすいフォーマットから作るスクリプトを書きました。ソースはGitHubに置いてあります。

https://github.com/kaityo256/yaml_cv

何ができるか

YAMLで書かれた個人情報データファイルと、YAMLもしくは独自テキストで書かれたスタイルファイルを食わせると、履歴書PDFファイルが作成されます。

たとえば、こんなデータファイルを用意します(抜粋)。

data.yaml
# 名前等
date: 2018年 6月 5日現在
name_kana: りれきしょ かくたろう
name: 履歴書 書太郎
birth_day: 1543年1月31日 (満 73 歳)
gender: 
cell_phone: 090-1234-5678
email: hoge@hogehoge.org
photo: photo.jpg

# 住所
address_kana: とうきょうとちよだくちよだ
address: 東京都千代田区千代田1-1-1
address_zip: 100-0001
tel: 0120-000-XXX
fax: 0120-111-XXX
# 連絡先
address_kana2: ほっかいどう わっかないし そうやみさき
address2: 北海道稚内市宗谷岬
address_zip2: 098-6758
tel2: 0120-222-XXX
fax2: 0120-333-XXX

スタイルファイルはこんな感じです(抜粋)。

style.txt
# ヘッダー
string,5mm,247mm,履 歴 書,font_size=14,font_face=gothic
string,110mm,245mm,$date,font_size=9

# 住所・連絡先等
box,145mm,204mm,30mm,40mm,line_style=dashed
string,148mm,240mm,写真を貼る位置,font_size=9
string,147mm,233mm,1. 縦36〜40 mm,font_size=8
string,150mm,230mm,横24〜30 mm,font_size=8
string,147mm,227mm,2. 本人単身胸から上,font_size=8
string,147mm,224mm,3. 裏面にのりづけ,font_size=8
string,147mm,221mm,4. 裏面に氏名記入,font_size=8

これを

$ ruby make_cv -i data.yaml -s style.txt -o output.pdf

みたいに、データとスタイルを一緒にスクリプトに食わせると、こんな出力が得られます(実行にはPrawnとIPAexフォントが必要です)。

output1.png

output2.png

スタイルファイルを変えれば、別のタイプの履歴書も作れます。たとえばアカデミック向けに用意したスタイルacademic.txtを食わせます。

$ ruby make_cv -i data.yaml -s academic.txt -o academic.pdf

するとこんな出力になります。

academic1.png

academic2.png

同じデータに別のスタイルファイルを組み合わせて、別の履歴書ができたのがわかるかと思います。

スタイルへのデータの適用

履歴書に限りませんが、データとスタイルは分離していて欲しいものです。また、データはスクリプトから加工しやすい形が望ましいですね。LaTeX+スタイルファイルでも一応データとスタイルは分離していますが、データが使いやすい形になっていません。また、データをデータベースのように使い、一部だけ使う、もしくは一部を使わない、という形にするのもLaTeXベースだと(できなくはありませんが)面倒です。

というわけで、データ、スタイルともにもう少し使いやすいファイルフォーマットでなんとかすることにしましょう。

とりあえずデータはスクリプトから使いやすければどんな形式でも良いので、今回はYAMLを採用しました。PDFの出力はPrawnを使います。PrawnはローレベルなPDF writerで、基本的になんでもできます。データがYAMLなので、スタイルファイルもYAMLを採用しました。

とりあえず、スタイルファイルとしては

  • 任意の場所に任意のフォントで文字列を出力
  • 任意の場所に線を引く
  • 任意の場所にテキストボックスを置く

みたいなことができればよいわけですね。たとえば線の描画なら

- type: line
  x: 50
  y: 50
  dx: 100
  dy: 0

みたいにしたら、座標(50, 50)から横に100の直線が描画されて欲しいわけです。Prawnを使えば簡単で、

doc = Prawn::Document.new(:page_size => "A4")
doc.move_to(x, y)
doc.line_to(x + dx, y + dy)
doc.stroke

みたいにすれば線が書けます。あとは最後に

doc.render_file "output.pdf"

とすれば、A4のPDFファイルが得られます。入力のYAMLから座標を取り出すのは簡単だと思います。

さて、文字列も同様に

- type: string
  x: 5mm
  y: 247mm
  value: 履 歴 書
  font_size: '14'
  font_face: gothic

みたいに書いて、それをそのままPDFに出力するのは簡単です。

さて、これで枠などは描けるわけですが、データファイルからデータを読み込んでそれを出力してやる必要があります。いろんな方法があると思いますが、ここでは単純な文字列置換を採用しました。

たとえばデータとして

name: 履歴書 書太郎

と与えられている時、スタイルファイルに

- type: string
  x: 30mm
  y: 231mm
  value: "$name"
  font_size: '14'

とあったら、

- type: string
  x: 30mm
  y: 231mm
  value: 履歴書 書太郎
  font_size: '14'

に展開することにします。これでスタイルファイルにあらかじめ$hogeの形でいろいろ書いておき、データファイルでは対応するレコードをhoge: valueの形で与えることで、データをスタイルファイルに適用することができます。

サイズについて

普通にPrawnに数値を渡すとピクセル単位になりますが、それで罫線を引くのは面倒です。そんなわけで、長さの単位としてmmやcmを使えるようにしましょう。公式な記述を見つけたわけではないのですが、PrawnのデフォルトのDPIは75のようです。1インチは25.4mmなので、mmからピクセル値への変換は

DPI = 75
def mm2pixel(x)
  x/25.4 * DPI
end

のように書けます。あとはがんばって定規で測ってスタイルファイルをごりごり書いて行くだけです。

スタイルファイルのフォーマット

データがYAMLなので、スタイルファイルもYAMLにするのが自然かな、と思ったのですが、実際に書いてみて発狂しそうになりました。線ひとつ引くのも

- type: line
  x: '0'
  y: 233mm
  dx: 139mm
  dy: '0'
  line_style: dashed

とか書かないといけなくて面倒でしかたないです。また、ちょっと場所を調整するために数本の線を移動させるのに、行をいったりきたりしなければならなくて本当に面倒です。

そんなわけで、一行一要素の独自形式を作りました。さっきのはこんな感じに書けます。

line,0,233mm,139mm,0,line_style=dashed

引数の順番に、それぞれx, y, dx, dyに対応しています。独自形式だしYAMLに比べてフレキシビリティもないし、だいぶ後退したような気がしなくもありませんが、

line,0,233mm,139mm,0,line_style=dashed
string,2mm,238mm,ふりがな,font_size=9
string,30mm,238mm,$name_kana,font_size=9
string,2mm,231mm,氏  名,font_size=9
string,30mm,231mm,$name,font_size=14
line,0,218mm,139mm,0mm
line,15mm,218mm,0,-13mm

みたいに複数の要素をぱっと一望できるので、こっちのほうがスタイルを書くのが断然楽です。それでもわりと面倒で、あやうくGUIツールを作るところでした。内部的にはYAMLに変換して読み込んでいます。また、リポジトリにtxt2yaml.rbyaml2txt.rbという相互変換スクリプトも用意してあります1

linestringといったそれぞれの命令についてはGitHubリポジトリの説明を参照してください。

まとめ

Ruby+PrawnでYAMLファイルから履歴書PDFを作るスクリプトを作ってみました。JavaScriptとか使った方がウェブサービスとかとの相性が良い気がしますが、まぁローカルで運用するつもりなのでこれでよいことにします。

しかし、履歴書ってどうしてあんなに使いづらい形になっているんですかね。「JIS規格準拠」とかあるので、規格でちゃんと決まってるのかと思ってたら、なんかすごくふわっとしか決まってないらしくって「JIS規格準拠」の履歴書でもかなり揺らぎがあります。具体的にはサイズはもちろん記述内容も違ったりします。仕方ないので適当な履歴書テンプレートを印刷して定規でサイズを測りまくりました。コーディングよりもそこに時間がかかりました。なんやねん。

もっと言えば履歴書にわざわざ

数字はアラビア数字で、文字はくずさず正確に書く。

とか書いてあって大きなお世話感が半端ないんですけど、あれなんですのん?

そもそも紙の履歴書ってまだ必要なんですかね?アルバイトとかはもうウェブからの登録がほとんどじゃないんでしょうか?あと、採用担当の人ってアルバイトの志望動機とかちゃんと読んでるんですか?

まぁ、履歴書は一度書いてしまえば使いまわしができるのであれなのですが、たまにわざわざ「機関独自の履歴書フォーマット」をエクセル方眼紙的なもので用意してくださっているところがあって、本当にやめて欲しいと思いました。

このスクリプトが皆さんの「面倒臭さ」を少しでも軽減できれば幸いです。


  1. まぁこのスクリプト用のスタイルファイルを書くような奇特な人なんていないでしょうが・・・