スポンサーリンク

PythonでPDFを自由自在に操作!pypdfとreportlabで実務を効率化しよう【初心者向け】

自動化スクリプト

1. はじめに|PDF操作もPythonで自動化しよう!

仕事で扱う資料やレポート、請求書など、PDFファイルをPythonで操作したいと感じたことはありませんか?
「PDFのテキストを抽出したい」「特定のページだけ分割したい」「自動で文字や画像を追加したい」――そんな作業を、毎回手作業や専用ソフトで行うのは正直かなり大変ですよね。

そこで活躍するのが PythonによるPDF自動化です。
Pythonには、PDFの読み取り・分割・結合・編集を簡単に行えるライブラリが揃っており、業務効率化や作業の自動化に直結します。

本記事では、初心者でも扱いやすく、実務でもよく使われている
「pypdf」「reportlab」 の2つのライブラリを使って、PDF操作の基本から実践例までをわかりやすく解説します。

この記事を読むことで、次のようなことができるようになります👇

  • PDFファイルからテキストや画像を抽出する
  • 必要なページだけを抜き出して別のPDFとして保存する
  • 複数のPDFを1つにまとめる
  • PDFに文字や画像を追加して新しく生成する

これらの処理をPythonで自動化できれば、PDF編集にかかる時間と手間を大幅に削減できます。

サンプルコードはすべてコピー&ペーストで動かせる形式で紹介するので、プログラミング初心者の方でも安心です 😊
それでは早速、PDF操作に必要なライブラリのインストールから始めていきましょう。




2. 必要なライブラリの準備とインストール

PythonでPDFファイルを操作するには、まず専用のライブラリをインストールする必要があります。今回使用するのは次の2つです:

ライブラリ名主な用途
pypdfPDFの読み込み・分割・結合・テキスト抽出など
reportlabPDFへの文字や画像の書き込み・出力など

どちらも無料で使えるオープンソースのライブラリです。

🔧 インストール方法(pipコマンド)

ターミナルやコマンドプロンプトを開いて、以下のコマンドを入力してください:

pip install pypdf reportlab

数秒でインストールが完了します。

✅ インストールできたか確認しよう

Pythonのインタプリタ(pythonコマンドなど)を開いて、次のように入力してみましょう:

import pypdf
import reportlab

エラーが出なければ準備OKです!


📝 ライブラリの簡単な特徴

  • pypdf:PDFファイルを読み込んだり、特定ページを取り出したり、複数PDFを1つにまとめるといった編集処理に強いです。PDFの中身を取り出す「リーダー」として使うイメージです。
  • reportlab:PDFファイルを一から生成したり、文字・図・画像などを自由に配置できるライブラリです。こちらは「PDFを作る側」として活躍します。

このように、pypdfは読み込み・編集向け、reportlabは出力向けという役割で使い分けます。

次は、実際にpypdfを使ってPDFを読み込んでみましょう!




3. PDFの読み込みとテキスト抽出(pypdf)

まずは、PythonでPDFファイルを読み込んで、中に含まれているテキストを取り出す方法を見ていきましょう。

ここでは、pypdfライブラリの**PdfReaderクラス**を使います。


📘 基本的な読み込み手順

まずは、PDFを読み込んで、全ページからテキストを取り出す簡単なサンプルです。

from pypdf import PdfReader

# PDFファイルのパス
reader = PdfReader("sample.pdf")

# ページ数を確認
print(f"ページ数: {len(reader.pages)}")

# 各ページからテキストを抽出
for i, page in enumerate(reader.pages):
text = page.extract_text()
print(f"--- {i+1}ページ目の内容 ---")
print(text)

reader.pagesは、PDFの各ページをリストのように扱える便利なプロパティです。1ページずつ順番にテキストを取り出せます。


🧩 特定のページだけ読み取る

たとえば2ページ目だけを読みたい場合は次のように書けます:

page = reader.pages[1]  # インデックスは0から始まる
print(page.extract_text())

⚠ レイアウトが崩れる?extraction_modeに注意

PDFの構造によっては、抽出したテキストの改行や空白が崩れることがあります。

そんなときは、以下のようにextraction_mode="layout"を指定すると改善することがあります:

text = page.extract_text(extraction_mode="layout")

ただし、すべてのPDFに効果があるわけではありません。見やすく取り出せるかどうかは、PDFの構造に依存します。


💾 抽出したテキストを保存する(例:テキストファイル)

取り出したテキストをファイルに保存するには以下のように書けます:

with open("output.txt", "w", encoding="utf-8") as f:
for page in reader.pages:
f.write(page.extract_text() + "\n")

あとでExcelに読み込むなど、他のツールと連携したいときに便利ですね。


📌 ここでのポイントまとめ:

  • PdfReaderでPDFを読み込む
  • page.extract_text()でテキストを抽出
  • 複数ページにわたってループ処理できる
  • layoutモードで整形が改善される可能性あり
  • テキストはファイルにも保存できる



4. PDFから画像を抽出する方法

PDFには、グラフやイラスト、写真などの画像が含まれていることも多いですよね。ここでは、Pythonとpypdfを使って、PDFファイル内の画像を取り出して保存する方法をご紹介します!


