【Python】初心者向けpypdf2の使い方完全ガイド!PDFを自在に操作しよう

PDFは様々な場面で使われる文書フォーマットですが、そのままでは編集や加工が難しいものです。しかし、Pythonのpypdf2ライブラリを使えば、PDFを自由に操作できるようになります。本記事では、pypdf2の基本的な使い方から実践的な活用例まで、初心者にもわかりやすく解説します。PDFの読み込み、ページの抽出、テキスト抽出、暗号化など、pypdf2を使いこなすためのテクニックが満載です。また、PDFの構造や仕様についての知識も深められます。Pythonでpdf操作の実践的なスキルを身につけ、業務の自動化や効率化に役立てましょう。

この記事を読んだらわかること

  • pypdf2とは何かを理解し、PDFをPythonで操作するための基本的な知識が身につく
  • PDFファイルの読み込み、書き出し、ページの抽出・結合・分割など、基本的な操作方法がわかる
  • テキスト抽出、透かし追加、暗号化など、pypdf2を使ったPDF加工の方法を学べる
  • 大量のPDFを一括処理する方法や、PDFからテキストを抽出してExcelに書き出す方法など、実践的な活用例が理解できる
  • OCRを使ったPDFのテキスト抽出や、請求書の自動処理など、高度な処理の実現方法がわかる
  • pypdf2を使う上での注意点やトラブルシューティングの方法を押さえられる
  • PDFの構造や仕様についての基礎知識が身につく
  • 公式ドキュメントの読み方や、発展的な学習リソースの探し方がわかる
  • PyPIやGitHubを通じて、pypdf2の最新情報を追う方法が理解できる
  • Pythonを使ったPDF処理の実践的なスキルが身につき、業務の自動化や効率化に活用できるようになる

pypdf2とは?PDFをPythonで操作するためのライブラリを徹底解説

pypdf2は、PDFをPythonで操作するための強力なライブラリです。ページの結合・分割・抽出、メタデータの編集など、PDFに関するさまざまな処理を行うことができます。Pure Pythonで書かれているため、PDFをPythonのオブジェクトとして直感的に扱うことが可能です。

注意

この記事ではpypdf2 バージョン2.0.0について解説しています。現行の最新バージョンは3.0.0であり、コードの互換性が失われているので、ダウンロード時は以下のようにしてください

pip3 install pypdf2==2.0.0

以下は、pypdf2の基本的な使用例です。

from PyPDF2 import PdfFileWriter, PdfFileReader

# PDFファイルを読み込む
input_pdf = PdfFileReader(open("input.pdf", "rb"))

# 新しいPDFファイルを作成
output_pdf = PdfFileWriter()

# 1ページ目を抽出して新しいPDFに追加
output_pdf.addPage(input_pdf.getPage(0))

# 新しいPDFファイルを保存
with open("output.pdf", "wb") as f:
    output_pdf.write(f)

このコードでは、input.pdfという名前のPDFファイルを読み込み、その1ページ目を抽出してoutput.pdfという新しいPDFファイルに保存しています。ページの抽出は、getPage()メソッドを使って行います。ページ番号は0から始まることに注意してください。

pypdf2は、PyPDF4やpdfrwなどの派生ライブラリも存在します。これらは、pypdf2をベースに開発された別バージョンのライブラリで、一部の機能や対応Pythonバージョンが異なります。用途に応じて適切なライブラリを選択する必要があるでしょう。

PDF処理の自動化や効率化に役立つツールとして、pypdf2は学術分野でも活用されています。論文の被引用関係の分析やPDFからの情報抽出など、研究活動の様々な場面で用いられています。

ただし、利用に際してはいくつか注意点があります。日本語を含むPDFでは、テキスト抽出結果が文字化けすることがあります。また、暗号化されたPDFの中には、パスワードが必要になる場合もあります。セキュリティ面への考慮も必要です。

