概要
デジタル化プロセス中にしばしば直面するのが、スキャンされた書類のページ順序が乱れる問題です。このブログでは、Pythonを活用して、不規則に配列されたPDFページを正しい順序に自動的に並べ替える方法を解説します。この技術は、特に大量の文書を扱う業務で時間の節約と効率化を実現します。
使用例(具体例)
地方図書館が古い新聞記事をデジタル化するプロジェクトを行っているとします。しかし、スキャンされたPDFファイルがページ順序通りになっておらず、右側に1ページ目、左側に最終ページのように順序が逆になってしまっています。このスクリプトを使用することで、これらのページを正しい順序で自動的に再配置し、アーカイブの質を向上させることができます。
必要なPythonライブラリ
- PyPDF2: PDFファイルを操作(読み込み、書き込み、ページの再配置など)するためのライブラリです。このライブラリにより、PDF内の各ページにアクセスし、必要に応じて操作を行うことができます。
- openpyxl: Excelファイル(.xlsxフォーマット)を読み書きするためのライブラリです。これもインストールが必要です。
必要なエクセルファイル
ページ順は順序指定ファイル(excelファイル)で指定します。A列に並べ替える前の順番、B列に並べ替えた後の順番を入力したファイルを入力してください。サンプルファイルは下記からダウンロードしてください。
使用手順
- ライブラリのインストール: コマンドプロンプトまたはターミナルを開き、以下のコマンドでPyPDF2をインストールします。
pip install PyPDF2
- スクリプトの準備: 下記のPythonスクリプトをテキストエディタにコピーし、必要に応じてファイル名を調整します。
- スクリプトの実行: スクリプトを保存し、Python環境で実行します。この操作により、ダイアログが表示されて、「順序変更前ファイル(pdf)の選択」、「順序指定ファイル(excel)の選択」、「順序変更後ファイル(pdf)の保存先の選択」を行います。すると指定された入力PDFのページが新しい順序で正しく再配置されます。
プログラム
下記のコードをメモ帳などに丸々コピーしてpythonファイル(〇〇.py)にしてください。
import tkinter as tk
from tkinter import filedialog
from PyPDF2 import PdfReader, PdfWriter
import openpyxl
import os
def reorder_pdf_pages(pdf_path, excel_path, output_pdf_path):
# Excelファイルを読み込む
wb = openpyxl.load_workbook(excel_path)
sheet = wb.active
# A列からB列へのページ番号マッピングを読み取る
page_mapping = {}
for row in sheet.iter_rows(min_row=1, min_col=1, max_col=2, values_only=True):
if row[0] is not None and row[1] is not None:
original_page = int(row[0]) - 1 # 1を引いて0ベースに変換
new_page = int(row[1]) - 1 # 同じく1を引いて0ベースに変換
page_mapping[original_page] = new_page
# PDFファイルを読み込み
pdf_reader = PdfReader(pdf_path)
pdf_writer = PdfWriter()
# マッピング情報に基づいてPDFのページを再配置
sorted_pages = [None] * len(pdf_reader.pages)
for original_page, new_page in page_mapping.items():
if original_page < len(pdf_reader.pages):
sorted_pages[new_page] = pdf_reader.pages[original_page]
# Noneのページを除外してPDFに追加
for page in sorted_pages:
if page is not None:
pdf_writer.add_page(page)
# 新しいPDFファイルを保存
with open(output_pdf_path, "wb") as output_pdf_file:
pdf_writer.write(output_pdf_file)
def main():
root = tk.Tk()
root.withdraw() # Tkinterのルートウィンドウを表示しない
# PDFファイルを選択
pdf_file_path = filedialog.askopenfilename(
title="PDFファイルを選択してください",
filetypes=[("PDF files", "*.pdf")]
)
if not pdf_file_path:
return
# Excelファイルを選択
excel_file_path = filedialog.askopenfilename(
title="Excelファイルを選択してください",
filetypes=[("Excel files", "*.xlsx")]
)
if not excel_file_path:
return
# 保存するファイル名を指定
output_pdf_path = filedialog.asksaveasfilename(
title="保存するPDFファイル名を指定してください",
filetypes=[("PDF files", "*.pdf")],
defaultextension=".pdf"
)
if not output_pdf_path:
return
# PDFファイルのページ順序を変更
reorder_pdf_pages(pdf_file_path, excel_file_path, output_pdf_path)
print(f"PDFファイルが保存されました: {output_pdf_path}")
if __name__ == "__main__":
main()
あるいは、下のテキストファイルをダウンロードし、「.txt」を「.py」に変えることでそのまま使えます。
pdf-excelソートくん
まとめ
このPythonスクリプトは、スキャンされたPDFファイルのページを簡単かつ迅速に正しい順序に再配置するための有効なツールです。PyPDF2ライブラリを使用することで、手動でページを並べ替える手間を省き、時間と労力を大幅に削減します。この自動化プロセスは、特に大規模なアーカイブや図書館の文書整理において、非常に役立ちます。