🖼 画像抽出の基本:page.imagesを使おう

pypdfでは、PDFの各ページにある画像データを、page.imagesから取得できます。画像の情報はリストで返され、バイナリデータとして保存可能です。

以下は、PDFの1ページ目から画像を抽出する例です:

from pypdf import PdfReader

reader = PdfReader("sample.pdf")
page = reader.pages[0] # 1ページ目

for i, image in enumerate(page.images):
with open(f"image_{i+1}.jpg", "wb") as f:
f.write(image.data) # バイナリデータとして保存
print(f"{image.name} を保存しました")

📂 全ページからすべての画像を取り出す

複数ページのPDFから、すべての画像を一括抽出したい場合は、以下のようにします:

for page_num, page in enumerate(reader.pages):
for i, image in enumerate(page.images):
filename = f"page{page_num+1}_image{i+1}.jpg"
with open(filename, "wb") as f:
f.write(image.data)
print(f"{filename} を保存しました")

画像がたくさんあるPDFでも、繰り返し処理で自動保存できるのはPythonの強みですね!


🔍 画像形式についての注意

pypdfで抽出できる画像の形式(JPEG、PNGなど)は、元のPDFに埋め込まれている形式に依存します。たとえば、スキャンPDFなどでは画像データとして埋め込まれていないケースもあり、画像が検出されないことがあります。

画像が抽出できない場合:

  • そのPDFに画像が含まれていない可能性があります。
  • 画像ではなくベクター形式(図形やテキスト)で構成されているかもしれません。

📌 このセクションのまとめ:

  • page.imagesから画像のリストを取得できる
  • .dataでバイナリデータを保存できる
  • ファイル名にはpage番号連番をつけてわかりやすく
  • 画像がない場合は何も取得されないこともある



5. PDFファイルの分割(ページ単位)

「このPDF、1ページずつバラバラにしたい…」
「3ページ目だけ別ファイルに保存したい…」
そんなときにも、Python×pypdfが大活躍します!

このセクションでは、PDFをページ単位で分割して、別々のPDFファイルとして保存する方法をご紹介します。


✂ 単一ページだけを分割して保存

まずは、1ページだけを抜き出して保存する例です:

from pypdf import PdfReader, PdfWriter

reader = PdfReader("sample.pdf")
writer = PdfWriter()

# 3ページ目(インデックスは2)を抜き出す
writer.add_page(reader.pages[2])

# 保存する
with open("page3_only.pdf", "wb") as f:
writer.write(f)

🔁 全ページを1ページずつバラバラに保存

PDFを1ページずつ分割して、たとえば page1.pdf, page2.pdf のように保存するには、ループ処理を使います:

reader = PdfReader("sample.pdf")

for i, page in enumerate(reader.pages):
writer = PdfWriter()
writer.add_page(page)

filename = f"page{i+1}.pdf"
with open(filename, "wb") as f:
writer.write(f)
print(f"{filename} を保存しました")

enumerate()を使えば、ページ番号に連番をつけて保存するのも簡単です。


📌 注意ポイント

  • PdfWriter()新しいPDFファイルを作るためのクラスなので、ページごとに新しく作り直します。
  • 元のPDFにセキュリティ保護(パスワードなど)がかかっている場合、分割できないことがあります。

📌 このセクションのまとめ:

  • PdfReader で読み込み、PdfWriter で出力
  • add_page() でページを追加
  • ループで連番ファイルに保存すれば一括分割もOK!



6. 複数PDFの結合

「レポートを1つのPDFにまとめたい」
「別々の請求書ファイルを1本化したい」
こんなときに便利なのが、PDFの結合処理です。

Pythonのpypdfを使えば、複数のPDFファイルを1つのPDFにまとめる処理もとっても簡単にできますよ!


📎 基本:2つのPDFを1つに結合する

まずは、2つのPDFファイルを1つにまとめる簡単な例から見てみましょう:

from pypdf import PdfMerger

merger = PdfMerger()

# 結合したいファイルを順番に追加
merger.append("report1.pdf")
merger.append("report2.pdf")

# 出力
with open("merged.pdf", "wb") as f:
merger.write(f)

たったこれだけで、report1.pdfreport2.pdfmerged.pdfとして保存されます!


📂 フォルダ内のPDFをまとめて結合する

「このフォルダにあるPDF、全部まとめたい!」
そんなときは、標準ライブラリのosglobを使って、PDFファイルを一括取得して順番に結合できます。

import glob
from pypdf import PdfMerger

merger = PdfMerger()

# フォルダ内のPDFを取得(例:sample1.pdf, sample2.pdf...)
pdf_files = sorted(glob.glob("pdf_folder/*.pdf"))

for pdf_file in pdf_files:
merger.append(pdf_file)

with open("all_merged.pdf", "wb") as f:
merger.write(f)

sorted()を使うと、ファイル名順に整列されるので、提出書類など順番が重要なときに便利です。


🔍 複数ページを部分的に結合することも可能!

merger.append("bigfile.pdf", pages=(0, 2))  # 1〜2ページ目だけ追加

