【Python】PDFファイルを結合・分割する方法

当サイトで紹介する商品・サービス等の外部リンクは、アフィリエイト広告を含む場合があります。
スポンサーリンク
本記事を読むと以下の実行ができます
  • PDFファイルを結合する。
  • PDFを1ページずつ分割する。

Pythonを使えば、複数のPDFファイルを1つに結合できるだけでなく、
複数のPDFファイルを1つずつ分割することも簡単にできます。

本記事では、PyPDF2ライブラリを使用してPDFを分割や結合などの
操作を実行する方法を詳しく解説します。

本記事は次の人におすすめ
  • PythonでPDFを操作したい。
  • 紙の書類をデジタル化し、管理したい
  • 多数のPDFファイルを扱いたい人
  • 学術論文や研究資料を整理する学生や研究者
  • PDFを利用したドキュメント管理を効率化したいエンジニア
スポンサーリンク

PyPDF2の機能と使う場面

PyPDF2は、PythonでPDFファイルを操作するためのライブラリです。

PyPDF2を使う場面
  • PDFの結合と分割: 複数のPDFファイルを一つにまとめる、PDFファイルをページ単位で分割。
  • ページの抽出と追加: 特定のページを抽出、新しいページの追加。
  • メタデータの操作: PDFのメタデータ(タイトル、著者、作成日など)の読み取り、変更。

PDFの結合

import PyPDF2

# PDFファイルを読み込む
pdf1 = open('document1.pdf', 'rb')
pdf2 = open('document2.pdf', 'rb')

# PdfMergerオブジェクトを作成
merger = PyPDF2.PdfMerger()

# PDFファイルを追加
merger.append(pdf1)
merger.append(pdf2)

# 結合されたPDFをファイルとして書き出し
with open('new_document.pdf', 'wb') as output:
    merger.write(output)

# リソースを解放
pdf1.close()
pdf2.close()
merger.close()

PDFファイルをページ単位で分割

import PyPDF2

# 分割するPDFファイルを開く
input_pdf = open('document.pdf', 'rb')

# PdfReaderオブジェクトを作成
reader = PyPDF2.PdfReader(input_pdf)

# 分割されたページを新しいPDFファイルとして保存
for i in range(len(reader.pages)):
    writer = PyPDF2.PdfWriter()
    writer.add_page(reader.pages[i])
    
    with open(f'page_{i+1}.pdf', 'wb') as output_pdf:
        writer.write(output_pdf)

# リソースを解放
input_pdf.close()

ページの抽出

import PyPDF2

# 抽出するPDFファイルを開く
input_pdf = open('document.pdf', 'rb')

# PdfReaderオブジェクトを作成
reader = PyPDF2.PdfReader(input_pdf)

# 抽出するページ(1ページ目)
page = reader.pages[0]

# 新しいPDFファイルに抽出したページを追加
writer = PyPDF2.PdfWriter()
writer.add_page(page)

# 抽出したページを保存
with open('extracted_page.pdf', 'wb') as output_pdf:
    writer.write(output_pdf)

# リソースを解放
input_pdf.close()

PDFのメタデータを読み取る

import PyPDF2

# PDFファイルを開く
input_pdf = open('document.pdf', 'rb')

# PdfReaderオブジェクトを作成
reader = PyPDF2.PdfReader(input_pdf)

# メタデータを取得
metadata = reader.metadata

# メタデータを表示
print(metadata)

# リソースを解放
input_pdf.close()

フォルダー内すべてのPDFを1つに結合する

ユーザーが選択したフォルダー内のすべてのPDFファイルを結合し、
1つのPDFファイルとして保存します。

Tkinterを使用してフォルダー選択ダイアログを表示し、
選択されたフォルダー内のPDFファイルをPyPDF2のPdfMergerクラスで結合します。

ソースコード

import os
from PyPDF2 import PdfMerger
from tkinter import Tk, filedialog

# Tkinterを使用してフォルダー選択ダイアログを表示
root = Tk()
root.withdraw()  # メインウィンドウを表示しないようにする
folder_path = filedialog.askdirectory()

