adbird(広告鳥) 備忘録

Ubuntuで年賀状の宛名作成 csvで住所録編集 2020年版

最終更新:2020年11月18日 18:40。cssスクリプト修正。csvで差出人の姓と名を分けて入力するように変更。

Ubuntuフォーラムに投稿したnenga.cssやmakenenga.shの内容、csvの1行目の項目(差出人の姓と名を分けて入力するようにした)に若干の変更を加えていますので、ご注意ください。
ファイル作成やスクリプト実行の手順に変化はありません。


LinuxUbuntu)でも簡単に年賀状の宛名作成をする方法です。

LibreOfficeのCalcを用いて宛名データ(csv)を作成して、スクリプトでhtml、pdfに変換する、という方法です。

動作確認の環境はUbuntu18.04です。

手っ取り早く試してみたい人は、諸々インストール(IPAmj明朝・IPAexフォント、perlGoogle Chromeをインストール)したら、 年賀宛名from-csv.zip をダウンロードして、展開(zipファイル上で右クリック>ここで展開する)後、「一度保存した宛名.csvを開く場合」のところまで読み飛ばしてください。


IPAmj明朝フォント・IPAexフォント、perlGoogle Chromeをインストール

一度インストールすれば、次年度からは改めてインストールする必要はない。

人名の様々な異体字が使えるIPAmj明朝フォントと、郵便番号でIPAexゴシックを使う。フォントを変更したい場合、後述のnenga.cssの該当箇所を修正する。

ヘッドレスChromeでPDFを生成するのでChromeが必要。

Ubuntu18.04ではChrome以外はレポジトリに入っているので、端末を開いて以下のコマンドを1行ずつ入力(以下を1行ずつコピペ)して、エンターキーを押して、インストールする(行頭の「$」は入力する必要はない。以下、同様。)。

$ sudo apt install fonts-ipamj-mincho
$ sudo apt install fonts-ipaexfont
$ sudo apt install perl

パスワード入力を求められるので入力。パスワード入力中は端末上に何も表示されないけど、ちゃんと入力されているので心配しないように。入力時には半角英数字入力になっていることをちゃんと確認すること。

将来、フォントやソフトののレポジトリ登録名が変わるなどして、上記コマンドで見つからないときは、

$ apt search ipamj

などで検索。

Google Chrome は公式サイトに行って、「Chromeをダウンロード」をクリックするとダウンロードできる。

フォルダ構成

年賀宛名from-csvフォルダ(フォルダ名は任意)を作って以下のように設定ファイル等を置いていく。

年賀宛名from-csv (フォルダ名は任意)
 ├── makenenga.sh
 ├── nenga.css
 └── 宛名.csv  (ファイル名は任意)

設定ファイル・スクリプトファイル

以下の手順で設定ファイル・スクリプトファイルを作成すればいいのだけれど、面倒くさいという人は 年賀宛名from-csv.zip をダウンロードして、展開後、「一度保存した宛名.csvを開く場合」のところまで読み飛ばしてください。

nenga.css

テキストエディタを開いて、以下の内容をnenga.cssとして保存。ハガキの版面調整(郵便番号や宛名、住所等の位置など)やフォント変更をする場合はこれを修正する。

@page {size:100mm 148mm; margin:0; padding:0;}

body {margin: 0; padding:0;}

.sheet {
    width:100mm; height:148mm;
    margin: 0;
    padding:0;
    position: relative;
    page-break-after: always;
}

#title-block-header{
    display:none;
}

p{
    margin:0;
    padding:0;
    font-family:"IPAmj明朝"; 
}

.郵便番号 {
    font-family:"IPAexゴシック";
    font-style: normal;
    font-weight: normal;
    letter-spacing: 4.4mm; /*数字の間隔 IPAexゴシック使用時で調整している。フォントを変えた場合は要調整。*/
    font-size:13pt;
    margin:0;
    padding:0;
    position:absolute; top:13mm; left:46mm; /*上部および左からの位置。ズレる場合は要調整。*/
}

.住所 {
    font-family: "IPAmj明朝"; /*フォント*/
    font-size:14pt;
    margin-left:0px;
    padding-top:0px;
    line-height:1.5em;
    letter-spacing:2pt;
    writing-mode: vertical-rl;
    -webkit-writing-mode: vertical-rl;
    text-orientation: upright;
    -webkit-text-orientation: upright;
    position:absolute; top:30mm; right:7mm; /*上部および右からの位置*/
}

