Perl: 2014年5月アーカイブ

20140517_pdf1.jpg


とりあえず、1枚印刷するだけの機能は出来たので、あとはこれを元に複数ページ作成に対応させるだけ。

しかし、位置指定が全部ピクセル指定なのは思ったより大変だな。

つーか、人間としてはミリ指定しかできんからな。(そりゃ 72dpi だから、25.4mm の中に72個ドットが存在するという前提で「5.7ピクセル(約 2mm)左に寄せるか」みたいな思考ができる変質者も中にはいるだろうけど(笑))

なので、

sub mm2px {
#==========================
# ミリをピクセルに変換(72dpi前提)
#==========================

my $mm = $_[0];
my $px = $mm / 25.4 * 72;
return $px;

}

sub px2mm {
#==========================
# ピクセルをミリに変換(72dpi前提)
#==========================

my $px = $_[0];
my $mm = $px / 72 * 25.4;
return $mm;

}

みたいな関数作って、相互に変換しまくりながらロジック組んだよ(笑)

例えば、「14ピクセルずらしたら、名前表示開始位置の 50mm を超えないか」とか。
if (($pos_mm + &px2mm(14)) > 50) みたいな感じで。

いや、住所が長くて2行になれば、当然後ろの項目の表示位置もずらしていくことになるから、そんな計算ばかりしてるプログラムになった(^^;

ま、なんとか上手くレイアウト出来たので、次のステップへ(笑)

住所データを渡して、ハガキ印刷用の PDF を作成するプログラムを作っているのでメモ。
環境は、以前「Perl で PDF 文書を作成してみた」で書いたように、Perl + PDF::API2 モジュールの組み合わせ。

まずは、郵便番号の位置調整。
注意点は、

    • 表示位置の起点は書類の左下。(なんで左上じゃないの?(^^;)
    • 位置指定の単位は解像度 72DPI時のピクセル数(ドット数)。ミリメートルからの変換要。
    • フォントで cjkfont(モジュールに内包されているCJK統合漢字フォント?)を指定すると、オプションに文字間隔がない。

といったところか。

cjkfont で文字間隔が調整出来ないのは痛いな。やっぱ、ちゃんと郵便番号は枠内に入れたいからな。
普通にセットしちゃうとこんな感じ。完全に枠から出ちゃう。

20140516_pdf1.jpg

均等割付のレイアウトがあればいいんだが、どうもそういうのはなさげ(あったら教えてください>識者の方)

そこで、郵便番号については、一旦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;
}

こんな感じ。

20140516_pdf2.jpg

表示位置は、基点が「左上」ではなく「左下」なのと、そのためフォントのセット開始位置も、文字の左側と下側の値を与えてやる。特に、文字の下側を表示開始の基点にしするというのはかなり違和感がある。

例えばハガキの郵便番号欄は、左から 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ずつ右にずらしている。

とりあえず、これで枠内には収まったので、郵便番号はこれでいいかな。

このアーカイブについて

このページには、2014年5月以降に書かれたブログ記事のうちPerlカテゴリに属しているものが含まれています。

前のアーカイブはPerl: 2014年4月です。

次のアーカイブはPerl: 2014年10月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら