連番画像からPythonでパワポ生成
スライドは Adobe illustrator(以後略:イラレ) で作りたいけど、発表は PowerPoint(以後略:パワポ) でやりたい。or パワポ形式に指定されている場合。いくつか方法があるので紹介。
- イラレでpdfを吐き出し、Acrobatでパワポに変換(デザインが崩れる率高い)
- イラレのアートボード機能で連番画像を吐き出し、パワポのフォトアルバム機能で連番画像を読み込み
- イラレのアートボード機能で連番画像を吐き出し、Pythonでパワポファイル生成
1番は割とデザインがっつり崩れるので自分的に論外って感じです。2番は割と優秀で簡単にできるし、なにより画像なのでフォントが崩れない!
しかし、フォトアルバム機能はWindows版のパワポにしかないので、Macユーザーには辛い話です。そこで python-pptx というライブラリを使って連番画像からパワポを吐き出そう!
要するに、3番をやってみたよ!って話です。
と思ったら先駆者がいた
すでにやってる方がおられました。>> Pythonで画像ファイルをパワポに貼る
ということでその方のコードを参考にしつつ、欲しい機能を足して使えるようにしてみたので置いておきます。
- スライドの幅と高さをpxで指定できるようにした(未入力でFullHDサイズ)
- 連番画像が入ってるディレクトリを指定できるようにした(同じディレクトリにpptxファイルが出力されます)
- 出力ファイル名を指定できるようにした
もちろんですが、 pip install python-pptx
をする必要があります。
# coding: utf-8
from pptx import Presentation
from glob import glob
import sys
# 幅と高さを指定
print('スライドの幅と高さを指定(default:1920x1080)')
px_width = input('幅(px) : ')
px_height = input('高さ(px) : ')
# 連番画像のディレクトリ指定
print('連番画像のディレクトリを指定(絶対パス)')
path = input('Path : ')
# 出力ファイル名指定
file_name = input('出力ファイル名 : ')
print(file_name + '.pptx')
# Presentationインスタンスの作成
ppt = Presentation()
# 幅と高さを指定
if not px_width:
ppt.slide_width = int(1920 * 12700)
else:
ppt.slide_width = int(px_width) * 12700
if not px_height:
ppt.slide_height = int(1080 * 12700)
else:
ppt.slide_height = int(px_height) * 12700
width = ppt.slide_width
height = ppt.slide_height
# レイアウトの設定、白紙の6番を使用
blank_slide_layout = ppt.slide_layouts[6]
# ファイルの読み込み
fnms = glob('{0}/*.png'.format(path))
# ソート
fnms.sort()
# ファイル毎にループ
for fnm in fnms:
# 白紙のスライドの追加
slide = ppt.slides.add_slide(blank_slide_layout)
# 画像の挿入
pic = slide.shapes.add_picture(fnm, 0, 0)
# 中心に移動
pic.left = int( ( width - pic.width ) / 2 )
pic.top = int( ( height - pic.height ) / 2 )
# 名前をつけて保存
ppt.save('{0}/{1}.pptx'.format(path,file_name))
上記コードが書かれたファイルを ~$ python <file_name>.py
で起動したら、以下の入力が一行ずつ表示されるはずです。
スライドの幅と高さを指定(default:1920x1080)
幅(px) :
高さ(px) :
連番画像のディレクトリを指定(絶対パス)
Path : /Users/username/Documents/hoge
出力ファイル名 : slide_name
/Users/username/Documents/hoge
に連番画像が置いてあれば、上記のように入力すると同じディレクトリに slide_name.pptx
が吐き出されます。
python-pptx の slide_width と slide_height は、EMU という単位らしく、ピクセル単位(px)で指定するのには(スクリーン72ppi の時)、12700 をかければいいみたいです。1080 px = 15 inch で 1 inch = 914400 EMU ということから導出しました。
整数しか受け付けてくれなかったので、 int()
でえいや!と整数にしてます。なので生成後に多少画像がはみ出たり小さかったりするかもしれません。実際に生成した時は特に気にならない感じだったのでいいかなと。
Macの方は、1行目 # coding: utf-8
で日本語のパスにも対応しますが、Windowsはどうもそういかないようです。Windowsの方は日本語のファイル読み込みにやや難がある(?)らしく、ファイルパス・ファイル名含め全て英数字にするか、もしくはこちらの記事等を参考に日本語対応させてください。
クソ雑記事で申し訳ないです。
「学生デザイナさん」とか、「教員にpptx強制されるけど自宅PCがMac系学生」は密かに絶対こういうの求めてると思うので、広めてやってください。現に僕が一年前に知りたかった情報ですね。
イラレ側
イラレのアートボードの名前に自動で連番の数字をつけるスクリプトがあれば、簡単に連番画像が吐き出せる!
でもそんなちょうどいいスクリプトなんて無いかな…、自分で書くしか……
>>> ありました! <<<
一応デフォルトの機能(アートボードオプション)からでも可能なのですが、10以上のアートボードがあるときに、連番的に3よりも12が先に来てしまうという問題がありました。
ですがこちらのスクリプトは、ゼロ埋め( 3 → 03 にする) に対応しているのでその心配もなし!