以下は、pypdf2を使ってPDFのメタデータを編集する例です。

from PyPDF2 import PdfFileWriter, PdfFileReader

# PDFファイルを読み込む
input_pdf = PdfFileReader(open("input.pdf", "rb"))

# 新しいPDFファイルを作成
output_pdf = PdfFileWriter()

# メタデータを編集
info_dict = output_pdf._info.getObject()
info_dict.update({
    '/Title': 'サンプルPDF',
    '/Author': '山田太郎', 
    '/Subject': 'pypdf2のデモンストレーション',
})

# 既存のPDFの内容を新しいPDFにコピー
num_pages = input_pdf.getNumPages()
for i in range(num_pages):
    output_pdf.addPage(input_pdf.getPage(i))

# 新しいPDFファイルを保存  
with open("output_meta.pdf", "wb") as f:
    output_pdf.write(f)

このように、PdfFileWriterクラスの_info属性を通じて、PDFのメタデータを自由に編集することができます。

以上、pypdf2は、PDFをPythonで操作するための強力かつ柔軟なツールです。初心者でも直感的に使えるシンプルなインターフェースが特徴です。PDFの加工や自動処理のニーズがある場合は、ぜひ検討してみてください。

pypdf2の基本的な使い方をマスターしよう

pypdf2を使いこなすには、PdfFileReaderPdfFileWriterの2つのクラスを理解することが重要です。PdfFileReaderは既存のPDFファイルを読み込むためのクラス、PdfFileWriterは新しいPDFファイルを作成・編集するためのクラスです。この2つを組み合わせることで、PDFの様々な操作が可能になります。

まずは、PDFファイルの読み込みと書き出しの基本から見ていきましょう。

from PyPDF2 import PdfFileWriter, PdfFileReader

# PDFファイルを読み込む
reader = PdfFileReader("input.pdf")

# 新しいPDFファイルを作成
writer = PdfFileWriter()

# 既存のPDFの内容を新しいPDFにコピー
num_pages = reader.getNumPages()
for i in range(num_pages):
    writer.addPage(reader.getPage(i))

# 新しいPDFファイルを保存
with open("output.pdf", "wb") as f:
    writer.write(f)

このコードでは、PdfFileReaderinput.pdfを読み込み、PdfFileWriterで新しいPDFファイルを作成しています。getNumPages()メソッドでPDFのページ数を取得し、getPage()メソッドで各ページを取得します。取得したページは、addPage()メソッドで新しいPDFに追加していきます。最後に、write()メソッドで新しいPDFファイルを保存します。

次に、ページの抽出と結合の方法を見ていきます。

from PyPDF2 import PdfFileWriter, PdfFileReader

# PDFファイルを読み込む
reader1 = PdfFileReader("input1.pdf")
reader2 = PdfFileReader("input2.pdf")

# 新しいPDFファイルを作成
writer = PdfFileWriter()

# input1.pdfの1ページ目を抽出
page1 = reader1.getPage(0)
writer.addPage(page1)

# input2.pdfの全ページを追加
num_pages = reader2.getNumPages()
for i in range(num_pages):
    writer.addPage(reader2.getPage(i))

# 新しいPDFファイルを保存
with open("output_merged.pdf", "wb") as f:
    writer.write(f)

このコードでは、input1.pdfの1ページ目を抽出し、input2.pdfの全ページを追加することで、2つのPDFを結合しています。getPage()メソッドでページを取得し、addPage()メソッドで新しいPDFに追加します。

PDFからテキストを抽出するには、extractText()メソッドを使います。

from PyPDF2 import PdfFileReader

# PDFファイルを読み込む
reader = PdfFileReader("input.pdf")

# 1ページ目のテキストを抽出
page = reader.getPage(0)
text = page.extractText()

print(text)

ただし、PDFのレイアウトによっては、きれいにテキストが抽出できないことがあります。特に、画像やグラフ内のテキストは抽出できません。その場合は、OCRライブラリを使う必要があります。

