概要
YouTube用の動画を作成しているが、説明に使う予定のGoogleスライドを画像で保存したら、フルHDサイズ(1920×1080)ではなかった。
リサイズも面倒なので、PDFでダウンロードしてJPEG変換し、トリミングして画像を作成するようにした。
環境
Windows 10 Professional
Python 3.9.2
準備
pdf2imageのインストール
ライブラリ「pdf2image」をインストールする
pip install pdf2image
Popplerのダウンロード
フリーのPDFコマンドラインツールである「Poppler」をインストールする。
リンク先中央付近の「Latest binary : poppler-0.??.0_x86」をダウンロードする。
フォルダ構成
フォルダ構成は下記の通り。
PdfToImage/
├ image_file/
├ pdf_file/
│ └ slide.pdf
├ poppler/
│ ├ local/
│ ├ include/
│ ├ lib/
│ └ share/
└ .pyファイル(実行ファイル)
popplerフォルダにダウンロードしたPoppplerのファイルを解凍してそのまま入れる。
ソースコード
import os
from pathlib import Path
from pdf2image import convert_from_path
import sys
from PIL import Image
# poppler/binを環境変数PATHに追加する
poppler_dir = Path('__file__').parent.absolute() / "poppler/bin"
os.environ["PATH"] += os.pathsep + str(poppler_dir)
# PDFファイルのパス
pdf_path = Path("./pdf_file/slide.pdf")
# PDF -> Image に変換(200dpi)
pages = convert_from_path(str(pdf_path), 200)
# 画像ファイルを1ページずつ保存
image_dir = Path("./image_file")
for i, page in enumerate(pages):
file_name = pdf_path.stem + "_{:02d}".format(i + 1) + ".jpeg"
image_path = image_dir / file_name
# JPEGで保存
page.save(str(image_path), "JPEG")
#トリミング前の画像の格納先
ORIGINAL_FILE_DIR = "./image_file/"
#トリミング後の画像の格納先
TRIMMED_FILE_DIR = "./cut_file/"
#画像パスと、左上座標、右下座標を指定して、トリミングされたimageオブジェクトを返す。
def trim(path, left, top, right, bottom):
im = Image.open(path)
im_trimmed = im.crop((left,top,right,bottom))
return im_trimmed
if __name__ == '__main__':
#もしトリミング後の画像の格納先が存在しなければ作る
if os.path.isdir(TRIMMED_FILE_DIR) == False:
os.makedirs(TRIMMED_FILE_DIR)
#トリミングする左上の座標
left, top = 62, 24
#トリミングする右上の座標
right, bottom = 1982, 1104
#画像ファイル名を取得
files = os.listdir(ORIGINAL_FILE_DIR)
#特定の拡張子のファイルだけを採用。実際に加工するファイルの拡張子に合わせる
#files = [name for name in files if name.split(".")[-1] in ["png","jpg"]]
for val in files:
#オリジナル画像へのパス
path = ORIGINAL_FILE_DIR + val
#トリミングされたimageオブジェクトを取得
im_trimmed = trim(path, left, top, right, bottom)
#トリミング後のディレクトリに保存。ファイル名の頭に"cut_"をつけている
im_trimmed.save(TRIMMED_FILE_DIR+"cut_"+val, quality=95) #qualityは95より大きい値は推奨されていないらしい
実行すると、「cut_file」というフォルダが作られ、その中に"cut_slide_**.jpeg"というトリミングした画像が格納される。
#参考
PDFからJPEG画像の取得
PythonでPDFを画像ファイル(JPEG、PNG)に変換する方法
JPEGのトリミング
画像を一括でトリミング【python】【Pillow】
name ‘__file__’ is not defined
の解決
Python NameError: name ‘file’ is not definedのエラー
記事を書くときの参考
ディレクトリ構成図を書くときに便利な記号