仕事を頼まれた

今日は、id:hms_hermesの手を煩わせないようにと、
早めに仕事を終わって、できるだけ急いで家に帰った。

ROOT言語が勉強したくてたまらない。というか、
解析がしたかったのであるが。要するに、ノイズが、telnet起因なのか、
DDNS起因なのかの原因の切り分けがしたかった。

うまいこと、21:00に家につくことができた。
勝利。
基本的に21:00までに家に着くと、色々なことができるのである。
会社時代は、逆に21:00に帰った日なんて、何をしていいものやら、
困ったもんだが。月一回くらいしかなかったし。

と思ったら、父上が、私の名前をゆっくりと呼ぶ。
こういうときは、何か頼みごとがあるときしかない。

果たして、「会員名簿を封筒にラベルシールで貼り付けて送りたい。
エクセルのデータを切り張りすればよいが、200人以上いるので、面倒。
フリーソフトを見たけど、こちらで管理しているID番号も、シールに含めるなど、
独自仕様にしたい、名前も文字を大きくする。」

と、かなり詳細な仕様を言ってきた。

あ、それ、私も非常に欲しかったソフト。今は、情報教育の研究員を兼ねて仕事をしている。
で、グループリーダーをさせていただいている。ちょっと卑屈気味。
あまり好んでなったわけではない。でも、一応仕事として与えられたので、
やっている。で、結構封筒で逓送便を出すことが多いので、そういうことができたら便利
だなー。と。ぶっちゃけた話、ワードでちまちま打つのがだるいので、いつも手書きなのだ。
で、それを自動化するソフトがあったらなぁ。と思ってなかったので放置だった。
だったら自分で作っちゃえ。

当然、印刷のプログラムなぞ、
組んだことはなかったので、
「あ、じゃあCでCSVを読み取って、TeX出力させて、それをPDFに変換する方法でいい?」
と確認した。結果、
「困る。この名簿、何年かしたら他の人の当番になると思う」

あ、じゃあJavaもダメなのか。

これは困った。で、仕方ないので、印刷プログラムを本を総動員して作ってみた。
最初、SDKで作ったが、どうしてもPRINTSTRUCTがないと怒られる。
仕方ないのでMFCで作る。
途中で確認した結果、私のプリンタでは寸法がぴったり印刷できたが、
父上のプリンタだと、なんと寸法が変わっていたのだ。

もう無理。と思い、別の方法を考えた。
じゃあ、これはもうプログラムからPDFを生成するしかない。と思い、
ライブラリを探す。javaだったらHobbitsPDFLibを使うのになぁ。

で、ライブラリが多そうなPDFlibにしようと思ったが、
全く使い物にならない。広告でかすぎ。

というわけでclibpdfを使ってみることにした。
しかし、これはどうやって使うんだ?
とりあえずライブラリを、ビルドして作り上げる。
http://homepage3.nifty.com/~masumoto/clibpdf/
が非常に役にたった。

しかし、日本語が出力されることを確認するだけで終わっている。
線も書きたいのであるが・・・。
こまったのでマニュアル(英語)や、サンプルプログラム(英語)を
読みまくる。おかげで気持ち悪くなった。

何回も試行錯誤を重ねまくり、だんだんclibpdfの仕様が分かってきた。
なんというか、こういうライブラリ関係は、流派(お約束)みたいなものが合って、
それの思想というのをプログラムから読み取れるようになれば、
あとは、そのライブラリに関してだけは、さくさくわかるのである。

忘れんうちに仕様も書いておこう。

日本語の文字列出力
int do_Paragraph(CPDFdoc *pdf, float *x, float *y, float ybump, int alignmode, float fontsize,
const char *font, const char *encoding, const char *paragraph)
pdf 実体
*x x座標へのポインタ
*y y座標へのポインタ
ybump 行間
alignmode 詳しくはヘッダ参照。書いてある。
fontsize デフォルトは11
font フォントの形式
encoding 90ms-RKSJ-Hにしておけ。
paragraph
配列ごとに行頭にしてくれる。シフトJISしか受け付けない。

四角形描画
cpdf_rect(CPDFdoc *pdf, int x1, int x2, int y1, int y2)
これは見たらわかるでしょう。

これで、センチメートル系になる。
cpdf_setDefaultDomainUnit(pdf, POINTSPERCM);

これで、日本向けのA4版になる。
cpdf_pageInit(pdf, 1, PORTRAIT, A4, A4); /* orientation and size. It's A4 in Japan */


これでストローク。cpdf_eofillAndStroke(pdf );とセットにする必要がある。