SlideShare a Scribd company logo
1
本気でPythonで
宛名書きした話
山田 聡@denzowill
#stapy 2016/3/8
2
WHO ARE YOU
● DBエンジニア@株式会社アシスト
● ノンプログラマ
● 開発業務未経験
● Python触って2年(3年?)くらい
● LT専門
3
こんな話してました
4
前回は本チャンでpsycopg2の話をさせていただきました
会社のBlogにももうちょっと細かい話で投稿しました
http://www.ashisuto.co.jp/db_blog/article/20160308_postgresql_with_python.html
5
タダの宣伝でした。
6
本題
7
こういうデータを
8
こうしたかった
9
Pythonで宛名書き
● CSVを読んで
● ディクショナリのリストにして
● Pillowで書き出す!
10
https://pillow.readthedocs.org/en/3.1.x/
Pillow
11
Pillow
● PILというPython画像ライブラリのFork
● こっちのほうが継続メンテされてる
● PILと互換性あるので同じメソッドで動く
● 今回の主役
12
流れ
CSVをデータに
はがきサイズの
白いキャンパス作成
住所書いて
書きこみ位置をry
名前書いて
書きこみ位置をry
連名があれば
それも書く
画像を保存
郵便番号書いて
書きこみ位置をずらす
13
実は同じ内容で前回LTしました
14
実は同じ内容で前回LTしました
が
コードをちゃんと書き直しました
https://github.com/denzow/print_label
15
実は同じ内容で前回LTしました
が
コードをちゃんと書き直しました
https://github.com/denzow/print_label
縦書きもあるといいねって
いわれたから!
16
Pillowで文字を書くには
● フォントファイル指定
● 書き込みの基準位置(x,y)を指定
● draw.textで書き出す
17
Pillowで文字を書くには
● フォントファイル指定
● 書き込みの基準位置(x,y)を指定
● draw.textで書き出す
● 書き出しは横書きで
18
縦書きするには
● 1文字ずつ区切る(2系ならunicode)
● 書き出し毎にサイズを確認する
● サイズ分だけ書き出し位置をずらす
19
img = PIL.Image.new("RGB", VERTICAL_CANVAS_SIZE, (0xff, 0xff, 0xff))
draw = PIL.ImageDraw.Draw(img)
write_posit = [0, 0]
for character in u"東京都千代田区九段北9-9-9 市ヶ谷どっかビル":
txt_size = list(draw.font.getsize(character))
draw.text(write_posit, character, (0, 0, 0))
# 書いた分だけY軸をずらす
write_posit[1] += txt_size[1]
縦書きするには
20
あ。。。
21
img = PIL.Image.new("RGB", VERTICAL_CANVAS_SIZE, (0xff, 0xff, 0xff))
draw = PIL.ImageDraw.Draw(img)
write_posit = [0, 0]
for character in u"東京都千代田区九段北9-9-9 市ヶ谷どっかビル".replace(u"-",u"|"):
txt_size = list(draw.font.getsize(character))
draw.text(write_posit, character, (0, 0, 0))
# 書いた分だけY軸をずらす
write_posit[1] += txt_size[1]
横棒を縦棒に
22
半角文字がずれて
気持ち悪い
23
img = PIL.Image.new("RGB", VERTICAL_CANVAS_SIZE, (0xff, 0xff, 0xff))
draw = PIL.ImageDraw.Draw(img)
write_posit = [0, 0]
# マルチバイト文字のフォント幅を取得
one_char_width = self.draw.font.getsize(u" ")[0]
for character in u"山田 聡":
txt_size = list(draw.font.getsize(character))
if one_char_width > txt_size[0]:
# 差分の半分だけX軸ずらせばセンタリングになる
tmp_write_posit = write_posit[:]
tmp_write_posit[0] += (one_char_width - txt_size[0]) / 2
draw.text(tmp_write_posit, character, (0, 0, 0))
else:
draw.text(write_posit, character, (0, 0, 0))
# 書いた分だけY軸をずらす
write_posit[1] += txt_size[1]
半角文字のセンタリング
24
北
1
10
北
1
55
25
満足
26
こういうことをいろいろして
./print_label.py data/sample.csv /tmp vertical
27
こういうデータが
28
こうなった(実在の人物とは関係有りません)
29
こうなった(実在の人物とは関係有りません)
30
ご清聴ありがとうございました

More Related Content

PDF
DBエンジニアに必要だったPythonのスキル
PDF
bottle.pyをつかったチャットアプリ作成チュートリアル
PDF
pythonでemlファイルを扱う話
PPTX
Bottle使ってPython学習一緒にはじめませんか?
PDF
Requestsで始める5分前帰社
PDF
bottleで始めるWEBアプリの最初の一歩
PDF
Pythonで業務改善をしたときにあった問題(ライト版)
PDF
S10 t1 spc_by_nowfromnow
DBエンジニアに必要だったPythonのスキル
bottle.pyをつかったチャットアプリ作成チュートリアル
pythonでemlファイルを扱う話
Bottle使ってPython学習一緒にはじめませんか?
Requestsで始める5分前帰社
bottleで始めるWEBアプリの最初の一歩
Pythonで業務改善をしたときにあった問題(ライト版)
S10 t1 spc_by_nowfromnow

