物理の駅 Physics station by 現役研究者

テクノロジーは共有されてこそ栄える

Pythonで複数のPNG画像をPDFファイルに変換する

画像からPDFにするためのパッケージ img2pdf が必要。

数字を自然順にソートするためのパッケージと関数 natsort natsorted が必要。

PNGファイルに透過チャンネルがある場合、 img2pdf.AlphaChannelError: Refusing to work on images with alpha channel というエラーが出る。アルファチャンネルを削除するための画像処理にOpenCV ライブラリを使った。このまま実行すると画像ファイルは上書きされてしまうので注意。

import img2pdf
import glob
from natsort import natsorted #自然順にするため
import cv2

# 画像一覧を取得
lists = list(glob.glob("*.png"))

# 透過チャンネルがある場合に削除する処理
for filename in lists:
    img = cv2.imread(filename,cv2.IMREAD_UNCHANGED)
    if img.shape[2] == 4:
        img2 = cv2.imread(filename,cv2.IMREAD_COLOR)
        cv2.imwrite(filename, img2)

# PDFファイルを出力
outputpath = "file.pdf"
with open(outputpath,"wb") as f:
    f.write(img2pdf.convert([str(i) for i in natsorted(lists) if ".png" in i]))

pngjpgの両方を取得する場合は "*.[pj][np][gg]"

JPEGファイルにはアルファチャンネルはないので、その部分を削除したコードは以下の通り

import img2pdf
import glob
from natsort import natsorted #自然順にするため
import cv2

# 画像一覧を取得
lists = list(glob.glob("*.jpg"))

# PDFファイルを出力
outputpath = "file.pdf"
with open(outputpath,"wb") as f:
    f.write(img2pdf.convert([str(i) for i in natsorted(lists) if ".jpg" in i]))