Pythonを使用して画像をPDFに変換する方法

ビジネスレポートから写真ポートフォリオまで、PDFで画像を使用する必要があることがよくあります。画像からPDFへのコンバーターは、プロセスを効率化できます。オンラインで利用できる無料ツールは数多くありますが、画像をアップロードする必要があるため、プライバシーやセキュリティが懸念される場合があります。

代わりに、Pythonを使用してオフラインの画像からPDFへのコンバーターを構築できます。JPGまたはPNG形式の複数の画像を選択し、プレビューを取得し、元の画像サイズを維持しながらPDFに変換します。

Tkinter、Pillow、ReportLabモジュール

TkinterはPythonの標準GUIライブラリです。ボタン、ラベル、テキストボックスなどのさまざまなウィジェットを提供しており、音楽プレーヤーや重量変換ツールなどのアプリを簡単に開発できます。システムにTkinterをインストールするには、ターミナルを開いて次のように入力します。

pip install tkinter

Pillowモジュールは、画像のサイズ変更、トリミング、フィルタリングなどの画像操作を簡単に実行できる強力なPythonイメージングライブラリです。これをAPIとDALL·E 2と統合することで、テキストプロンプトを使用して画像を生成できます。

Pillowをインストールするには、次のコマンドを実行します。

pip install Pillow

ReportLabは、PDFとグラフィックスを生成するためのオープンソースのPythonライブラリです。画像、テキスト、表を含むドキュメントを生成するために使用できるさまざまなツールがあり、プログラミングによるレポートの生成に役立ちます。これにより、ビジネスレポート、請求書、証明書を作成し、テキストの透かしを追加することもできます。ReportLabをインストールするには、次のようにします。

pip install reportlab

画像からPDFへのコンバーターの構造を定義する

このGitHubリポジトリで、Pythonを使用して画像からPDFへのコンバーターを構築するためのソースコード全体を見つけることができます。

必要なモジュールをインポートし、ImageToPDFConverterという名前のクラスを作成します。クラスを初期化し、Tkinterのルートウィンドウオブジェクトを引数として取るコンストラクタメソッドを定義します。ユーザーが選択した画像のパスを格納するための空のリストを初期化します。アプリケーションのタイトルと寸法を設定します。Select ImagesConvert to PDFという名前の2つのボタンを作成します。

ボタンを配置するウィンドウ、表示するテキスト、クリック時に実行するコマンド、適用するフォント形式を渡します。pack()メソッドを使用してボタンを整理し、垂直方向に10のパディングを指定します。

import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk
from reportlab.lib.pagesizes import landscape
from reportlab.pdfgen import canvas
class ImageToPDFConverter:
def __init__(self, root):
self.root = root
self.image_paths = []
self.root.title("Image to PDF Converter")
self.root.geometry("750x600")
self.select_images_button = tk.Button(self.root, text="Select Images", command=self.select_images, font=("Helvetica", 12),)
self.select_images_button.pack(pady=10)
self.convert_to_pdf_button = tk.Button(self.root, text="Convert to PDF", command=self.convert_to_pdf,font=("Helvetica", 12),)
self.convert_to_pdf_button.pack(pady=10)

配置する親ウィンドウ、表示するテキスト、使用するフォント形式、10(ピクセル)の垂直パディングを渡すことで、ラベルを定義します。

同様に、選択した画像をプレビューするためのフレームを定義し、その親ウィンドウ、幅、高さを設定します。10のパディングで整理します。

self.select_images_label = tk.Label(self.root, text="Select Images", font=("Helvetica", 14))
self.select_images_label.pack(pady=10)
self.preview_frame = tk.Frame(self.root, width=380, height=200)
self.preview_frame.pack(pady=10)

画像を選択してプレビューを作成する

select_images()メソッドを定義します。Tkinterのfiledialogクラスを使用して、複数の画像を選択するためのダイアログボックスを開き、images_pathリストに格納します。ダイアログボックスが開く初期ディレクトリ、表示するタイトル、選択可能なファイルの種類を渡します。

