adbird(広告鳥) 備忘録

Ubuntuで年賀状の宛名作成 2020年版

LibreOffice Calc のデフォルトのオープンドキュメント形式(.ods)での住所録作成編集ができるようになった新しい方法の記事を書きました。

Ubuntuで年賀状の宛名作成 2022年版 - adbird(広告鳥) 備忘録

↑上記の2022年版の記事のほうを強く勧めます。下記の方法より住所録の作成編集が楽になります。


注意:この投稿の方法では、連名を書く時に全角スペースを必要な分(姓の文字数分+1文字分)挿入しないといけません。それが少し面倒。

上記の問題点は、次の投稿 Ubuntuで年賀状の宛名作成 csvで住所録編集 2020年版 の方法では解決できています。

なので、正直、 Ubuntuで年賀状の宛名作成 csvで住所録編集 2020年版 の方をオススメします。


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

※最終更新:2020年11月15日、cssスクリプトを修正。

諸々インストール

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

IPAmj明朝フォントをインストール

人名の様々な異体字が使えるIPAmj明朝フォントを使う。ただし、郵便番号はUbuntu18.04ではデフォルトで入っているNotoフォント(Noto Sans CJK JP)を使う。

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

$ sudo apt install fonts-ipamj-mincho

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

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

$ apt search ipamj

で検索。

IPAmj明朝フォント以外を使いたい場合、下記のnenga.cssとlist.cssの該当箇所を修正する。

perlをインストール

$ sudo apt install perl

Google Chromeをインストール

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

Googleの公式サイトからダウンロード、インストール。

フォルダ構成

年賀宛名フォルダを作って以下のように設定ファイル等を置いていく。

年賀宛名
 ├── list.css
 ├── makenenga.sh
 ├── nenga.css
 └── test.txt

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

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

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:"Noto Sans CJK JP";
    letter-spacing: 4.7mm; /* 数字の間隔 Noto Sans CJK JP 使用時 */
    font-size:12pt;
    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; /*上部および右からの位置*/
}

.宛名 {
    font-family:"IPAmj明朝" ;
    font-size:22pt; 
    letter-spacing: 0.3em;  /*文字間*/
    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;
    line-height:1.3; /*連名時の行間*/
}

.差出人住所氏名 {
    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;
}

.差出人 {
    font-family:"IPAmj明朝" ;
    font-size:14pt; 
    letter-spacing: 0.1em; 
    line-height:1.2; /*連名時の行間*/
    padding-top:0.5em; /*字下げ*/
}

.差出人郵便番号{
    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 */
    }
}

list.css

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

body {
  counter-reset: number; 
}
.sheet {
    display:block;
    border-bottom-style: groove;
    border-width: 1px;
    margin:0 0 0 0;
    padding:5pt 0 5pt 0;
    font-size:0; /* 隙間をなくす */
}

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

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

.郵便番号 {
    display: inline-block;
    vertical-align: top;
    font-size:12pt;
    font-family:"IPAmj明朝";
    width:25%;
}

.郵便番号:before {
    counter-increment:number;
    content: "(" counter(number) ")〒";
}

.住所 {
    display: inline-block;
    font-size:12pt;
    vertical-align: top;
    width:50%;
}

.宛名 {
    display: inline-block;
    vertical-align: top;
    margin:0 0 0 0;
    font-size:12pt;
    text-align:right;
    width:25%;
}

.差出人住所 {display:none;}
.差出人 {display:none;}
.差出人郵便番号{display:none;}

.NoPost{
    font-family:sans-serif;
    margin:10pt 0 10pt 0;
}

/*改ページ*/
.pagebreak{
    page-break-before:always;
    padding-top:0em;
    text-align: justify;
    text-justify: inter-ideograph;
}

@media print {
    @page {
    margin: 18mm 18mm 0mm 18mm;
    padding: 0;
    size: 8.26in 11.69in; /*A4縦*/
    /*size: 11.69in 8.26in; /*A4横*/
    }
}

makenenga.sh

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

#!/bin/sh
cp $1.txt $1_001.txt
sed -i \
-e 's/^[ \t]*//' \
-e '/^住所/y/-−ー*/―――*/' \
-e '/^差出人住所/y/-−ー*/―――*/' \
-e '/^郵便/s/$/<\/p>/g' \
-e 's/^郵便 /<p class=\"郵便番号\">/g' \
-e 's/^郵便番号 /<p class=\"郵便番号\">/g' \
-e 's/^〒 /<p class=\"郵便番号\">/g' \
$1_001.txt

sed -i -z 's/\n住所[22] /<br \/>/g' $1_001.txt
sed -i -z 's/\n住所[33] /<br \/>/g' $1_001.txt

sed -i \
-e '/^住所/s/$/<\/p>/g' \
-e 's/^住所 /<p class=\"住所\">/g' \
-e 's/^連名 /<br \/>/g' \
$1_001.txt

sed -i -z 's/\n<br \/>/<br \/>/g' $1_001.txt

