2023/01/07

【Python】複数枚のPNG画像をJPEGに圧縮してPDFに変換する

過去に何度もimg2pdfを利用した複数画像からPDFへの変換を記事にしていますが、本記事ではPNG画像をJPEG画像に圧縮してからPDFに変換する方法を試します。
PNG画像とJPEG画像の特性については解説しませんが、PDFにした時のファイルサイズの削減が目的です。 変換処理を挟むので、処理時間が増加しますがファイルサイズ低減のメリットが大きければ採用する価値があると思います。
以前の記事に倣って、またいくつかの手法を比較しました。

実行環境は、以下の通りです。
------
MacBook Air (M2, 2022, メモリ:16 GB)
Python 3.10.9
img2pdf 0.4.4
Pillow 9.3.0


Method1 : 画像変換によって圧縮してからPDFにする(PNG画像→JPEG画像→PDF):本記事のタイトルの手法

Method2 : img2pdfをだけ使う(PNG画像→PDF, ロスレス):以前の記事の中で書いたもの

Method3 : Pillowだけを使う(PNG画像→PDF, 圧縮):以前の記事の中で書いたもの

Method4 : Pillowだけを使う(PNG画像→PDF, 圧縮):Method3をconcurrent.futuresで並列化(Method1でもconcurrent.futuresを使用して並列化による高速化を試したため比較)

10個の異なるpng画像ファイル群での出力ファイルサイズと実行時間の比較は、以下の通りです。

Method1とMethod2の比較から分かりますが、JPEGに一度変換することでファイルサイズが小さくなり、処理速度も上がっています。
Method3とMethod4では、ファイル変換処理は同じなので当然出力ファイルサイズは同じですが、Method3とMethod4の比較から並列化の効果が分かります。今回使用した環境では、だいたい半分の時間で処理できています。


img2pdfで扱えないアルファチャンネルのある透過PNG画像も、Method1を使えば取り扱えそうです。