この記事は、PythonでPDFを扱うシリーズの3回目です。
- ページの読み込みと分割
- 画像と透かしを追加する
- ページの挿入、削除、並べ替え (現在地)
この記事は、PythonでPDFを扱うための小さなシリーズのパート3です。前回の記事では、Pythonを使用してPDFドキュメントを読むための入門を行いました。これまでに、既存のPDFを操作する方法や、テキストと画像の両方を読み込んで抽出する方法について学びました。さらに、文書を1つのページに分割したり、透かしやバーコードを追加したりすることも説明しました。
この記事では、さらに一歩進んで、いくつかの異なる方法で PDF 文書を並べ替える方法を紹介します。
- pdfrwによるページの削除
- PyMuPDFによるページの削除
- PyMuPDF によるページの挿入
- PyPDF2による偶数ページと奇数ページの分割
pdfrwでページを削除する
PDFファイルから個々のページを削除するのは、以下のように簡単です。
- 入力ファイルとしてPDFを読み込む
- 選択したページを出力ファイルとして新しいPDFに書き込む
次の例では、PDF文書から最初の2ページを削除しています。pdfrwライブラリを使って、まずPdfReader()
クラスの助けを借りてファイルを読み込みます。最初のページと2番目のページを除き、各ページは addpage()
メソッドを用いて出力ファイルに追加され、最終的にディスクに書き込まれます。
図1は、4ページのPDFファイルに対してこのコードを実行したときの出力を示しています。
# !/usr/bin/python
# Remove the first two pages (cover sheet) from the PDF
from pdfrw import PdfReader, PdfWriter
input_file = "example.pdf"
output_file = "example-updated.pdf"
# Define the reader and writer objects
reader_input = PdfReader(input_file)
writer_output = PdfWriter()
# Go through the pages one after the next
for current_page in range(len(reader_input.pages)):
if current_page > 1:
writer_output.addpage(reader_input.pages[current_page])
print("adding page %i" % (current_page + 1))
# Write the modified content to disk
writer_output.write(output_file)
PyMuPDFでページを削除する
PyMuPDFライブラリには、PDFファイルからページを削除するのを簡単にする洗練されたメソッドが多数付属しています。このライブラリでは、単一のページ(deletePage()
メソッドを使用)、ページ番号の範囲(deletePageRange()
メソッドを使用)、またはページ番号のリスト(select()
メソッドを使用)のいずれかを指定することが可能です。
以下の例では、オリジナルドキュメントから残すべきページを選択するために、リストを使用する方法を示します。指定されていないページは、出力されるドキュメントに含まれないことに注意してください。この例では、出力文書には1、2、4ページ目だけが含まれます。
# !/usr/bin/python
# Recall that PyMuPDF is imported as fitz
import fitz
input_file = "example.pdf"
output_file = "example-rearranged.pdf"
# Define the pages to keep - 1, 2 and 4
file_handle = fitz.open(input_file)
pages_list = [0,1,3]
# Select the pages and save the output
file_handle.select(pages_list)
file_handle.save(output_file)
PyMuPDFでページを挿入する
PyMuPDFライブラリでは、ページを挿入することもできます。完全に白紙のページを追加するためのメソッド newPage()
と、既存のページを追加するためのメソッド insertPage()
が用意されています。次の例では、別の PDF ドキュメントから別の PDF ドキュメントの末尾にページを追加する方法を示します。
# !/usr/bin/python
# Recall that PyMuPDF is imported as fitz
import fitz
original_pdf_path = "example.pdf"
extra_page_path = "extra-page.pdf"
output_file_path = "example-extended.pdf"
original_pdf = fitz.open(original_pdf_path)
extra_page = fitz.open(extra_page_path)
original_pdf.insertPDF(extra_page)
original_pdf.save(output_file_path)
PyPDF2 で偶数ページと奇数ページを分割する
次の例では、PyPDF2 を使って、あるファイルを偶数ページと奇数ページに分割し、偶数ページを even.pdf
というファイルに、奇数ページを odd.pdf
というファイルに保存します。
このPythonスクリプトは、まず2つの出力ファイル even.pdf
と odd.pdf
を定義し、それらに対応するライターオブジェクト pdf_writer_even
と pdf_writer_odd
を定義しています。次に、スクリプトはfor-loopでPDFファイル全体を通過し、1ページずつ読み込んでいきます。偶数ページ番号のページは addPage()
を使用して pdf_writer_even
ストリームに追加され、奇数ページ番号は pdf_writer_odd
ストリームに追加されます。最後に、2つのストリームは、前に定義したように、別々のファイルとしてディスクに保存されます。
#!/usr/bin/python3
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_document = "example.pdf"
pdf = PdfFileReader(pdf_document)
# Output files for new PDFs
output_filename_even = "even.pdf"
output_filename_odd = "odd.pdf"
pdf_writer_even = PdfFileWriter()
pdf_writer_odd = PdfFileWriter()
# Get reach page and add it to corresponding
# output file based on page number
for page in range(pdf.getNumPages()):
current_page = pdf.getPage(page)
if page % 2 == 0:
pdf_writer_odd.addPage(current_page)
else:
pdf_writer_even.addPage(current_page)
# Write the data to disk
with open(output_filename_even, "wb") as out:
pdf_writer_even.write(out)
print("created", output_filename_even)
# Write the data to disk
with open(output_filename_odd, "wb") as out:
pdf_writer_odd.write(out)
print("created", output_filename_odd)
結論
pdfrw, PyMuPDF, PyPDF2というライブラリを使えば、PDFの構造を書き直したり、配置を変えたりすることはかなり簡単です。ほんの数行のPythonコードで、ページを削除したり、分割したり、新しい内容を追加したりすることができます。