if folder_path:
    # フォルダー名を取得
    folder_name = os.path.basename(folder_path)

    # PdfMergerオブジェクトを作成
    merger = PdfMerger()

    # フォルダー内のすべてのPDFファイルを取得し、結合
    for filename in os.listdir(folder_path):
        if filename.endswith('.pdf'):
            file_path = os.path.join(folder_path, filename)
            merger.append(file_path)

    # 結合されたPDFファイルの保存
    output_path = os.path.join(folder_path, f'{folder_name}.pdf')
    merger.write(output_path)
    merger.close()

    print(f"結合されたPDFファイルが{output_path}に保存されました。")
else:
    print("フォルダーが選択されませんでした。")

Pythonの学習進め方

Pythonでできることは多岐に渡ります。

Pythonでできること
  • 機械学習・人工知能
  • データ解析・統計分析
  • ファイル操作・システム管理
  • GUIアプリ開発

Pythonは強力で柔軟なプログラミング言語ですが、常に情報がアップデートされるので、
新しいライブラリやフレームワークを独学で学び続けることは困難です。

Udemyは動画で目的に応じた講座を受講できるのでレベルを合わせて学習できます。
購入した講座は再生・停止・スキップなどが可能なオンデマンド形式なので、
専門的な内容を自分のペースで独学できます。

Udemyの特徴
  • プロのエンジニアによる講習が受けられる
  • 自分のペースで学習を進められる
  • オンデマンド形式だから何度でも視聴可能
  • 不満足なコースは視聴していても返金可能返金ポリシー

Pythonでデータサイエンスや人工知能、GUIを学びたい人はUdemy学習を取り入れましょう。
数多くある講座の中から特におすすめな講座を5つ紹介します。

ビックセール開催中(10月11日まで)
対象のコースが1500円から(最大95%OFF)

多彩な講座から自分に合った講座を探そう!

最大94%OFF

終了まで

時間

Pythonをインストールから環境設定、基本文法が学習できる。さらに、モジュールの使い方やファイル操作の他に暗号化、並列化、インフラ自動化、キューイングシステム、非同期処理についても学べます。

Pythonの基礎を押さえつつ、人口知能やニューラルネットワーク、機械学習を取り扱う。機械学習ライブラリで文字認識や株価分析などを行う。

データサイエンティストになるために必要なツールについて学ぶことができる。統計分析、NumpyやPandasなどを使ったPythonのプログラミング、機械学習の実装、ディープラーニングの実装を学習できる。

PythonでGUIを作成する方法を取り扱う。Tkinterの発展的な操作まで学習できる。翻訳アプリ、家計簿アプリ、電卓アプリ、音楽再生アプリなど作成して、exeファイル化する。

解説

  • モジュール名

「os」:ファイルパスの操作やフォルダーのリストを取得します。
「PyPDF2」:PDFファイルの読み取りおよび書き込みを行います。
「tkinter」:GUIを使用してフォルダー選択ダイアログを表示します。

PyPDFは、標準ライブラリではないので、インストール必要があります。
コマンドプロンプト(Windows)に入力して、実行します。

pip install PyPDF2
  • フィールド(メンバ変数)

「root」:Tkinterのメインウィンドウオブジェクト。GUIダイアログの親ウィンドウとして機能する。
「folder_path」:ユーザーが選択したフォルダーのパス。
「folder_name」:選択したフォルダーの名前。
「merger」:PDFファイルを結合するためのPdfMergerオブジェクト。
「output_path」:結合されたPDFファイルの保存先パス。

  • それぞれのクラス(関数・メソッド)

PdfMergerクラス
PDFファイルを結合するためのオブジェクトを提供します。
ファイルを追加していき、最終的に1つのPDFファイルとして出力します。

Tkクラス
Tkinterのメインウィンドウオブジェクトを作成します。
GUIアプリケーションの基本ウィンドウとして機能します。

filedialog.askdirectoryメソッド
フォルダー選択ダイアログを表示し、
ユーザーが選択したフォルダーのパスを取得します。

os.path.basenameメソッド
指定されたパスからフォルダー名を取得します。

os.listdirメソッド
指定されたフォルダー内のファイルとサブフォルダーのリストを取得します。

