1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PowerShellAdvent Calendar 2018

Day 17

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

1
1
0

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
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?