【Python業務効率化】PDF自動処理マスター講座 第1回 PDFの結合・分割・ページ操作を自動化する基本

Python自動化

※本記事にはPR(アフィリエイト広告)が含まれています。

【Python業務効率化】PDF自動処理マスター講座 第1回 PDFの結合・分割・ページ操作を自動化する基本

経理処理、契約書管理、報告書作成など、ビジネスの現場では日々大量のPDFファイルを取り扱います。「複数のPDFを1つにまとめたい」「不要なページだけ削除したい」「特定のページだけ抜き出して別のファイルにしたい」――こうした作業を手作業で行っていると、時間がかかるだけでなく、ミスも発生しやすくなります。

本連載「Python業務効率化】PDF自動処理マスター講座」では、Pythonを使ってPDFに関するあらゆる作業を自動化する方法を、全5回程度に分けてじっくり解説していきます。第1回となる今回は、PDF自動化の基本中の基本である「結合」「分割」「ページ操作」を取り上げます。プログラミング初心者の方でも手を動かしながら理解できるよう、コードの意味を一つひとつ丁寧に説明していきますので、ぜひ最後までお付き合いください。

PDF自動処理の準備をしよう

使用するライブラリ「pypdf」とは

PythonでPDFを操作する際によく使われるライブラリに「PyPDF2」がありますが、現在はその後継である「pypdf」の利用が推奨されています。pypdfはPyPDF2の開発チームが引き継いで開発している純粋なPythonライブラリで、PDFの結合・分割・回転・テキスト抽出・暗号化など、幅広い機能を提供しています。

インストール方法

以下のコマンドをターミナル(またはコマンドプロンプト)で実行し、pypdfをインストールします。

pip install pypdf

インストールが完了したら、Pythonスクリプト内で以下のようにインポートできるか確認しましょう。

from pypdf import PdfReader, PdfWriter

print("pypdfのインポートに成功しました")

エラーが出なければ準備は完了です。これ以降のサンプルコードでは、このpypdfを使って解説を進めていきます。

複数のPDFを1つにまとめる「結合」処理

会議資料や複数部門からの報告書など、別々に作成されたPDFを1つのファイルにまとめたい場面は非常に多くあります。pypdfのPdfWriterを使えば、わずか数行で複数のPDFを結合できます。

基本の結合コード

from pypdf import PdfWriter

# 結合したいPDFファイルのリスト
pdf_list = ["report_01.pdf", "report_02.pdf", "report_03.pdf"]

writer = PdfWriter()

# リストの順番通りにページを追加していく
for pdf_path in pdf_list:
    writer.append(pdf_path)

# 結合結果を新しいファイルとして保存
with open("merged_report.pdf", "wb") as output_file:
    writer.write(output_file)

print("PDFの結合が完了しました")

PdfWriterのappend()メソッドにファイルパスを渡すだけで、ページがそのまま追加されていきます。リストの順番がそのまま結合後のページ順になる点がポイントです。

フォルダ内のPDFを一括で結合する

実務では「フォルダ内のPDFを全部まとめて結合したい」というケースも多いでしょう。その場合は、標準ライブラリのglobやpathlibを組み合わせると便利です。

from pathlib import Path
from pypdf import PdfWriter

folder = Path("./input_pdfs")
# ファイル名順(辞書順)にソートして取得
pdf_files = sorted(folder.glob("*.pdf"))

writer = PdfWriter()
for pdf_file in pdf_files:
    writer.append(str(pdf_file))

with open("all_merged.pdf", "wb") as f:
    writer.write(f)

ファイル名に「01_」「02_」のような連番を付けておくと、ソート順=希望の結合順になりやすいため、実務ではこの命名ルールを徹底しておくと後の自動化がスムーズになります。

PDFを目的に応じて切り分ける「分割」処理

反対に、1つの大きなPDFから必要なページだけを取り出したり、ページ単位で別ファイルに分割したりしたい場合もあります。こちらもPdfReaderとPdfWriterの組み合わせで実現できます。

全ページを1ページずつファイル分割する

from pypdf import PdfReader, PdfWriter

reader = PdfReader("source.pdf")

for i, page in enumerate(reader.pages):
    writer = PdfWriter()
    writer.add_page(page)

    output_filename = f"page_{i + 1:03d}.pdf"
    with open(output_filename, "wb") as f:
        writer.write(f)