sed -i \
-e '/^宛名/s/$/<\/p>/g' \
-e 's/^宛名 /<p class=\"宛名\">/g' \
-e '/^差出人住所/s/$/<\/p>/g' \
-e 's/^差出人住所 /<div class=\"差出人住所氏名\">\n<p class=\"差出人住所\">/g' \
-e '/^差出人/s/$/<\/p>/g' \
-e 's/^差出人 /<p class=\"差出人\">/g' \
-e '/^差出人郵便/s/$/<\/p>/g' \
-e 's/^差出人郵便 /<\/div>\n<p class=\"差出人郵便番号\">/g' \
-e 's/^差出人郵便番号 /<\/div>\n<p class=\"差出人郵便番号\">/g' \
-e 's/^差出人〒 /<\/div>\n<p class=\"差出人郵便番号\">/g' \
-e '/郵便番号/s/[-−ー]//g' \
-e 's/:::::sheet/<section class=\"sheet\">/g' \
-e 's/:::::/<\/section>/g' \
$1_001.txt

cp $1_001.txt filein01.txt

#喪中等で出さなかった人を一覧に表示
sed -i \
-e 's/<!--NoPost/<p class=\"NoPost\">※以下、今年は出していない。<\/p>/g' \
-e 's/NoPost-->//g' \
filein01.txt

cp $1_001.txt filein02.txt

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

#ハガキ
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, "< filein02.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
google-chrome --headless --print-to-pdf=`date +%Y%m%d_$1一覧`.pdf `date +%Y%m%d_$1一覧`.html

#いらない中間ファイルを削除。上手くpdfができないときは、ここをコメントアウト(行頭に#をつける)して、htmlソースを見てみる。
rm -f `date +%Y%m%d_$1一覧`.html
rm -f `date +%Y%m%d_$1年賀状`.html
rm -f $1_001.txt
rm -f filein01.txt
rm -f filein02.txt

#PDFの奇数ページだけ抽出する場合。Google Chrome 79.0.3945.88 での上記PDF出力ではなぜか、偶数ページに白紙が現れてしまうトラブルが発生したので…。
#pdftk `date +%Y%m%d_$1年賀状`.pdf cat odd output `date +%Y%m%d_$1年賀状完成`.pdf
#rm -f `date +%Y%m%d_$1年賀状`.pdf

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

宛名データのファイル名は任意で(ただし、拡張子に.txtをつける)。ここではtest.txtとする。

<!-- 
「:::::sheet」と「:::::」(:は5つ)の間に書く。 
「郵便」(「郵便番号」「〒」でもOK)「住所」などの項目の後には、必ず 全角スペース を入れる。
郵便番号(-[ハイフン]はあってもなくてもいい)、住所の数字は半角数字。
住所を2行に分ける時は2行目は「住所2」とする。
「宛名」および「差出人」のあとにさらに名前を追加する場合は、必ず項目は「連名」にする。
 -->

:::::sheet
郵便 111-2222
住所 鹿児島市霧島町11―2
住所2 新燃岳ビル88号
宛名 霧島 太郎 様
差出人住所 鹿児島市桜島町11−1
住所2 火山ビル101号
差出人 桜島 花子
連名    一郎
差出人郵便 222−3333
:::::

<!-- 差出人住所の前に空行を入れても大丈夫。 -->

:::::sheet
郵便番号 222ー3333
住所 鹿児島市錦江湾町55−1
宛名 金目鯛 次郎 様

差出人住所 鹿児島市桜島町111
住所2 火山ビル101号
差出人 桜島 花子
差出人郵便番号 2223333
:::::

<!-- 宛名面に差出人氏名住所を書かないのであれば以下でOK -->

:::::sheet
郵便 333-4445
住所 鹿児島市藺牟田池町22-1
住所2 白鳥ビル110号
宛名 白鳥 玲子 様
:::::


:::::sheet
〒 4445555
住所 鹿児島県鹿児島市桜島町1122-1
住所2 火山灰マンションあ−100号
宛名 山下 太郎 様
連名    花子 様
連名    一郎 様
連名    次郎 様

差出人住所 鹿児島市桜島町11−1
住所2 火山ビル101号
差出人 桜島 花子
連名    一郎
差出人〒 222-3335
:::::


    <!-- 喪中等で今年は出さない場合は、以下の「NoPost」と「NoPost」の行の間に書く。 行頭にタブを挿入しておくと見分けやすい。-->
    <!--NoPost

    :::::sheet
    郵便 6667777
    住所 鹿児島市桜島町77-7
    宛名 山田 太郎 様
    :::::

    :::::sheet
    郵便 7778888
    住所 鹿児島市桜島町88-8
    宛名 山田 花子 様
    :::::

    NoPost-->

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

年賀宛名フォルダ内の構成が次の通りになったことを確認。

年賀宛名
 ├── list.css
 ├── makenenga.sh
 ├── nenga.css
 └── test.txt

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

$ sh makenenga.sh test

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

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

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

次年度からは宛名データ(test.txt)を編集するだけでOK。

完成イメージ