LoginSignup
1

More than 3 years have passed since last update.

PowerShellとLibreOffice DrawでChristmascard

Last updated at Posted at 2018-12-23

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 さん

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1