最後に、PDFへの加工方法の一つとして、透かしの追加を見ていきます。

from PyPDF2 import PdfFileWriter, PdfFileReader
from reportlab.pdfgen import canvas
from io import BytesIO

# 透かしを作成
packet = BytesIO()
can = canvas.Canvas(packet)
can.drawString(10, 10, "Sample Watermark")
can.save()
packet.seek(0)
watermark = PdfFileReader(packet)

# PDFファイルを読み込む
reader = PdfFileReader("input.pdf")

# 新しいPDFファイルを作成
writer = PdfFileWriter()

# 各ページに透かしを追加
num_pages = reader.getNumPages()
for i in range(num_pages):
    page = reader.getPage(i)
    page.mergePage(watermark.getPage(0))
    writer.addPage(page)

# 新しいPDFファイルを保存
with open("output_watermarked.pdf", "wb") as f:
    writer.write(f)

このコードでは、reportlabライブラリを使って透かしを作成し、各ページにその透かしを重ねています。mergePage()メソッドを使うことで、透かしをページ上に描画できます。

以上が、pypdf2の基本的な使い方の概要です。ページの操作、テキスト抽出、加工など、PDFに関する様々なタスクをPythonで自動化できます。ただし、ページ番号が0から始まることや、日本語での文字化けなど、初心者がつまずきやすいポイントもあるので注意が必要です。コードを書く際は、これらの点に気をつけながら、柔軟に対応していきましょう。

pypdf2の実践的な活用例5選

pypdf2は、PDFに関する様々な実践的なタスクを自動化するのに役立ちます。ここでは、pypdf2を使った5つの実践的な活用例を紹介します。

大量のPDFファイルを一括処理する

最初の活用例は、大量のPDFファイルを一括処理する方法です。globモジュールを使ってフォルダ内のPDFファイルを取得し、PyPDF2を使って各PDFファイルを読み込んで必要な処理を行います。処理結果は新しいPDFファイルとして保存できます。

import os
import glob
from PyPDF2 import PdfFileWriter, PdfFileReader

# PDFファイルが格納されたフォルダのパス
pdf_dir = "path/to/pdf/directory"

# 処理後のPDFを保存するフォルダを作成
output_dir = "path/to/output/directory"
os.makedirs(output_dir, exist_ok=True)

# フォルダ内のPDFファイルを取得
pdf_files = glob.glob(os.path.join(pdf_dir, "*.pdf"))

for pdf_file in pdf_files:
    # PDFファイルを読み込む
    with open(pdf_file, "rb") as f:
        reader = PdfFileReader(f)
        writer = PdfFileWriter()

        # PDFに対して必要な処理を行う(例:1ページ目のみ抽出)
        page = reader.getPage(0)
        writer.addPage(page)

        # 処理後のPDFを保存
        output_path = os.path.join(output_dir, os.path.basename(pdf_file))
        with open(output_path, "wb") as output:
            writer.write(output)

このコードでは、pdf_dirで指定したフォルダ内の全てのPDFファイルを処理し、各PDFの1ページ目のみを抽出して新しいPDFファイルとして保存しています。必要に応じて、PDFに対する処理の内容を変更することができます。

PDFからデータを抽出してExcelに書き出す

次の活用例は、PDFからテキストデータを抽出し、Excelファイルに書き出す方法です。PyPDF2を使ってPDFからテキストを抽出し、正規表現を使って必要な情報を取り出します。取り出したデータは、openpyxlを使ってExcelファイルに書き込みます。

import re
from PyPDF2 import PdfFileReader
from openpyxl import Workbook

# PDFファイルを読み込む
with open("input.pdf", "rb") as f:
    reader = PdfFileReader(f)
    page = reader.getPage(0)
    text = page.extractText()

# 正規表現を使ってテキストからデータを抽出
pattern = r"(\d{4}年\d{1,2}月\d{1,2}日)"
matches = re.findall(pattern, text)