.宛名 {
    position: absolute;
    top: 30%;               /*上部から位置*/
    left: 52%;              /*左からの位置*/
    -webkit-transform: translateY(-10%) translateX(-50%);
    transform: translateY(-10%) translateX(-50%);
    writing-mode: vertical-rl;
    -webkit-writing-mode: vertical-rl;
    text-orientation: upright;
    -webkit-text-orientation: upright;
}

.姓 {
    display : inline-block; 
    font-family:"IPAmj明朝"; /*フォント*/
    font-size:22pt; 
    line-height:1.3em;      /*.名のline-heightの値と同じにする*/
    letter-spacing: 0.4em;  /*文字間隔*/
}

.名 {
    display : inline-block; 
    /* vertical-align: -webkit-baseline-middle;  /*連名時、姓を中央寄せにするときはこちら。*/
    vertical-align: top;                         /*連名時、姓を右寄せにするときはこちら。*/
    font-family:"IPAmj明朝"; /*フォント*/
    font-size:22pt; 
    margin-top:0.6em;       /*姓と名のスペース*/
    letter-spacing: 0.4em;  /*文字間隔*/
    line-height:1.3em;      /*連名時の行間*/
}

.敬称 {padding: 0.5em;}     /*名前と敬称の間の調整*/


.差出人住所氏名 {
    position:absolute; top:70mm; left:8.5mm; /*上部および左からの位置。*/
    writing-mode: vertical-rl;
    -webkit-writing-mode: vertical-rl;
    text-orientation: upright;
    -webkit-text-orientation: upright;
}

.差出人住所 {
    font-family:"IPAmj明朝"; /*フォント*/
    font-size:10pt; 
    margin:0;
    padding-left:0.8em;  /*差出人との間*/
    line-height:1.2;
}

.差出人姓{
    display : inline-block; 
    font-family:"IPAmj明朝"; /*フォント*/
    font-size:14pt; 
    line-height:1.2em;      /*.差出人名のline-heightの値と同じにする*/
    letter-spacing: 0.4em;  /*文字間隔*/
    padding-top:0.5em;      /*字下げ*/
    }
.差出人名{
    display : inline-block; 
    /* vertical-align: -webkit-baseline-middle;  /*連名時、姓を中央寄せにするときはこちら。*/
    vertical-align: top;                         /*連名時、姓を右寄せにするときはこちら。*/
    font-family:"IPAmj明朝"; /*フォント*/
    font-size:14pt; 
    margin-top:0.6em;       /*姓と名のスペース*/
    letter-spacing: 0.4em;  /*文字間隔*/
    line-height:1.2em;      /*連名時の行間*/
    }

.差出人郵便番号{
    font-size:10pt;
    font-family:"IPAmj明朝"; /* IPAmj明朝で文字間隔等を調整している */
    margin:0;
    padding:0;
    position:absolute; top:124mm; left:6mm; /*上部および左からの位置。ズレる場合は調整*/
    letter-spacing: 2mm;                   /* 文字の間隔 */
}

/*数字の縦中横はイマイチな感じなので保留*/
.縦中横 {
    text-combine-upright: all;
    vertical-align: middle;
}

