\ お問い合わせはこちら /

Python で PDF 操作のすべて ― pypdf 完全ガイド(保存版)

Windows / macOS / Linux を問わず、Python を使えば次のような PDF 作業が自動化できます。

  • 読む / 書く / 分割 / 結合 / 抽出 / 回転 / 暗号化・解除
  • テキスト抽出・表抽出
  • ページ画像化・OCR
  • フォーム入力 (AcroForm)
  • PDF 生成(レポート・契約書・請求書)

中でも、現在メンテされている唯一の本流が pypdf です。

目次
  1. 1. 基本:pypdf の読み込み・情報取得
  2. 2. テキスト抽出(pypdf / pdfplumber)
  3. 3. ページ操作(分割・結合・回転・削除)
  4. 4. PDF 結合(Merge)・挿入
  5. 5. PDF の暗号化・復号(パスワード)
  6. 6. PDF への追記(テキスト・画像・スタンプ)reportlab + pypdf
  7. 7. PDF 生成(ゼロから作成)reportlab
  8. 8. OCR:画像化+文字認識(pytesseract)
  9. 9. PDF を画像化(サムネイル生成)
  10. 10. AcroForm(PDFフォーム)操作
  11. 11. PDF 内のリンク・注釈の取得(PyMuPDF)
  12. 12. バッチ処理(大量 PDF を一括処理)
  13. 13. 業務応用の例(テンプレ系)
  14. 14. まとめ:PDF は Python で完全自動化できる

1. 基本:pypdf の読み込み・情報取得

pypdf のインストール

Bash
pip install pypdf

PDF を読み込む

Python
from pypdf import PdfReader

reader = PdfReader("sample.pdf")
print(len(reader.pages))  # ページ数

メタデータ(プロパティ)取得

Python
info = reader.metadata
print(info.title)
print(info.author)
print(info.producer)
print(info.subject)

ページサイズ・座標情報

Python
page = reader.pages[0]
print(page.mediabox)      # ページ全体
print(page.cropbox)       # クロップ領域

2. テキスト抽出(pypdf / pdfplumber)

pypdf のテキスト抽出

Python
from pypdf import PdfReader

reader = PdfReader("sample.pdf")
for i, page in enumerate(reader.pages):
    print("=== Page", i+1, "===")
    print(page.extract_text())

注意
pypdf の抽出精度は普通〜やや弱い程度。
表・複雑レイアウトには pdfplumber 推奨

pdfplumber の高精度テキスト抽出

Bash
pip install pdfplumber

コード。

Python
import pdfplumber

with pdfplumber.open("sample.pdf") as pdf:
    page = pdf.pages[0]
    text = page.extract_text()
    print(text)

表(テーブル)の抽出(pdfplumber の最強機能)

Python
with pdfplumber.open("invoice.pdf") as pdf:
    table = pdf.pages[0].extract_table()
    for row in table:
        print(row)

3. ページ操作(分割・結合・回転・削除)

ページを分割(1ページずつ保存)

Python
from pypdf import PdfReader, PdfWriter

reader = PdfReader("big.pdf")

for i, page in enumerate(reader.pages):
    writer = PdfWriter()
    writer.add_page(page)
    with open(f"page_{i+1}.pdf", "wb") as f:
        writer.write(f)

ページを回転

Python
page = reader.pages[0]
page.rotate(90)  # clockwise

writer = PdfWriter()
writer.add_page(page)

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

ページ削除

Python
writer = PdfWriter()
for i, page in enumerate(reader.pages):
    if i != 1:  # 2ページ目を削除
        writer.add_page(page)

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

4. PDF 結合(Merge)・挿入

PDF を結合する(PdfMerger)

Python
from pypdf import PdfMerger

merger = PdfMerger()
merger.append("a.pdf")
merger.append("b.pdf")
merger.append("c.pdf")

merger.write("merged.pdf")
merger.close()

結合前にページを挿入する(任意位置)

Python
merger = PdfMerger()
merger.append("main.pdf")
merger.merge(position=2, fileobj="insert.pdf")  # 3ページ目の前に挿入
merger.write("merged.pdf")

5. PDF の暗号化・復号(パスワード)

PDF をパスワードで暗号化

Python
writer = PdfWriter()
for page in reader.pages:
    writer.add_page(page)

writer.encrypt("mysecret")

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

パスワード PDF の解除

Python
reader = PdfReader("locked.pdf")
reader.decrypt("password123")

6. PDF への追記(テキスト・画像・スタンプ)reportlab + pypdf