print(f"{len(reader.pages)}ページを分割しました")

reader.pagesはページオブジェクトのリストのように扱えるため、enumerate()でループを回しながら1ページずつ新しいPdfWriterに追加して保存しています。ファイル名のゼロ埋め(:03d)をしておくと、ファイル一覧がきれいに数字順で並ぶのでおすすめです。

指定した範囲だけを抜き出す

「5〜10ページだけ抜き出したい」というように、特定範囲だけを1つのファイルとして切り出すことも可能です。

from pypdf import PdfReader, PdfWriter

reader = PdfReader("source.pdf")
writer = PdfWriter()

# 5ページ目から10ページ目まで(インデックスは0始まりなので-1する)
start_page = 5 - 1
end_page = 10

for page in reader.pages[start_page:end_page]:
    writer.add_page(page)

with open("extracted_pages.pdf", "wb") as f:
    writer.write(f)

Pythonのリストはインデックスが0から始まるため、「人間が数える5ページ目」はreader.pages[4]になる点に注意してください。このズレは初心者がつまずきやすいポイントなので、必ず意識しておきましょう。

ページ単位で加工する「回転・削除・入れ替え」の基本

結合・分割に加えて、個々のページに対する細かな操作もpypdfだけで対応できます。スキャンした書類が横向きになっていたり、不要な表紙だけ削除したいといったケースで役立ちます。

ページを回転させる

from pypdf import PdfReader, PdfWriter

reader = PdfReader("scanned.pdf")
writer = PdfWriter()

for page in reader.pages:
    # 時計回りに90度回転
    page.rotate(90)
    writer.add_page(page)

with open("rotated.pdf", "wb") as f:
    writer.write(f)

rotate()メソッドに角度を指定するだけで、ページの向きを変更できます。90、180、270といった90度単位の値を指定するのが一般的です。

特定のページだけ削除する

from pypdf import PdfReader, PdfWriter

reader = PdfReader("document.pdf")
writer = PdfWriter()

# 3ページ目(インデックス2)を除外してコピーする
pages_to_remove = {2}

for i, page in enumerate(reader.pages):
    if i not in pages_to_remove:
        writer.add_page(page)

with open("document_removed.pdf", "wb") as f:
    writer.write(f)

「削除する」という直接的な機能こそありませんが、「削除したいページ以外を新しいファイルにコピーする」という発想に切り替えることで、同じ結果を得られます。この考え方はPDF操作全般でよく使うテクニックなので覚えておくと便利です。

ページの順番を入れ替える

from pypdf import PdfReader, PdfWriter

reader = PdfReader("document.pdf")
writer = PdfWriter()

# 元の順番が [0,1,2,3] だったものを [1,0,3,2] の順にしたい場合
new_order = [1, 0, 3, 2]

for index in new_order:
    writer.add_page(reader.pages[index])

with open("reordered.pdf", "wb") as f:
    writer.write(f)

入れ替えたい順番をリストで定義し、そのリストの通りにページを追加していくだけで、好きな順序に並べ替えることができます。

まとめ

今回は「Python業務効率化】PDF自動処理マスター講座」の第1回として、pypdfライブラリを使ったPDFの基本操作を解説しました。

  • pypdfをインストールすれば、少ないコードでPDF操作を自動化できる
  • PdfWriter.append()で複数PDFを簡単に結合できる
  • PdfReader.pagesをループ処理すれば、1ページ単位や範囲指定での分割ができる
  • 「削除したいページを除いてコピーする」という発想で、削除・並べ替えも実現できる
  • rotate()でページの向きも自在に変更できる

これらの基本操作を組み合わせるだけでも、日々のPDF関連作業の多くを自動化できます。まずは今回のコードを実際に手元の環境で動かしてみて、ご自身の業務で使いそうなPDFファイルで試してみてください。

次回「第2回」では、PDFからのテキスト抽出やメタデータの編集、さらにはパスワード設定・解除といった、より実践的なPDF操作について解説していく予定です。ぜひ引き続きご覧ください。

PR

\ 初心者から未経験でプロを目指す /

Pythonプログラミング マンツーマン詳細はこちら >

Photo by Florian Olivo on Unsplash

タイトルとURLをコピーしました