• Pythonその2 エクセルの連絡リストをもとに大入袋PDFを生成する
  • HOME
  • Pythonその2 エクセルの連絡リストをもとに大入袋PDFを生成する

Pythonその2 エクセルの連絡リストをもとに大入袋PDFを生成する

Pythonその2 エクセルの連絡リストをもとに大入袋PDFを生成する

大入袋をもらえると嬉しいですよね。ただ、作る側としてはスタッフの人数分、名前と肩書きを書かなきゃいけないのでわりと手間がかかるんじゃないかなと思っていました。他にも硬貨を用意したり、袋自体を買ったりもしないといけないと、ゆかりーぬさんも書いてるのできっとタイヘンなのだと思います。

ということで今回は、エクセルで作った関係者の連絡リストをもとに、それぞれのスタッフの名前と肩書きが入った大入袋PDF(88mm × 168mm)を生成するというPythonプログラムを作ってみました。

#! python3
# ooiri - エクセルのリストを元に縦書きの文字で大入袋を生成

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4, portrait, landscape
from reportlab.lib.units import mm
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.platypus import Frame, Image
from PIL import Image
import webbrowser
import openpyxl


#白紙を作る(A4縦)
filename = 'ooiri.pdf'
ooiri_size = (88*mm, 168*mm)
c = canvas.Canvas(filename, pagesize=portrait(ooiri_size))


#エクセルファイルを読み込み
wb = openpyxl.load_workbook('jusho.xlsx')
sheet1 = wb['Sheet1']
sheet2 = wb['Sheet2']

#フォント登録
pdfmetrics.registerFont(UnicodeCIDFont('HeiseiMin-W3', isVertical=True))
pdfmetrics.registerFont(UnicodeCIDFont('HeiseiKakuGo-W5', isVertical=True))
fnt = sheet2['B17'].value


#以下の作業をリストの人数分だけ繰り返す
for i in range(int(sheet1.max_row)-2):
    #真ん中に名前を描画
    font_size = 35
    c.setFont(fnt, font_size)
    word = sheet1.cell(i+3,1).value + ' 様'
    c.drawString(44*mm, (135+int(sheet2['B15'].value))*mm, word)

    #右に劇団名を描画
    font_size = 20
    c.setFont(fnt, font_size)
    word = sheet2['B1'].value
    c.drawString(80*mm, (155+int(sheet2['B6'].value))*mm, word)

    #右に公演タイトルを描画
    font_size = 20
    c.setFont(fnt, font_size)
    word = sheet2['B2'].value
    c.drawString(70*mm, (155+int(sheet2['B7'].value))*mm, word)

    #名前右に肩書きを描画
    font_size = 20
    c.setFont(fnt, font_size)
    word = sheet1.cell(3+i,2).value
    c.drawString(57*mm, (135+int(sheet2['B14'].value))*mm, word)

    #左に公演日程を描画
    font_size = 15
    c.setFont(fnt, font_size)
    word = sheet2['B3'].value
    c.drawString(15*mm, (69+int(sheet2['B8'].value))*mm, word)

    #左に劇場名を描画
    font_size = 15
    c.setFont(fnt, font_size)
    word = sheet2['B4'].value
    c.drawString(7*mm, (37+int(sheet2['B9'].value))*mm, word)

    #左上にロゴを描画
    logo_filename = sheet2['B18'].value
    image = Image.open(logo_filename)
    logo_size = sheet2['B11'].value
    c.drawInlineImage(image, 5*mm, (142+int(sheet2['B12'].value))*mm, width=logo_size*mm, height=(logo_size*image.height/image.width)*mm)

    c.showPage()



c.save()

print('PDF書き出し完了')


 

使い方

1)まず、Pythonをインストールします。
python インストール」などと検索して、なんとか自分のパソコンにインストールしてください。
実は僕の場合、インストールで結構つまずきました。いろいろやり方があるらしいんですが、公式(https://www.python.org/)からダウンロードしてインストールするのが一番うまくいきました。僕の場合は。

 
2)次にモジュールをインストールする
今回は、reportlabと、openpyxlと、Pillowを使います。
macの場合→ターミナルというのを立ち上げて、

$ sudo pip3 install reportlab
$ sudo pip3 openpyxl
$ sudo pip3 install Pillow

 
Windowsの場合→コマンドプロンプトというのを立ち上げて、

$ pip install reportlab
$ pip openpyxl
$ pip install Pillow

とかやって、インストールしてください。
いろんなサイトで各モジュールをインストールするやり方は説明されているので調べてみてください。

 
3)pythonファイルをダウンロード

こちらからダウンロードして、zipファイルを解凍してください。
ooiri.zip

ooiri.py
jusho.xlsx
white.jpg
の三つが入っています。
 
4)エクセルのリストを変更する

jusho.xlsxというファイルをエクセルで開いて、自分のカンパニー用に修正していきます。

sheet1には、氏名と肩書きを入れ込んでください。
sheet2には、劇団名、公演名、公演期間、劇場名、ロゴのファイル名(例えば tokisake_logo.jpg)のように指定します。

なお、各項目の「縦位置」は数字を入力することでmm単位で微調整することができます。各項目は最初は「0」になっていますが、「1」を入れれば、1mm上にずれます。「-3」を入れれば、3mm下にずらせます。
特に、公演期間と劇場名の部分は、文字数が増えるとはみ出てくるので微調整してください。「5」で1文字分くらいのようです。

フォントは明朝体の「HeiseiMin-W3」か、ゴシック体の「HeiseiKakuGo-W5」のどちらかが選べます。
(※選べる、はずなんですが、僕のWindows PCでは明朝体が出せませんでした・・・。Macではうまくいくのになぜだろう?)

 
5)ooiri.py をIDLEで開いてF5で実行!

すると、
各ページに名前と肩書きの入った大入袋PDFが出来上がるはずです。
あとは、プリンタの手差し印刷で一発でいける・・・と思います! どうでしょう。

自動化企画トップに戻る

(文:森脇孝/エントレ編集部)