Help us understand the problem. What is going on with this article?

PowerShellとLibreOffice DrawでChristmascard

LibreOffice AdventCalendar 2018

Kyoto Central Post Office.png

日本では年賀状ですが、欧米ではクリスマスカードを贈るそうです。
今回は

  • PowerShell
  • LibreOffice Draw
  • csvファイル

これらを使ってクリスマスカードの宛名を量産します。
できたcodeはGitHubに挙げてあります。

christmascard - github

環境

  • Windows10 Pro
    • PowerShell v5.1
  • LibreOffice Draw
    • Flat Open Document Graphic(.fodg)
  • csvファイル
    • utf8

作り方

Template

Flat Open Documentsを使う。
LibreOfficeのOpen Documents Fomatで使える方法です。
ODFはxmlとcss等を集めてzipで固めたものです。
Flat ODFにするとXMLやcssの構造が1つになりsed等のText操作ができるようになります。

今回はLibreOffice Drawではがきサイズのクリスマスカードを作りました。
そこに {postcode} {address} {name}等のTextを配置してあります。

LibreOfficeでは下図のように見えています。

card.png

下記がこのテンプレートの中身です。
{address1} {postcode} {name}等が見えます。

TextEditorでFlat_OpenDocumentを表示(一部抜粋)
<draw:frame draw:style-name="gr1" draw:text-style-name="P1" draw:layer="layout" svg:width="2.8cm" svg:height="0.763cm" svg:x="1cm" svg:y="1.037cm">
     <draw:text-box>
      <text:p><text:span text:style-name="T1">From</text:span></text:p>
     </draw:text-box>
    </draw:frame>
    <draw:frame draw:style-name="gr2" draw:text-style-name="P2" draw:layer="layout" svg:width="5.1cm" svg:height="0.7cm" svg:x="5.2cm" svg:y="7.5cm">
     <draw:text-box>
      <text:p><text:span text:style-name="T2">{address1}</text:span></text:p>
     </draw:text-box>
    </draw:frame>
    <draw:frame draw:style-name="gr2" draw:text-style-name="P4" draw:layer="layout" svg:width="8.8cm" svg:height="0.7cm" svg:x="5.2cm" svg:y="8.3cm">
     <draw:text-box>
      <text:p text:style-name="P3"><text:span text:style-name="T2">{address2} <text:s/>{postcode}</text:span></text:p>
     </draw:text-box>
    </draw:frame>
    <draw:frame draw:style-name="gr3" draw:text-style-name="P5" draw:layer="layout" svg:width="7.8cm" svg:height="0.962cm" svg:x="5.1cm" svg:y="6.5cm">
     <draw:text-box>
      <text:p>{name} </text:p>
     </draw:text-box>
    </draw:frame>

csvファイル

下記のようなデータになっている。
uft8でコンマ区切りで保存されています。

postcode address1 address2 name
6040925 488 Honojimae-cho Nakagyo-Ward Kyoto City Kyoto Pref. Kyoto City Hall
6008799 849-12 Higashiumekoji-cho shimogyo-Ward Kyoto City Kyoto Pref. Kyoto Central Post Office

PowerShell

templateにcsvファイルのデータを差し込むのに使う。
この場合は住所録のデータを差し込む。

データ差込
# load data
$data=Import-Csv -Path .\addresslist.csv -Encoding UTF8

foreach($d in $data){
    # load template
    $temp=Get-Content .\card.fodg -Encoding UTF8

    # merge template
    $temp=$temp -replace '{postcode}',$d.postcode
    $temp=$temp -replace '{address1}',$d.address1
    $temp=$temp -replace '{address2}',$d.address2
    $temp=$temp -replace '{name}',$d.name

    $file="cards\"+$d.name

    # output newfile
    $temp | out-file -FilePath $file'.fodg' -Encoding utf8
}

さらに大量にできたクリスマスカードを一括で印刷できるようにprint.ps1も作った。

一括印刷
$cards=(Get-ChildItem cards\*.fodg)

foreach($card in $cards){

    Start-Process $card -Verb Print | Stop-Process

}

このコマンドは既存のプリンター(標準で使うプリンター)に「標準の設定」で印刷する。

上手く印刷するには、
標準のプリンターに「はがき」を入れて標準の設定の用紙設定を「はがき」「横」にしましょう。

謝辞

Flat ODTを教えてくれた @nogajunさん
Powershellを使えばFlat ODTにデータ差し込めるのでは?と言い出した @Anubis_369 さん

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away