PDF Pythonツール

PythonでPDFファイルを結合してしおりを自動作成する方法

概要

このブログでは、Pythonを使用して複数のPDFファイルを一つに結合し、その過程で各PDFファイルのタイトルをしおりとして設定する方法を紹介します。この手法は文書の管理を効率化し、大量のPDF文書を簡単にナビゲート可能にするために役立ちます。

使用例

  • 月次レポートやプロジェクトの文書を一つのファイルにまとめ、各セクションへのアクセスを容易にする。
  • スキャンした文書や請求書などを一つのファイルに結合し、しおりを使って迅速に必要な部分を見つける。

必要なPythonライブラリとインストール方法

このプログラムには以下のPythonライブラリが必要です:

  • PyPDF2: PDF読み込みと書き込みを行います。
  • tkinter: グラフィカルユーザーインターフェイスを作成します。
  • tkinterdnd2: ドラッグアンドドロップ機能をGUIに追加します。

これらのライブラリをインストールするには、次のコマンドを実行してください:

pip install pypdf2
pip install tk
pip install tkinterdnd2

使用手順

  1. 必要なライブラリをインストールします。
  2. 下記のプログラムコードをPythonファイルとして保存します。
  3. スクリプトを実行して、PDFファイルをドラッグアンドドロップでGUIに追加します。
  4. 「Merge PDFs」ボタンをクリックして結合し、しおり付きのPDFを生成します。

注意点

  • このスクリプトはPDFファイルのみをサポートしており、それ以外のファイル形式は無視されます。
  • 大量のファイルを一度に結合する場合、処理に時間がかかることがあります。

プログラム

下記のコードをメモ帳などに丸々コピーしてpythonファイル(〇〇.py)にしてください。

import os
from tkinter import Tk, Canvas, Label, Button, filedialog, messagebox, ttk
from tkinterdnd2 import DND_FILES, TkinterDnD
from PyPDF2 import PdfReader, PdfWriter

def merge_pdfs(files, output_path):
pdf_writer = PdfWriter()
current_page = 0 # 現在のページ数を追跡

for file_path in files:
pdf_reader = PdfReader(file_path)
pdf_writer.add_outline_item(title=os.path.basename(file_path)[:-4], page_number=current_page)
for page in pdf_reader.pages:
pdf_writer.add_page(page)
current_page += 1

with open(output_path, 'wb') as out:
pdf_writer.write(out)

def add_files(event):
file_paths = root.tk.splitlist(event.data)
for file_path in file_paths:
if file_path.endswith('.pdf') and file_path not in pdf_files:
pdf_files.append(file_path)
label.config(text=f"Added: {os.path.basename(file_path)}")
update_status()

def update_status():
status_label.config(text=f"Total files: {len(pdf_files)}")

def clear_files():
pdf_files.clear()
label.config(text="Files cleared")
update_status()

def save_file():
if not pdf_files:
messagebox.showinfo("Error", "No PDF files to merge!")
return
output_path = filedialog.asksaveasfilename(defaultextension=".pdf", filetypes=[("PDF files", "*.pdf")])
if output_path:
merge_pdfs(pdf_files, output_path)
messagebox.showinfo("Success", "PDFs have been merged successfully!")
clear_files()

root = TkinterDnD.Tk()
root.title('PDF Merger with Bookmarks')
root.geometry('400x300')

pdf_files = []

canvas = Canvas(root, width=400, height=250, bg='lightgrey')
canvas.pack(fill="both", expand=True)
canvas.drop_target_register(DND_FILES)
canvas.dnd_bind('<<Drop>>', add_files)

label = Label(root, text="Drag and drop PDF files here", bg='lightgrey')
label.place(relx=0.5, rely=0.5, anchor='center')

status_label = Label(root, text="Total files: 0")
status_label.pack(side="bottom", fill="x")

merge_button = Button(root, text="Merge PDFs", command=save_file)
merge_button.pack(side="bottom", fill="x")

clear_button = Button(root, text="Clear Files", command=clear_files)
clear_button.pack(side="bottom", fill="x")

root.mainloop()

あるいは、下のテキストファイルをダウンロードし、「.txt」を「.py」に変えることでそのまま使えます。

まとめ

このPythonスクリプトを使用することで、PDFファイルの結合が簡単になるだけでなく、しおりを自動で追加することができます。これにより、大量のPDFを効果的に管理し、必要な情報に迅速にアクセスすることが可能になります。ドラッグアンドドロップ機能を備えた直感的なGUIは、このプロセスをさらに簡単にします。

-PDF, Pythonツール