ユーザーが選択した画像のすべてのパスを反復処理するループを定義します。Pillowのopen()メソッドを使用して画像ファイルを開き、リサイズメソッドに保持する必要がある最大寸法を渡します。このPIL画像をTkinterと互換性のあるPhotoImageに変換します。前に作成したプレビューフレームに存在するラベルを作成し、画像を表示します。gridマネージャーを使用して、画像を3列のグリッドレイアウトで整理します。

def select_images(self):
self.image_paths = filedialog.askopenfilenames(initialdir="/",, filetypes=(("Image Files", "*.jpg *.png"),))
for i, image_path in enumerate(self.image_paths):
image = Image.open(image_path)
image = self.resize_image(image, width=150, height=150)
photo = ImageTk.PhotoImage(image)
label = tk.Label(self.preview_frame, image=photo)
label.image = photo
label.grid(row=i // 3, column=i % 3, padx=10, pady=10)

画像の寸法と前に定義した最大寸法を考慮して画像のサイズを変更するresize_image()メソッドを定義します。アスペクト比を計算し、それを使用して新しい幅と高さを設定します。PILのリサイズメソッドを使用して、アスペクト比を維持したまま画像のサイズを変更します。より滑らかな結果を得るために、リサンプリングとして双線形補間を使用します。

def resize_image(self, image, width, height):
aspect_ratio = min(width / float(image.size[0]), height / float(image.size[1]))
new_width = int(aspect_ratio * image.size[0])
new_height = int(aspect_ratio * image.size[1])
resized_image = image.resize((new_width, new_height), resample=Image.Resampling.BILINEAR)
return resized_image

画像をPDFに変換する

convert_to_pdf()関数を定義します。filedialogを使用して、PDFの保存先パスを指定します。デフォルトの拡張子とファイルの種類を.pdfに設定します。ReportLabのcanvasモジュールを使用して、横長のページを描画します。画像のパスを反復処理し、それらを開き、PDFのページの寸法を画像の寸法と同じに設定し、指定した寸法で左上から画像を描画します。

showPage()メソッドにより、PDFは次のページに移動できます。プログラムがこの処理を完了したら、PDFを保存し、パスとともにメッセージボックスを表示します。

def convert_to_pdf(self):
pdf_path = filedialog.asksaveasfilename(defaultextension=".pdf", filetypes=(("PDF Files", "*.pdf"),))
c = canvas.Canvas(pdf_path, pagesize=landscape)
for image_path in self.image_paths:
image = Image.open(image_path)
width, height = image.size
c.setPageSize((width, height))
c.drawImage(image_path, 0, 0, width=width, height=height)
c.showPage()
c.save()
messagebox.showinfo("Conversion Successful", f"PDF saved at {pdf_path}")

Tkinterのルートウィンドウを作成し、それをクラスインスタンスに渡します。mainloop()関数は、PythonにTkinterのイベントループを実行し、ウィンドウを閉じるまでイベントをリッスンするように指示します。

if __name__ == "__main__":
root = tk.Tk()
app = ImageToPDFConverter(root)
root.mainloop()

すべてのコードをまとめると、画像からPDFへのコンバーターを使用する準備が整います。

Pythonを使用して画像をPDFに変換する際の出力例

アプリを実行すると、2つのボタンと空白スペースが表示され、画像を選択するように指示されます。

画像を選択ボタンをクリックすると、画像を選択するように求めるウィンドウがポップアップ表示されます。任意の組み合わせで任意の数の画像を選択できます。

目的の画像を選択すると、そのプレビューが表示されます。

PDFに変換ボタンをクリックすると、PDFファイルを保存する名前とパスを選択できます。プログラムが変換を完了すると、PDFが保存されたことを示すメッセージボックスが表示され、その後にパス名が続きます。PDFを開くと、プログラムが画像の寸法を変更せずに画像を変換したことがわかります。

アプリケーションを強化するために実装できるPDF操作

PDFの結合、圧縮、保護、ロック解除などの操作を実行する本格的なPDFアプリケーションを構築できます。PDFを複数のページに分割し、回転させ、特定のページを削除し、並べ替え、ページ番号を追加する機能を構築できます。

ドキュメントやプレゼンテーションをPDFに変換するために、他のファイル形式を試すこともできます。PyPDF2、PDFMiner、fpdf、pdfrwなどのモジュールを使用すると、これらをより便利に実現できます。