このように、ページ範囲を指定して部分的に結合することもできます(開始は0ベース)。


📌 このセクションのまとめ:

  • PdfMergerを使えば複数PDFを簡単にまとめられる
  • append()でファイルを追加、write()で保存
  • globでフォルダ内のファイルをまとめて処理できる
  • ページ範囲を指定して部分的に結合も可能!



7. PDFへのテキスト・画像の書き込み(ReportLab)

これまでに、PDFの読み取り・分割・結合の方法を紹介してきました。
ここからは逆に、PDFに新しくデータを書き込む方法を見ていきましょう!

Pythonのreportlabライブラリを使えば、テキストや画像を自由に配置して、新しいPDFを生成できます。帳票作成やレポート出力など、業務でも活躍しますよ!


📝 基本の書き込み手順(Canvasを使う)

まずは、1ページのPDFに文字を書き込んで保存する基本的な例です:

from reportlab.pdfgen import canvas

c = canvas.Canvas("output.pdf") # 出力ファイル名を指定
c.drawString(100, 750, "こんにちは、PDFの世界!") # (x座標, y座標, 文字列)
c.save() # 保存
  • 座標の基準は**左下が(0, 0)**です。
  • 上の例では、ページの左下から(100, 750)の位置にテキストが描かれます。

🇯🇵 日本語を使いたいときは?

reportlabはデフォルトでは日本語フォントに対応していません。
そこで、日本語用のTrueTypeフォント(TTF)を登録して使う必要があります。

以下は、フリーフォント「IPAexゴシック」を使う例です:

from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

# フォント登録(事前にIPAexゴシックのフォントファイルをダウンロードしておく)
pdfmetrics.registerFont(TTFont("IPAexGothic", "ipaexg.ttf"))

c = canvas.Canvas("output_japanese.pdf")
c.setFont("IPAexGothic", 14)
c.drawString(100, 750, "こんにちは、日本語も書けます!")
c.save()

※フォントファイル(ipaexg.ttf)は同じディレクトリに置いておきましょう。


📄 複数ページに書き込むには?

ページを追加するには、showPage()を使います:

c = canvas.Canvas("multi_page.pdf")
for i in range(3):
c.drawString(100, 750, f"{i+1}ページ目の内容です")
c.showPage() # 次のページへ
c.save()

🖼 PDFに画像を書き込む

画像も簡単に挿入できます:

c = canvas.Canvas("image_pdf.pdf")
c.drawImage("logo.png", 100, 500, width=200, height=100)
c.save()
  • drawImage()は、画像の左下の位置とサイズを指定します。
  • 対応フォーマットは基本的に JPEG / PNG です。

📌 このセクションのまとめ:

  • reportlabcanvasでPDFを生成
  • drawString()でテキストを自由な位置に配置
  • 日本語はフォント登録が必要(TTFファイルを使う)
  • showPage()でページ追加、drawImage()で画像挿入も可能!

これで、PDFの読み取りから編集・出力までフルカバーできました!




8. まとめ|PDF操作を自動化して業務効率UP!

今回は、Pythonを使ってPDFファイルを自在に操作する方法をご紹介しました。ここまで読んでくださった方は、PDFの扱いにグッと自信がついたのではないでしょうか?✨


🧠 本記事で学んだこと

✅ PDFをPythonで読み込む(pypdf)
✅ テキスト・画像の抽出
✅ ページごとの分割や複数ファイルの結合
✅ 新しいPDFにテキストや画像を書き込む(reportlab)


💼 どんな場面で使える?

  • 複数の請求書PDFを自動で結合して保存
  • 毎月のレポートPDFから必要なページだけ抽出
  • フォーム情報をもとに自動で帳票PDFを生成
  • 会議資料をPDF化して自動で保存・配布

業務の中で「毎回同じようなPDF操作をしているな…」という場面があれば、Pythonで一気に自動化してしまうのが断然おすすめです!


🛠 今後のステップ

今回紹介した内容は、すべて基本的な使い方ですが、Pythonには他にも以下のような強力なPDF操作ツールがあります:

  • pdfplumber(より精度の高いテキスト抽出が可能)
  • fitz(PyMuPDF:PDFの描画、ハイライト、注釈追加などが可能)

ニーズに合わせて組み合わせることで、さらに高度なPDF処理が可能になりますよ。


よくある質問(Q&A)

Q
PDFのテキスト抽出がうまくいきません。空っぽになります。
A

PDF内のテキストが「画像」として埋め込まれている場合、pypdfでは抽出できません。このようなPDFはOCR(文字認識)対応のライブラリ(例:Tesseract + pytesseract)の使用が必要です。

Q
日本語の文字が表示されず、文字化けしてしまいます。
A

reportlabで日本語を扱うには、日本語フォント(例:IPAゴシックやヒラギノ)を登録し、canvas.setFont()で設定する必要があります。英語フォントのままだと文字化けします。

Q
ページごとにPDFを分割したいのですが、1ページ目しか保存されません。
A

PdfWriterで書き出し処理をループで行っていない可能性があります。forループでページを一つずつ取り出して保存することで、すべてのページを分割できます。

※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。

※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。

スポンサーリンク