/** For screen preview **/
@media screen {
    body { background: #e0e0e0 }
    .sheet {
    background: white;
    box-shadow: 0 .5mm 2mm rgba(0,0,0,.3);
    margin: 5mm;
    }
}

@media print {
  body {
    margin: 0;
    padding:0;
    width:100mm; height:148mm; /* needed for Chrome */
    }
}

makenenga.sh

同様に、以下の内容をmakenenga.shとして保存。

#!/bin/sh

sed -e '1d' -e '/^[xX]/d' $1.csv | \
awk -F ";" \
'{print \
$1 "<section class=\"sheet\">\n<p class=\"郵便番号\">" \
$11 "</p>\n<p class=\"住所\">" \
$12 "<br />" \
$13 "</p>\n<div class=\"宛名\">\n<p class=\"姓\">" \
$2 "</p><p class=\"名\">" \
$3 "<span class=\"敬称\">" \
$4 "</span><br />" \
$5 "<span class=\"敬称\">" \
$6 "</span><br />" \
$7 "<span class=\"敬称\">" \
$8 "</span><br />" \
$9 "<span class=\"敬称\">" \
$10 "</span><br /></p>\n</div>\n<div class=\"差出人住所氏名\">\n<p class=\"差出人住所\">" \
$18 "<br />" \
$19 "</p>\n<p class=\"差出人姓\">" \
$14 "</p><p class=\"差出人名\">" \
$15 "<br />" \
$16 "</p>\n</div>\n<p class=\"差出人郵便番号\">" \
$17 "</p>\n</section>\n"}' | \
sed \
-e 's/<br \/><span class=\"敬称\"><\/span>//g' \
-e 's/<br \/><\/p>/<\/p>/g' \
-e '/<p class=\"名\"><span class=\"敬称\"><\/span><\/p>/d' \
-e '/別姓/s/<span class=\"敬称\"><\/span><br \/>/<\/p><p class=\"名\">/g' \
-e 's/<\/span><br \/>別姓=/<\/span><\/p>\n<br \/>\n<p class=\"姓\">/g' \
-e '/住所/y/-−ー*/―――*/' \
-e '/郵便番号/s/[-−ー]//g' > filein01.txt

#住所の数字を漢数字に変えたい時は以下の行頭の「#」を消して、上書き保存。
#sed -i -e '/住所/y/1234567890*/一二三四五六七八九〇*/' filein01.txt
#sed -i -e '/住所/y/1234567890*/一二三四五六七八九〇*/' filein01.txt

perl -e '
    print "<!DOCTYPE html>\n";
    print "<html lang=\"ja\">\n";
    print "<head>\n";
    print "<meta charset=\"UTF-8\">\n";
    print "<link rel=\"stylesheet\" href=\"nenga.css\" type=\"text\/css\">\n";
    print "<title>年賀状 宛名<\/title>\n";
    print "<\/head>\n";
    print "<body>\n";
    open(RDFILE, "< filein01.txt");
    while(<RDFILE>){ print $_; }
    close(RDFILE);
    print "<\/body>\n";
    print "<\/html>\n";
' > `date +%Y%m%d_$1年賀状`.html

#PDF出力
google-chrome --headless --print-to-pdf=`date +%Y%m%d_$1年賀状`.pdf `date +%Y%m%d_$1年賀状`.html

#中間ファイル削除
rm -f filein01.txt

宛名データ(宛名.csv)を作成する

新規作成

LibreOfficeのCalcで、表計算ドキュメントを新規作成。

一行目を

| 出さない=x | 姓 | 名 | 敬称 | 連名 | 敬称 | 連名 | 敬称 | 連名 | 敬称 | 郵便番号 | 住所 | 住所2 | 差出人(姓) | 差出人(名) | 差出人連名 | 差出人郵便番号 | 差出人住所 | 住所2 |

にする。

書き方はこの画像を参考に。 f:id:adbird:20201118183956p:plain

郵便番号は - (ハイフン)があってもなくてもどちらもでいい。
夫婦別姓の場合、2人目をE列:連名に「別姓=○○」と姓を書き、F列:敬称は空欄に、そして、G列:連名に名(下の名前)を書く。

既存の住所録がエクセル等で手元にある人はデータをそれぞれの列にコピペしていくといい。

保存は「宛名.csv」(ファイル名は任意)と拡張子を「.csv」にする。

新規保存の時だけ「テキストファイルのエクスポート」のウィンドウがポップアップされるので、

f:id:adbird:20201114103508p:plain

にして、保存する。

一度保存した宛名.csvを開く場合

一度保存した宛名.csvLibreOfficeのCalcで開くと、「テキストのインポート」のウインドウがポップアップされるので、

f:id:adbird:20201114103526p:plain

にして、OKボタンで開く。

編集後、保存し直す時に、ODF表計算ドキュメント形式(.ods)で保存するかどうか聞かれるが、必ずcsvで保存する。

スクリプト実行・PDFファイル生成

年賀宛名from-csvフォルダ内の構成が次の通りになっていることを確認。

年賀宛名from-csv(フォルダ名は任意)
 ├── makenenga.sh
 ├── nenga.css
 └── 宛名.csv

年賀宛名from-csvフォルダ内で、右クリック>端末で開く で、端末を開いて、以下を実行。

$ sh makenenga.sh 宛名

宛名データのファイル名(ここでは 宛名.csv)を入力するときは、拡張子(.csv)はいらないので注意。

ヘッドレスChromeの処理?でエラーが表示されることもあるけど、ちゃんとPDFは生成されているはず。エラーが気になるようなら、端末で「↑」キーを押すと入力履歴が出るので、エラーが出なくなるまで何度か実行する。

ハガキの版面調整(郵便番号や宛名、住所等の位置など)をする場合は、nenga.cssテキストエディタで開いて修正する。

次年度からは宛名データ(宛名.csv)を編集して、上記スクリプトを実行するだけ。

完成イメージ

f:id:adbird:20201117000457p:plain

PDF印刷設定

プリンタによって少々変わってくると思うけど、Ubuntu標準のドキュメント・ビューアでPDFを印刷するときは次の画像のような設定にしたほうがいいと思う。

f:id:adbird:20201116225759p:plain f:id:adbird:20201116225812p:plain