PDF に直接テキストを書くことは pypdf 単体では不可
reportlab で “追記用PDF” を作って合成するのが定番。

テキスト追記(既存 PDF に書き込み)

Python
from reportlab.pdfgen import canvas
from pypdf import PdfReader, PdfWriter

# overlay.pdf を作成
c = canvas.Canvas("overlay.pdf")
c.drawString(50, 750, "追記テキスト:Python 追記")
c.save()

# 合成
base = PdfReader("sample.pdf")
overlay = PdfReader("overlay.pdf")

writer = PdfWriter()

base_page = base.pages[0]
overlay_page = overlay.pages[0]
base_page.merge_page(overlay_page)

writer.add_page(base_page)

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

画像を追記

Python
c = canvas.Canvas("overlay.pdf")
c.drawImage("logo.png", 50, 700, width=100, height=50)
c.save()

(後は同様に merge)。

7. PDF 生成(ゼロから作成)reportlab

新しい PDF を生成

Python
from reportlab.pdfgen import canvas

c = canvas.Canvas("new.pdf")
c.setFont("Helvetica", 14)
c.drawString(50, 750, "Hello PDF!")
c.save()

表(Table)を描画

Python
from reportlab.platypus import SimpleDocTemplate, Table

doc = SimpleDocTemplate("table.pdf")
data = [["列1", "列2", "列3"], [1,2,3], [4,5,6]]
table = Table(data)

doc.build([table])

8. OCR:画像化+文字認識(pytesseract)

インストール

Bash
pip install pdf2image pytesseract pillow

★ Windows の場合、別途 Tesseract の本体インストールが必要。

PDF → 画像化(pdf2image)

Python
from pdf2image import convert_from_path

pages = convert_from_path("sample.pdf")
pages[0].save("page1.png")

OCR(pytesseract で読み取り)

Python
import pytesseract
from PIL import Image

text = pytesseract.image_to_string(Image.open("page1.png"), lang="jpn")
print(text)

9. PDF を画像化(サムネイル生成)

Python
pages = convert_from_path("sample.pdf", dpi=200)
for i, page in enumerate(pages):
    page.save(f"page_{i+1}.jpg")

10. AcroForm(PDFフォーム)操作

フォームフィールドの一覧

Python
reader = PdfReader("form.pdf")
fields = reader.get_form_text_fields()
print(fields)

テキストを埋め込む

Python
reader = PdfReader("form.pdf")
writer = PdfWriter()

writer.append(reader)
writer.update_page_form_field_values(
    writer.pages[0],
    {"company_name": "Python株式会社", "amount": "30,000"}
)

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

11. PDF 内のリンク・注釈の取得(PyMuPDF)

pypdf は注釈が弱いので、PyMuPDF (fitz) を併用。

Bash
pip install pymupdf

注釈を読み取る

Python
import fitz

doc = fitz.open("sample.pdf")
page = doc[0]

for annot in page.annots():
    print(annot.type, annot.info)

12. バッチ処理(大量 PDF を一括処理)

フォルダ内の PDF を一括結合

Python
import glob
from pypdf import PdfMerger

merger = PdfMerger()

for pdf in glob.glob("docs/*.pdf"):
    merger.append(pdf)

merger.write("all.pdf")
merger.close()

13. 業務応用の例(テンプレ系)

請求書 PDF から金額を自動抽出 → Excel へまとめる

領収書 PDF を OCR で読み取り → 会計ソフトへ取り込み

勤怠表 PDF の表データを抽出 → CSV へ変換

100 ファイルのレポート PDF を1冊に自動マージ

こちらは別記事として深掘り。

14. まとめ:PDF は Python で完全自動化できる

Python の PDF 操作は、

  • pypdf:基本処理(読込・結合・分割・暗号化)
  • pdfplumber:高精度テキスト / 表抽出
  • reportlab:PDF 生成・追記
  • pdf2image:画像化
  • pytesseract:OCR
  • PyMuPDF:注釈・リンク・高速レンダリング

これらを組み合わせると、
事務作業・経理・契約書・帳票・レポートの自動化がほぼ無限に可能です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

普段はエンジニアとして働きつつ、旅行では「住むように旅する」をテーマに動き回っています。

TABIGRAMMER では、
・旅の情報(台湾を中心としたアジア旅ガイド)
・ミニマリストの持ち物や旅の効率化テクニック
・ブログ運営やプログラミング記事

といった、旅とITが交差するコンテンツを発信しています。

難しいことをわかりやすく、旅をより快適に。そんなスタイルで記事を書いています。

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)