# Excelファイルを作成
wb = Workbook()
ws = wb.active

# 抽出したデータをExcelに書き込む
for i, match in enumerate(matches, start=1):
    ws.cell(row=i, column=1, value=match)

# Excelファイルを保存
wb.save("output.xlsx")

このコードでは、PDFから日付(例:2023年4月1日)を抽出し、Excelファイルに書き出しています。正規表現のパターンを変更することで、他の形式のデータも抽出できます。

複数のPDFを結合して1つのファイルにまとめる

3つ目の活用例は、複数のPDFファイルを結合して1つのファイルにまとめる方法です。PyPDF2のPdfFileMergerクラスを使うことで、簡単にPDFを結合できます。

from PyPDF2 import PdfFileMerger

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

# 結合するPDFファイルを追加
merger.append("file1.pdf")
merger.append("file2.pdf")
merger.append("file3.pdf")

# 結合したPDFを保存
merger.write("merged_output.pdf")
merger.close()

このコードでは、file1.pdffile2.pdffile3.pdfの3つのPDFファイルを結合し、merged_output.pdfという名前で保存しています。結合するPDFファイルの数や名前は自由に変更できます。

PDFをスキャンしてOCR処理を行う

4つ目の活用例は、スキャンしたPDFに対してOCR(光学文字認識)処理を行う方法です。pdf2imageライブラリを使ってPDFを画像に変換し、pytesseractを使って画像からテキストを抽出します。抽出したテキストは、新しいPDFファイルに書き込むことができます。

from pdf2image import convert_from_path
from PyPDF2 import PdfFileWriter, PdfFileReader
from io import BytesIO
from PIL import Image
import pytesseract

# PDFファイルを画像に変換
images = convert_from_path("scanned.pdf")

# 画像からテキストを抽出
text = ""
for img in images:
    text += pytesseract.image_to_string(img, lang="jpn")

# 抽出したテキストを新しいPDFに書き込む
packet = BytesIO()
packet.write(text.encode("utf-8"))
packet.seek(0)
new_pdf = PdfFileReader(packet)

output = PdfFileWriter()
output.addPage(new_pdf.getPage(0))

with open("output_ocr.pdf", "wb") as f:
    output.write(f)

このコードでは、scanned.pdfというスキャンしたPDFファイルから画像を取得し、pytesseractを使って日本語のテキストを抽出しています。抽出したテキストは、新しいPDFファイルoutput_ocr.pdfに書き込まれます。OCRの精度を上げるには、画像の前処理(二値化、ノイズ除去など)が重要です。

PyPDF2を使った請求書の自動処理システムを作る

最後の活用例は、PyPDF2を使って請求書の自動処理システムを作る方法です。請求書のPDFからテキストデータを抽出し、正規表現を使って請求金額や支払期日などの情報を取り出します。取り出した情報は、データベースに格納することができます。

import re
import sqlite3
from PyPDF2 import PdfFileReader

# PDFファイルを読み込む
with open("invoice.pdf", "rb") as f:
    reader = PdfFileReader(f)
    page = reader.getPage(0)
    text = page.extractText()

# 正規表現を使って請求書のデータを抽出
amount_pattern = r"請求金額:(\d+)円"
due_date_pattern = r"支払期日:(\d{4}年\d{1,2}月\d{1,2}日)"

amount = re.search(amount_pattern, text).group(1)
due_date = re.search(due_date_pattern, text).group(1)

# データベースに接続
conn = sqlite3.connect("invoice.db")
c = conn.cursor()

# 抽出したデータをデータベースに格納
c.execute("INSERT INTO invoices (amount, due_date) VALUES (?, ?)", (amount, due_date))
conn.commit()
conn.close()

