Pythonで簡単にPDFを分割する
前回Pythonを使ってPDFの結合を行いました。PDFの結合よりも需要が少ないかもしれませんが、Pythonを利用すればPDF分割も簡単に行うことができます。作成するPythonコードはたったの12行です。入門者でもわかるように1行、1行説明を行っています。
公開当時はPyPDF2のバージョン1でしたがバージョンが3にアップして今後の継続はpypdfで行われると発表されています。PyPDF2を利用しても引き続きPDFの分割を行うことはできますが今後利用する際はPyPDF2ではなくpfpdfを利用してください。
目次
pypdfパッケージのインストール
Windows11で動作確認を行っています。
PythonでPDFの分割や結合を行うためには、Pythonの標準ライブラリには含まれていないpypdfパッケージをインストールする必要があります。インストールはパッケージ管理のpipを利用して行います。
> pip install pypdf
Collecting pypdf
Downloading pypdf-3.17.2-py3-none-any.whl.metadata (7.5 kB)
Downloading pypdf-3.17.2-py3-none-any.whl (277 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 277.9/277.9 kB 2.1 MB/s eta 0:00:00
Installing collected packages: pypdf
Successfully installed pypdf-3.17.2
pip listコマンドを利用するとインストールが正常に行われているか確認することができます。
$pip list
Package Version
------- -------
pip 23.3.1
pypdf 3.17.2
複数のPDFを1ページ毎に分割
pythonのプログラムファイルが保存されているフォルダの中に分割を行いたいPDFファイルが1つ(test.pdf)入っている状況でそのPDFファイルを分割し、test-1.pdf, test-2.pdf…というようにページ毎にPDFファイルを作成します。
import glob,os
from pypdfimport PdfReader,PdfWriter
for file_name in glob.glob('*.pdf'):
(name, extention) = os.path.splitext(file_name)
pdf_file_reader = PdfReader(file_name)
page_nums = len(pdf_file_reader.pages)
for num in range(page_nums):
file_object = pdf_file_reader.pages[num]
pdf_file_name = name + '-' + str(num+1) + '.pdf'
pdf_file_writer = PdfWriter()
with open(pdf_file_name,'wb') as f:
pdf_file_writer.add_page(file_object)
pdf_file_writer.write(f)
PyPDF2パッケージのインストール
Windows11で動作確認を行っています。
PythonでPDFの分割や結合を行うためには、Pythonの標準ライブラリには含まれていないPyPDF2パッケージをインストールする必要があります。インストールはパッケージ管理のpipを利用して行います。
> pip install pypdf2
Collecting pypdf2
Downloading pypdf2-3.0.1-py3-none-any.whl (232 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 232.6/232.6 kB 1.6 MB/s eta 0:00:00
Installing collected packages: pypdf2
Successfully installed pypdf2-3.0.1
pip listコマンドを利用するとインストールが正常に行われているか確認することができます。
$pip list
Package Version
------- -------
pip 23.3.1
pypdf 3.17.2
PyPDF2 3.0.1
複数のPDFを1ページ毎に分割
pythonのプログラムファイルが保存されているフォルダの中に分割を行いたいPDFファイルが1つ(test.pdf)入っている状況でそのPDFファイルを分割し、test-1.pdf, test-2.pdf…というようにページ毎にPDFファイルを作成します。
PyPDF2のバージョン2の場合
PyPDF2のバージョン2までのコードは下記の通りです。
import glob,os #(1)
from PyPDF2 import PdfFileWriter, PdfFileReader #(2)
for file_name in glob.glob('*.pdf'): #(3)
(name, extention) = os.path.splitext(file_name) #(4)
pdf_file_reader = PdfFileReader(file_name) #(5)
page_nums = pdf_file_reader.getNumPages() #(6)
for num in range(page_nums): #(7)
file_object = pdf_file_reader.getPage(num) #(7)
pdf_file_name = name + '-' + str(num+1) + '.pdf' #(8)
pdf_file_writer = PdfFileWriter() #(9)
with open(pdf_file_name,'wb') as f: #(10)
pdf_file_writer.addPage(file_object) #(11)
pdf_file_writer.write(f) #(12)
1行毎に説明を行っていきます。
- #(1)では、PDFのファイル名を取得するためにglob、取得したファイル名をファイルの名前と拡張子にわけるためにosをimportしています。
- #(2)PDFを読み込むためにPdfFileReader、分割したPDFファイルを作成するためにPdfFileWriterを利用するため、importしています。
- #(3)でglobを使ってファイル名を取得していてます。
- #(4)os.path.splitextでファイル名と名前と拡張子を個別に取り出しています。
- #(5)PdfFileReaderを使ってファイルの中身を取得しています。
- #(6)PdfFileReaderのgetNumPagesメソッドでPDFファイルに含まれるPDFのページ数を取得しています。
- #(7)getPageメソッドにページ数を指定することでそのページのPDFの内容を取り出しています。
- #(8)分割する際に作成されるファイル名のルールを決めています。ファイル名-ページ番号.pdfで作成されます。test.pdfで分割するとtest-1.pdfが作成されます。
- #(9)PdfFileWriterをインスタンス化して変数pdf_file_writerに入れています
- #(10)openメソッドのwbモード(write,binary)でファイルをオープンしています。ファイル名は#(8)で設定されたものです。
- #(11)PdfFileWriterのaddPageメソッドを使用して、pdf_file_writerに#(7)で取り出したPDFの中身を追加しています。
- #(12)openしたファイルに#(11)で追加したPDFの中身を書き込んでいます。
test.pdfというファイルが存在し、2枚のページで構成されている場合は、pyファイルが存在するフォルダに保存して、実行するとtest-1.pdfとtest-2.pdfファイルが作成されます。
PyPDF2のバージョン3の場合
PyPDF2のバージョン3の場合ではPdfFileWriterがPdfWriter, PdfFileReaderがPdfRead, ページ数もlen(pdf_file_reader.pages)で取得するなどメソッドが変更になっています。
import glob,os
from PyPDF2 import PdfReader,PdfWriter
for file_name in glob.glob('*.pdf'):
(name, extention) = os.path.splitext(file_name)
pdf_file_reader = PdfReader(file_name)
page_nums = len(pdf_file_reader.pages)
for num in range(page_nums):
file_object = pdf_file_reader.pages[num]
pdf_file_name = name + '-' + str(num+1) + '.pdf'
pdf_file_writer = PdfWriter()
with open(pdf_file_name,'wb') as f:
pdf_file_writer.add_page(file_object)
pdf_file_writer.write(f)
Pythonランチャーを使う
WindowsではpyファイルがPythonランチャーに関連付けられていればファイル名をダブルクリックするだけでプログラムを実行することができます。
ファイルを右クリックするとpyファイルに関連付いているアプリケーションがわかるので確認を行ってください。ロケットのアイコンが特徴です。
関連付けられていればダブルクリックするだけで分割のプログラムが実行されます。