住所データを渡して、ハガキ印刷用の PDF を作成するプログラムを作っているのでメモ。
まずは、郵便番号の位置調整。
注意点は、
- 表示位置の起点は書類の左下。(なんで左上じゃないの?(^^;)
- 位置指定の単位は解像度 72DPI時のピクセル数(ドット数)。ミリメートルからの変換要。
- フォントで cjkfont(モジュールに内包されているCJK統合漢字フォント?)を指定すると、オプションに文字間隔がない。
といったところか。
cjkfont で文字間隔が調整出来ないのは痛いな。やっぱ、ちゃんと郵便番号は枠内に入れたいからな。
普通にセットしちゃうとこんな感じ。完全に枠から出ちゃう。
均等割付のレイアウトがあればいいんだが、どうもそういうのはなさげ(あったら教えてください>識者の方)
そこで、郵便番号については、一旦1桁ずつに分解し、位置を調整しながら1桁ずつ貼り付けていくようにする。
$page->mediabox(&mm2px(100), &mm2px(148)); # ハガキサイズ(100mm x 148mm)
my $font2 = $pdf->cjkfont("KozGo"); # 日本語ゴシック
# 郵便番号 742-0301 の処理
# 郵便番号1(3桁)
my @post1 = split //, '742'; # 3文字にバラす
my $text = $page->text();
$text->font($font2, 20);
for (my $i = 0; $i < 3; $i++) {
$text->translate(&mm2px(45.5 + ($i * 7.0)), &mm2px(148 - 18.5));
$text->text($post1[$i]);
}
# 郵便番号2(4桁)
my @post2 = split //, '0301'; # 4文字にバラす
$text = $page->text();
$text->font($font2, 20);
for (my $i = 0; $i < 4; $i++) {
$text->translate(&mm2px(67 + ($i * 6.7)), &mm2px(148 - 18.5));
$text->text($post2[$i]);
}
sub mm2pt {
# ミリを 72DPI 時のピクセル数に変換
my $mm = $_[0];
my $px = $mm / 25.4 * 72;
return $px;
}
こんな感じ。
表示位置は、基点が「左上」ではなく「左下」なのと、そのためフォントのセット開始位置も、文字の左側と下側の値を与えてやる。特に、文字の下側を表示開始の基点にしするというのはかなり違和感がある。
例えばハガキの郵便番号欄は、左から 44mm、上から 11.5mmくらいのところから始まるが、では、枠内に数字を書くために「左 45.5mm、上から 13mm から書き出す」と指定すると、実際には 上から 13mm のところに「文字の下側」が当たるので、郵便番号はほとんどが郵便枠の上側にはみ出して表示される。
だから、Y軸側は 13mmではなく、18.5mmから書くよう指示しているのだ。
ちなみに、実際にはハガキの下からの距離を PDF::API2 には渡してやらないといけないので、上から 18.5mm のところを指定したければ、正しくは 129.5mm を指定しないといけない。
これは、ハガキの高さ(148mm)から、上から数えた開始位置を引いたものだ。
プログラム内では(148 - 18.5)としてから mm2px でピクセル値に変換している。
で、最初の3桁は1文字 7.0mm ずつずらして表示、後の4桁は(枠が細い分だけ字間が狭くなっているので)6.7mmずつ右にずらしている。
とりあえず、これで枠内には収まったので、郵便番号はこれでいいかな。