YAMLで履歴書を作る

# はじめに

履歴書、書いてますか？＞挨拶

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

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

https://github.com/kaityo256/yaml_cv

(2020年7月19日追記)

2020年7月17日付で、[日本規格協会グループ](https://www.jsa.or.jp/)は、JIS Z 8303『帳票の設計基準』に掲載されていた「履歴書」の様式例を削除しました。2020年7月19日現在は「[お知らせ](https://www.jsa.or.jp/news)」に記載されていますが、パーマネントリンクが無いようなので、そのうち消えるかもしれません。お知らせによると、もともとJIS Z 8303は帳票の仕上げ寸法等を規定するものであり、個々の帳票の様式を規定するものではなかった、とのことです。つまり、履歴書の様式は、あくまで「例」として掲載されていたもので、JISで規定されていたものではなかったということです。これにより、このスクリプトは役目を終えたことになります。良かったと安心しています。


(2019年2月6日追記)

YAMLで履歴書を作る環境をDocker化してくださった方がいらっしゃいます。そちらを使えばRubyやフォントのインストールが必要ないので楽ちんです。

[YAML で履歴書を作るを Docker 環境でやってみた](https://ikasamak503.hatenablog.com/entry/make-resume-by-yaml-with-docker)
https://github.com/ikasam/docker-yaml_cv

(2019年6月27日追記)

YAMLで履歴書を作るマイクロサービスを作ってくださった方がいらっしゃいます。これを使えば環境設定はまったく不要で、ブラウザだけで履歴書が作れてもっと楽ちんです。

[「YAMLで履歴書を作る」をDockerでマイクロサービス化しました](https://qiita.com/jerrywdlee/items/d0c36549136211937473)
DEMO [https://yaml-2-resume.herokuapp.com/](https://yaml-2-resume.herokuapp.com/)
GitHub: [https://github.com/jerrywdlee/yaml_2_resume](https://github.com/jerrywdlee/yaml_2_resume)

# 何ができるか

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

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

```YAML: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
```

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

```text: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
```

これを

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

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

![output1.png](https://qiita-image-store.s3.amazonaws.com/0/79744/32cb28bd-0d96-45cd-d46d-bc1bb5a6b9b6.png)

![output2.png](https://qiita-image-store.s3.amazonaws.com/0/79744/bebcfc2c-8dd1-8df5-9414-c6e4fbca5874.png)

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

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

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

![academic1.png](https://qiita-image-store.s3.amazonaws.com/0/79744/0560e463-ee07-444c-8e27-4d3dd4e0173a.png)

![academic2.png](https://qiita-image-store.s3.amazonaws.com/0/79744/a4f60ff6-a6b0-41ef-789a-53b53a289f31.png)

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

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

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

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

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

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

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

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

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

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

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

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

```rb
doc.render_file "output.pdf"
```

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

さて、文字列も同様に

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

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

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

たとえばデータとして

```yaml
name: 履歴書 書太郎
```

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

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

とあったら、

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

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

# サイズについて

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

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

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

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

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

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

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

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

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

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

```text
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.rb`と`yaml2txt.rb`という相互変換スクリプトも用意してあります[^1]。

`line`や`string`といったそれぞれの命令については[GitHubリポジトリの説明](https://github.com/kaityo256/yaml_cv/blob/master/README.md)を参照してください。

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

# まとめ

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

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

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

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

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

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

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

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