このコードでは、invoice.pdfという請求書のPDFファイルからテキストデータを抽出し、正規表現を使って請求金額と支払期日を取り出しています。取り出したデータは、SQLiteデータベースのinvoicesテーブルに格納されます。請求書の形式に合わせて、正規表現のパターンを適宜変更する必要があります。

以上、pypdf2を使った5つの実践的な活用例を紹介しました。これらの例を参考に、PDFの一括処理やデータ抽出、OCR処理など、様々な場面でpypdf2を活用することができます。他のライブラリと組み合わせることで、より高度な処理も実現できるでしょう。ぜひ、業務の自動化や効率化にpypdf2を役立ててください。

pypdf2の使い方まとめ&発展的な学習リソースの紹介

これまで、pypdf2の基本的な使い方から実践的な活用例まで、様々な側面を見てきました。ここでは、pypdf2を使う上で押さえておくべきポイントを改めて整理し、さらなるスキルアップに役立つ学習リソースを紹介します。

PyPDF2チートシート(頻出する操作のコードサンプル集)

pypdf2を使う際に頻繁に使う操作をコードサンプルとともにまとめました。必要な時に参照できるようにしておくと便利です。

PDFファイルの読み込み

from PyPDF2 import PdfFileReader

with open("input.pdf", "rb") as f:
    reader = PdfFileReader(f)

ページ数の取得

num_pages = reader.getNumPages()

指定したページの取得

page = reader.getPage(0)  # 1ページ目を取得

テキストの抽出

text = page.extractText()

新しいPDFファイルの作成と保存

from PyPDF2 import PdfFileWriter

writer = PdfFileWriter()
writer.addPage(page)

with open("output.pdf", "wb") as f:
    writer.write(f)

ページの結合

from PyPDF2 import PdfFileMerger

merger = PdfFileMerger()
merger.append("file1.pdf")
merger.append("file2.pdf")
merger.write("merged.pdf")
merger.close()

PyPDF2の公式ドキュメントを読もう

pypdf2の使い方をより深く理解するには、公式ドキュメントを参照することが欠かせません。ドキュメントでは、各クラスやメソッドの詳細な説明、使用例、注意点などが網羅的に記載されています。

PyPDF2の公式ドキュメント: https://pypdf2.readthedocs.io/

PDFの仕様について理解を深める

PDFの構造や仕様について理解を深めることは、pypdf2を使いこなす上で大切です。PDFの内部構造を把握することで、より高度な処理が可能になります。

PDFの仕様を詳しく解説した書籍として、以下をおすすめします。

また、Adobeが公開しているPDF Referenceも有益です。

これらの資料を通じて、PDFに対する理解を深めていきましょう。

PDFに関するPython情報をキャッチアップし続ける方法

pypdf2に限らず、PythonでPDFを処理する方法は日々進化しています。新しいテクニックや効率的な方法を学び続けることが、スキルアップにつながります。

以下のようなサイトやブログを定期的にチェックすることをおすすめします。

  • Real Python: https://realpython.com/
  • Pythonの使い方やベストプラクティスを解説する有益な記事が多数掲載されています。
  • Towards Data Science: https://towardsdatascience.com/
  • データサイエンスやPythonに関する最新の記事が投稿されています。
  • PyPI – pypdf2: https://pypi.org/project/PyPDF2/
  • pypdf2パッケージの最新バージョン情報やリリースノートを確認できます。
  • GitHub – pypdf2: https://github.com/py-pdf/PyPDF2
  • pypdf2の開発状況や、issue、プルリクエストの内容を追うことができます。

これらの情報ソースを活用し、常に最新の知見を取り入れるよう心がけましょう。

以上、pypdf2の使い方のまとめと、発展的な学習リソースの紹介でした。pypdf2は、PDFを処理する上で非常に強力なツールです。基本的な使い方をマスターしつつ、PDFの仕様や最新情報にもアンテナを張っておくことで、より高度な処理が実現できるようになるでしょう。ぜひ、業務の自動化や効率化に活かしてください。