[Python #25]PythonでPDFファイルを操作

こんにちは。PythonチームのT.Hです。今回は、Pythonを使ってPDFファイルを操作する方法を解説します。

使用するライブラリ

pypdfというライブラリを使用します。PyPDF2というライブラリもありますが、そちらは開発が終了しています。

Welcome to pypdf — pypdf 3.17.1 documentation

以下をでターミナルで実行し、pypdfをインストールしましょう。

以降のコードではバージョン3.17.1のpypdfを使用しています。

PDFファイルを結合

複数のPDFファイルを、一つのPDFファイルに結合します。

from pypdf import PdfWriter

# PdfWriterオブジェクトを生成
pdf_writer = PdfWriter()

#PDFファイルを結合
for pdf in ['結合したいPDFファイル1.pdf', '結合したいPDFファイル2.pdf']:
    pdf_writer.append(pdf)

#出力
pdf_writer.write('結合後のPDFファイル.pdf')
pdf_writer.close()

PDFファイルを分割

一つのPDFファイルを、二つのPDFファイルに分割します。

from pypdf import PdfMerger
from pypdf import PageRange

# PdfMergerオブジェクトを生成
pdf_merger = PdfMerger()
pdf_merger.append('分割したいPDFファイル.pdf', pages=PageRange(':70'))

#一つ目のPDFファイルを出力
pdf_merger.write('分割後のPDFファイル1.pdf')
pdf_merger.close()

# PdfMergerオブジェクトを生成
pdf_merger = PdfMerger()

#二つ目のPDFファイルを出力
pdf_merger.append('分割したいPDFファイル.pdf', pages=PageRange('70:'))
pdf_merger.write('分割後のPDFファイル2.pdf')
pdf_merger.close()

PDFファイルを前半と後半に分けて出力することで分割を実現しています。

スライス表記で分割するページを指定しています。

PDFファイルの各ページを回転

PDFファイルの、すべてのページを回転させます。

from pypdf import PdfReader
from pypdf import PdfWriter

# PdfReaderオブジェクトを生成
pdf_reader = PdfReader('回転させるPDFファイル.pdf')

# PdfWriterオブジェクトを生成
pdf_writer = PdfWriter()

# 回転角度(時計回りで)
angle = 90

# 各ページを回転
for page_num in range(len(pdf_reader.pages)):
    obj = pdf_reader.pages[page_num]
    obj.rotate(angle) 
    pdf_writer.add_page(obj)

#出力
pdf_writer.write('回転後のPDF.pdf')
pdf_writer.close()

PDFファイルにしおりを追加

PDFファイルの指定のページに、しおりを追加します。

from pypdf import PdfWriter

# PdfWriterオブジェクトを生成
pdf_writer = PdfWriter(clone_from='しおりを付けるPDFファイル.pdf')

#しおりのタイトル、ページ番号を指定
pdf_writer.add_outline_item(title='しおりのタイトル',page_number=3)

#出力
pdf_writer.write('しおりを付けたPDFファイル.pdf')
pdf_writer.close()

ページ番号は0から始まる点に注意してください。

今回はpage_numberを3としているため、PDFファイルの4ページ目にしおりが追加されます。

PDFファイルからテキストを抽出

PDFファイルから、テキストを抽出します。

from pypdf import PdfReader

# PdfReaderオブジェクトを生成
pdf_reader = PdfReader("抽出したいPDFファイル.pdf")

#各ページからテキストを抽出、出力
for page_num in range(len(pdf_reader.pages)):
    page = pdf_reader.pages[page_num]
    print(page.extract_text())

word等で作成されたPDFファイルであれば、ある程度の精度で抽出することができます。

おわりに

pypdfを用いて、様々な操作することができました。

pypdfでは他にも色々なことができるので、ぜひご自身でドキュメントを確認してみてください。

参考文献

https://pypdf.readthedocs.io/en/latest/index.html