Python

PythonでPNG形式の画像を、一括で1つのPDFファイルにする方法

今回はPythonでPNG形式の複数の画像ファイルを1つのPDFファイルにする方法を紹介します。

用途としては、Windowsで取得した複数のスクリーンショットや、Officeレンズなどで撮影した画像を1つのPDFにまとめるのに役に立ちます。

もくじ

  1. 環境
  2. PNG画像をJPEGに変換
  3. JPEG画像を1つのPDFにする
  4. リスト内包表記について
  5. まとめ

環境

まずは環境について記載しておきます。

今回はWSLのUbuntu18.04を前提にコードを紹介します。
なぜWSLかというと、WSLは直接Windows上のファイルを扱える上、Pythonの環境構築が簡単だからです。
また、Linuxの方がファイルのコマンド操作が(個人的に)楽だというのも理由の1つです。

環境は下記のとおりです。
Pythonの便利な画像編集ライブラリであるPillowと、画像をPDFに変換するためのimg2pdfライブラリを使用します。

・Windows10
・WSL Ubuntu18.04
・Python 3.6.9
・img2pdf==0.3.3
・Pillow==7.0.0

PNG画像をJPEG形式に変換する

PNG形式の画像をPDFに変換する前に、まずはJPEG形式に変換します。
なぜこの工程が必要かというと、PNGをPDFに直接変換使用とすると、下記のようなエラーが返ってくるためです。

"Exception: Refusing to work on images with alpha channel"

アルファチャンネルというのは、透過度表現データを意味します。
PNGやGIFなどは、透過を含む画像であるため、こちらのライブラリでは変換をサポートしていないのです。

そのため、PDFに変換するためには、一度JPEGなどの透過を含まない形式に変換する必要があります。

画像の変換方法は下記のとおりです。

from PIL import Image
import re

import glob, os
files = glob.glob("[対象ディレクトリ]/*.png")

match = re.compile("(png)")

for file_name in files:
    im = Image.open(file_name)
		im = im.convert("RGB")

		new_file_name = match.sub("jpeg", file_name)
    os.remove(file_name)
    im.save(new_file_name, quality=100)

    print(file_name + " convert is completed")

変換には、Pillowのconvertメソッドを利用します。
まず、対象ディレクトリ下のPNG画像のPathを、すべてfilesという配列に格納します。

その後、forループでこのPathそれぞれに対して処理を実行します。
まずは画像ファイルをPillowで開き、convertメソッドで透過を排除します。

最後に、正規表現でpngという文字列をすべてjpegに置き換えて保存し、もとのpngファイルをremoveメソッドで削除しています。

これで、PNG画像をPDFにするための準備は整いました。

JPEG画像を1つのPDFにする

では、いよいよ画像をPDFに変換しましょう。
とはいっても、変換は簡単です。

ちなみに、PDFに変換した場合のページ番号は、処理した順に割り当てられます。
事前にソートしておきましょう。

まずはソースコード。

import img2pdf
import os

pdf_file_name = "output.pdf"
path = "./"
ext  = ".jpeg"

with open(pdf_file_name, "wb") as f:
    f.write(img2pdf.convert([i for i in os.listdir(path) if i.endswith(ext)]))

流れとしては、withメソッドで開いたPDFファイルに、img2pdf.convertメソッドでJPEGファイルをPDFに変換して突っ込んでいくだけです。

もしかしたら、リスト内包表記の部分が少し分かりづらいかもしれないので解説します。
[i for i in os.listdir(path) if i.endswith(ext)] の部分です。

リスト内包表記について

リスト内包表記とは、forループを使って配列を一行で作ることのできる書き方のことです。
非常に便利ですが、見慣れないと混乱するかもしれません。

今回使用した、[i for i in os.listdir(path) if i.endswith(ext)]の部分を書き直してみました。

array = []
for i in os.listdir(path):
    if i.endswith(ext):
    array.append(i)

pathで指定したディレクトリのファイル一覧を取り出し、jpeg形式のものだけを配列に格納しています。
endswithメソッドは、指定した文字列で終了するかどうかを判断する関数で、一致した場合はTrueが返ってきます。

まとめ

今回はPythonでPNG形式の画像を1つのPDF形式に変換する方法を紹介しました。

スマホで撮影した写真や、WEBページなどのスクリーンショットをPDFに変換できるようになると、活用の幅が広がりますね。

それではまた。

COMMENT

メールアドレスが公開されることはありません。