葉書に宛名書き 1月8日, 2021

1 連絡先.appから書き出したvcfファイルや,所定フォーマットのcsvファイルを指定すると,
2 必要なデータをリストに組み立てて,
3 郵便番号は枠位置に合わせ,住所・氏名は横書きで,指定したプリンターに印刷する。
「葉書AB」が使えなくなってからは,あれこれ色々な方法で葉書の宛名を印刷してきた。でもどうもこれという決定版に出会えずにいた。自分用の宛名印字ソフトがないだろうか。住所・氏名の縦書きには全く拘りが無いので,なんとか気にいった宛名ソフトをみつけたい。できたらpythonでプリントする方法をみつけたい,と工夫してみた。やはり横書きが楽。
条件は,
- ▶郵便番号は番号枠に納めたい
- ▶全てをpythonでまとめたい
- ▶入力はvcfでもcsvでもよい
- ▶vcfはBig Surの連絡先.appの出力によっている
- ▶csvのカラムは,姓・名・郵便番号・住所・連名の5つがこの順で並ぶこと
- ▶住所・氏名は横書きする
- ▶連名を1名許容する
- ▶出力先のプリンターは使い慣れたカラーのもの
使用フォントは源真ゴシック。他のものでも勿論OKで,スクリプト冒頭にそのパス(PATH_TO_FONTS)を具体的に指定する。また,作業用ディレクトリを指定することでデバッグし易くなるので,それ(PATH_TO_WORK)も便利な場所を指定する。
全体の流れはスクリプトを見れば明瞭だが,一応要約しておくと,指定されたvcfファイル,csvファイルの中身を順にリストに書き出す(readvcf(), readcsv())。その1件をReportLabモジュールで葉書サイズのPDFページに配置し(mk1PDF()),それを繰り返して複数ページをまとめ(combine()),プリンターに出力する。過程で使用したファイルは見栄えよく,消去している。
工夫した点は,郵便番号枠に合わせるために,textobject.setCharSpace()の数値を0.2mm間隔で広げてみて適当そうな値を探したことだろうか。我が環境では,ピッタリ納まる。使用した葉書のフォーマットにより,もしズレるようなら,setTextOriginの数値などを変えて試してみることかな。ここではKOKUYO-KJ-A2630で設定している。数値は左下隅が原点。
なお,連絡先.appに登録する際,長くなりそうな住所には,改行したい場所1箇所に半角スペースを挿入しておく。出力例では「半蔵門マンション」の前にその処置がしてある。2箇所で改行するのは一応許されない仕様となっている(修整は簡単)。住所の改行箇所に自信が無い場合,スクリプトが「Printer 準備 OK?」と聞いてきた時に停止させればよい。PATH_TO_WORKに指定した場所に "combined.pdf" が出力されているので,それを確認する。ちょっと手工業的だけど充分役に立つ。
また,使用するプリンターは当然こことは異なるだろう。その場合,’lpstat -s’で表示される登録済みプリンターのリストを勘案して工夫すれば,多分うまくいくはず。

【update】 12月21日, 2023 久し振りに動かしたところ、
「〜 is deprecated and was removed in PyPDF2 3.0.0. Use 〜 instead.」とのこと。
関数"combine()"につき、下記4個所を修正。
- pdf_writer = PyPDF2.PdfFileWriter()
+ pdf_writer = PyPDF2.PdfWriter()
- pdf_reader = PyPDF2.PdfFileReader(pdf_file_obj)
+ pdf_reader = PyPDF2.PdfReader(pdf_file_obj)
- page_obj = pdf_reader.getPage(0)
+ page_obj = pdf_reader.pages[0]
- pdf_writer.addPage(page_obj)
+ pdf_writer.add_page(page_obj)