merger.appendメソッド
指定されたPDFファイルを結合するために追加します。

merger.writeメソッド
結合されたPDFファイルを指定されたパスに保存します。

merger.closeメソッド
PdfMergerオブジェクトを閉じてリソースを解放します。

実演

フォルダー選択ダイアログが表示されるので、
結合したいPDFファイルが含まれているフォルダーを選択します。

選択されたフォルダー内のすべてのPDFファイルが結合され、
新しいPDFファイルとして保存されます。

フォルダー内のPDFを1ページずつ分割

ユーザーが選択したフォルダー内のすべてのPDFファイルを各ページごとに分割し、
個別のPDFファイルとして保存します。

フォルダー内の各PDFファイルを読み込み
それぞれのページを新しいPDFファイルとして保存します。

ソースコード

import os
from PyPDF2 import PdfReader, PdfWriter
from tkinter import Tk, filedialog

# Tkinterを使用してフォルダー選択ダイアログを表示
root = Tk()
root.withdraw()  # メインウィンドウを表示しないようにする
folder_path = filedialog.askdirectory()

if folder_path:
    # 出力用のフォルダーを作成
    output_folder = os.path.join(folder_path, 'split_pages')
    os.makedirs(output_folder, exist_ok=True)

    # フォルダー内のすべてのPDFファイルを処理
    for filename in os.listdir(folder_path):
        if filename.endswith('.pdf'):
            file_path = os.path.join(folder_path, filename)
            pdf = PdfReader(file_path)

            # 各ページを個別のPDFファイルとして保存
            for page_num in range(len(pdf.pages)):
                pdf_writer = PdfWriter()
                pdf_writer.add_page(pdf.pages[page_num])

                # 新しいPDFファイル名を作成
                output_filename = os.path.join(output_folder, f'{os.path.splitext(filename)[0]}_page_{page_num + 1}.pdf')
                with open(output_filename, 'wb') as output_pdf:
                    pdf_writer.write(output_pdf)

    print(f"分割されたPDFファイルが{output_folder}に保存されました。")
else:
    print("フォルダーが選択されませんでした。")

解説

上記と同じモジュールとフィールドは省略します。

  • フィールド(メンバ変数)

「filename」:現在処理中のPDFファイルの名前。
「file_path」:現在処理中のPDFファイルのフルパス。
「pdf」:現在読み込まれているPDFファイルのPdfReaderオブジェクト。
「page_num」:現在処理中のページ番号。
「pdf_writer」:新しいPDFファイルを作成するためのPdfWriterオブジェクト。
「output_filename」:分割された各ページのPDFファイル名。

  • それぞれのクラス(関数・メソッド)

PdfReaderクラス
PDFファイルを読み取るためのオブジェクトを提供します。
PDFファイルを開いてページごとの情報にアクセスできます。

PdfWriterクラス
PDFファイルを作成するためのオブジェクトを提供します。
ページを追加して新しいPDFファイルとして保存します。

os.path.joinメソッド
複数のパスコンポーネントを結合して1つのパスを作成します。

os.makedirsメソッド
指定されたパスにディレクトリを作成します。
exist_ok=Trueオプションを指定することで、すでに存在する場合でもエラーを発生させません。

os.listdirメソッド
指定されたフォルダー内のファイルとサブフォルダーのリストを取得します。

pdf_writer.add_pageメソッド
PdfWriterオブジェクトにページを追加します。

pdf_writer.writeメソッド
PdfWriterオブジェクトの内容を指定されたファイルに書き込みます。

os.path.splitextメソッド
ファイル名と拡張子を分割します。

実演

フォルダー選択ダイアログが表示されるので、
分割したいPDFファイルが含まれているフォルダーを選択します。

選択されたフォルダー内のすべてのPDFファイルがページごとに分割され、
新しいPDFファイルとして保存されます。

まとめ

この記事では、Pythonを使ってPDFファイルを結合および分割する方法を紹介しました。
PyPDF2ライブラリを使用することで、これらの操作を簡単に実行できます。

業務効率化や資料管理の向上に有効となります。

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