渡邉一郎日記

趣味かつ独学の成人男性がPython の様々な内容を記事にして発信しております

【PyPDF2】PythonでPDFを操作してみよう【結合・分割・回転】

PDFファイルの結合・分割・回転は、頻繁ではないけれどどうしても必要になる操作だと思います。
現在では、ネット上にもそうした機能を有するサイトが存在しています。

ただ、業務上の資料や誰にも見られたくないプライベートなファイルに対して、ネット上の機能を使用するのは、セキュリティの観点から気が進まない方もいるかと思います。

この記事では、Pythonのライブラリ:PyPDF2を使ってPDFファイルの結合・分割・回転を行なう方法を説明します。

PyPDF2のインストール

python -m pip install PyPDF2

コマンドプロンプトを起動して、上記コマンドを実行してください。

Pythonライブラリを pip でインストールする方法は、こちらをご覧ください。

watanabe-ichiro-nikki.hatenablog.com

PDFの結合

import PyPDF2 as pp2
import glob

# PDFファイルが入っているフォルダのパス
path = r"C:\Users\owner\pdf_folder"

# フォルダ内の全PDFファイルを読み込み
pdf_list = glob.glob(fr"{path}\*.pdf")

# 結合機能を呼び出し
merger = pp2.PdfMerger()

# ループで全PDFファイルを結合機能へ格納
for pdf in pdf_list:
  merger.append(pdf)

# 結合して保存する
merger.write(fr"{path}\merged.pdf")

# 結合機能を閉じる←必要
merger.close()

上記ソースコードにより、複数のPDFファイルを結合することができます。

フォルダ内から glob.glob() により、".pdf" という文字列で終わる全てのファイルをリスト型で取得しています。

FOR文により取得した全PDFファイルを結合機能である PdfMerger() に追加していきます。

PdfMerger()には close()関数が用意されており、機能を使った最後には close()関数を記述する必要があります。忘れやすいので気をつけましょう。

PDFの分割

import PyPDF2 as pp2

# PDFファイルが入っているフォルダのパス
path = r"C:\Users\owner\pdf_folder"

# フォルダ内のPDFファイル(4ページ)を読み込み
reader = pp2.PdfReader(fr"{path}\pdf-input.pdf")

# ループを使って、各ページをPDFファイルとして出力
# len(reader.pages)→読み込んだPDFファイルの総ページ数
for pages in range(len(reader.pages)):
  # 新しいPDFの格納先を作成 兼 リセット
  writer = pp2.PdfWriter()
  # 格納先にPDFファイルの1ページを追加
  writer.add_page(reader.pages[pages])
  # "wb"を指定して新しいファイルとして保存&with open()によって自動的にcloseさせる
  with open(fr"{path}\split_{str(pages)}.pdf", "wb") as fp:
    writer.write(fp)

"""出力結果
(False, <_io.BufferedWriter name='C:\\Users\\owner\\pdf-folder\\split_0.pdf'>)
(False, <_io.BufferedWriter name='C:\\Users\\owner\\pdf-folder\\split_1.pdf'>)
(False, <_io.BufferedWriter name='C:\\Users\\owner\\pdf-folder\\split_2.pdf'>)
(False, <_io.BufferedWriter name='C:\\Users\\owner\\pdf-folder\\split_3.pdf'>)
"""

上記ソースコードにより、PDFファイルを各ページに分割することができます。

PDFファイルの読み込みには、PdfReader()を使用します。

len(reader.pages)は、読み込んだPDFファイルのページ数を表しています。よって、range(len(reader.pages)) → range(4)ということになります。

FOR文の最初にPdfWriter()を記述している目的は、「PdfWriter()の使用」だけではなく「前のループで追加した1ページを次のループ開始時に削除する」という役割もあります。

PdfReader()とPdfWriter()には close()関数が用意されていません。そのため、ファイル出力に「with open()」の "wb" 機能を使うことで、自動的にcloseされるようになっています。

出力結果には2つの情報が記述されており、これらはwrite()関数を使うと出力される情報(返り値)になります。

出力結果について:

「False」の部分は、writer.write(fp) の fp のデータ型が「str型またはpathlib.Path型」であれば「True」、それ以外であれば「False」となります。write()関数内の処理上、Trueの場合はデータ型を変更して処理を行なうので、この情報が出力されるようになっているのだと思われます。

「<_io.BufferedWriter...>」の部分は、fp の実行結果が記述されています。fp が表しているのはopen("", "wb") です。open("", "wb") を実行すると、「_io.BufferedWriter...」が出力されます。"wb"の部分が「"r"、"w"、"a"、"rb"」であれば違った結果が出力されます。

write()関数の中身に関してはPyPDF2 documentationをご覧ください。

PDFの回転

import PyPDF2 as pp2

# PDFファイルが入っているフォルダのパス
path = r"C:\Users\owner\pdf-folder"

# フォルダ内のPDFファイルを読み込み
reader = pp2.PdfReader(fr"{path}\pdf-input.pdf")

# 新しいPDFの格納先を作成
writer = pp2.PdfWriter()

# ループで全ページを格納先に追加
for pages in reader.pages:
  writer.add_page(pages)

# 1ページ目を右に90度回転させる
rotate_right = writer.pages[0].rotate(90)

# "wb"を指定して新しいファイルとして保存&with open()によって自動的にcloseさせる
with open(fr"{path}\rotated.pdf", "wb") as fp:
  writer.write(fp)

# 出力結果 >>> (False, <_io.BufferedWriter name='C:\\Users\\owner\\pdf-folder\\rotated.pdf'>)

上記ソースコードにより、PDFファイル内の任意のページを回転させることができます。

ページを回転させる rotate()関数は1ページ単位で処理が行われます。今回は4ページ中1ページだけを回転させましたが、全ページを回転させたい場合は .add_page()を行なっているFOR文に追加して処理させると良いでしょう。

また、rotate()関数で指定する角度は90度単位(90, 180, 270)になります。正の角度で指定すると右回り、負の角度で指定すると左回りに回転します。よって、「rotate(90):右回りに90度回転」、「rotate(-90):左回りに90度回転」となります。

まとめ

この記事では、Pythonのライブラリ:PyPDF2を使ってPDFファイルの結合・分割・回転を行なう方法を説明しました。

Pythonを使うことによりオフラインかつ無料でPDFファイルの操作を行なうことができます。

PythonライブラリにはPDFファイル以外にも、ExcelファイルやCSVファイルなどを扱えるものもあるため、目的によって様々な利用方法があります。

Google先生で「python 〇〇」と調べれば、該当するドキュメントや先人達のソースコードを見ることができるため、こういったところから独学を始めるのも良いと思います。