What's hot (20)

PDF
Python学習奮闘記#07 webapp
PDF
S01 t1 tsuji_pylearn_ut_01
PDF
S09 t0 orientation
ODP
stapy#23 LT
PDF
S20 t1 stapyのこれまでとこれから
PDF
10分でわかるPythonの開発環境
PDF
Python札幌 2012/06/17
PDF
S08 t0 orientation
PDF
S16 t1 python学習奮闘記#6
PDF
RubyエンジニアがPythonをdisるためにPythonを勉強してみた
PPTX
Python エンジニアの作り方 2011.08 #pyconjp
PPTX
210630 python
PDF
たった一ファイルの python スクリプトから始めるOSS開発入門 / PyCon JP 2016
PDF
S18 t0 introduction
PPTX
Pythonのプロファイリング
PDF
S12 t1 python学習奮闘記#5
PDF
S14 t0 introduction
PDF
WindowsでPython
PPTX
オリエンテーション
PPTX
Python札幌201406
Python学習奮闘記#07 webapp
S01 t1 tsuji_pylearn_ut_01
S09 t0 orientation
stapy#23 LT
S20 t1 stapyのこれまでとこれから
10分でわかるPythonの開発環境
Python札幌 2012/06/17
S08 t0 orientation
S16 t1 python学習奮闘記#6
RubyエンジニアがPythonをdisるためにPythonを勉強してみた
Python エンジニアの作り方 2011.08 #pyconjp
210630 python
たった一ファイルの python スクリプトから始めるOSS開発入門 / PyCon JP 2016
S18 t0 introduction
Pythonのプロファイリング
S12 t1 python学習奮闘記#5
S14 t0 introduction
WindowsでPython
オリエンテーション
Python札幌201406
Ad

Similar to 本気でPythonで宛名書きした話 (20)

PDF
Pythonで自動化した話1
PDF
OSS Study#19_LT
PPTX
他人が書いたコードのリファレンスをSphinxで作る方法
PPTX
PythonのインストールからHello Worldまで
PPTX
Python入門者の集い #6 Lightning Talk
PDF
Pyladies tokyo 20150123
PDF
Sphinxを使って本を書こう #pyconjp 2012
PDF
Python × Herokuで作る 雑談slack bot
PDF
PyPy 紹介
PDF
S06 t1 python学習奮闘記#4
PDF
Introduction of kabepy
PDF
Python for Beginners ( #PyLadiesKyoto Meetup )
PPTX
データ分析スクリプトのツール化入門 - PyConJP 2016
PPTX
私の好きなPython構文 vol.2 #nds46
PPTX
211120 他人の書いたPythonスクリプトをステップ実行で理解する
PDF
Rでを作る
PDF
Python界隈の翻訳プロジェクト
PDF
20111206 GLT vol.40
PDF
Tokyo.R女子部発表スライド「Rではじめるデータ解析の超基礎」
PDF
こわくないPython
Pythonで自動化した話1
OSS Study#19_LT
他人が書いたコードのリファレンスをSphinxで作る方法
PythonのインストールからHello Worldまで
Python入門者の集い #6 Lightning Talk
Pyladies tokyo 20150123
Sphinxを使って本を書こう #pyconjp 2012
Python × Herokuで作る 雑談slack bot
PyPy 紹介
S06 t1 python学習奮闘記#4
Introduction of kabepy
Python for Beginners ( #PyLadiesKyoto Meetup )
データ分析スクリプトのツール化入門 - PyConJP 2016
私の好きなPython構文 vol.2 #nds46
211120 他人の書いたPythonスクリプトをステップ実行で理解する
Rでを作る
Python界隈の翻訳プロジェクト
20111206 GLT vol.40
Tokyo.R女子部発表スライド「Rではじめるデータ解析の超基礎」
こわくないPython
Ad

More from Satoshi Yamada (9)

PDF
PostgreSQLとPythonとSQL
PDF
10080分でPythonからIP Messeneger
PDF
15分で情シスに怒られる方法
PDF
Djangoで業務改善したい
PDF
PostgreSQL実行計画入門@関西PostgreSQL勉強会
PDF
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
PDF
201505 PostgreSQLアンカンファレンス(PL/Pythonで作るWEBアプリ)
PDF
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PDF
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQLとPythonとSQL
10080分でPythonからIP Messeneger
15分で情シスに怒られる方法
Djangoで業務改善したい
PostgreSQL実行計画入門@関西PostgreSQL勉強会
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
201505 PostgreSQLアンカンファレンス(PL/Pythonで作るWEBアプリ)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)

本気でPythonで宛名書きした話