Day 40:PDF操作で「紙の資料」をコードで扱えるようにする
Day 40では、業務でよく使われる PDFファイル をPythonから操作する方法を学びます。 紙の資料やレポートがPDFで配られることは多いですが、それを「分割・結合・テキスト抽出」できるようになると、 資料整理や情報抽出を自動化できるようになります。
扱うキーワードは次の4つです。
- PDF読み込み
- PDF分割
- PDF結合
- テキスト抽出
ここでは、初心者向けにかみ砕いて、 代表的なPDFライブラリ(ここでは PyPDF2)を使った基本操作をステップバイステップで説明していきます。
PDFライブラリの準備
PyPDF2のインストール
まずはPDFを扱うためのライブラリをインストールします。
bash
pip install PyPDF2
Pythonコードの中では次のようにインポートします。
from PyPDF2 import PdfReader, PdfWriter
Python- PdfReader:PDFを読み込むためのクラスです。
- PdfWriter:新しいPDFを作成したり、ページを追加したりするためのクラスです。
PDF読み込み:ページ数や基本情報を確認する
PDFを開いてページ数を表示する
# day40_pdf_read.py
from PyPDF2 import PdfReader
def read_pdf_basic(filename="sample.pdf"):
"""PDFを読み込んでページ数などの基本情報を表示する例です。"""
# PDFファイルを読み込みます(バイナリモードで開きます)。
reader = PdfReader(filename)
# ページ数を取得します。
num_pages = len(reader.pages)
print(f"このPDFのページ数: {num_pages}")
# 1ページ目の情報を少し見てみます。
first_page = reader.pages[0]
print("1ページ目のオブジェクト:", first_page)
if __name__ == "__main__":
read_pdf_basic()
Pythonポイント:
PdfReader(filename)でPDFファイルを読み込めます。len(reader.pages)でページ数を取得できます。reader.pages[0]で1ページ目のページオブジェクトにアクセスできます。
PDF分割:特定ページだけを別PDFにする
例:1ページ目だけを切り出して新しいPDFに保存する
# day40_pdf_split.py
from PyPDF2 import PdfReader, PdfWriter
def split_first_page(input_file="sample.pdf", output_file="sample_page1.pdf"):
"""PDFの1ページ目だけを切り出して新しいPDFとして保存する例です。"""
reader = PdfReader(input_file)
writer = PdfWriter()
# 1ページ目を取得します(0番目が1ページ目です)。
first_page = reader.pages[0]
# 新しいPDFに1ページ目を追加します。
writer.add_page(first_page)
# 新しいPDFファイルとして保存します。
with open(output_file, "wb") as f:
writer.write(f)
print(f"1ページ目だけを {output_file} に保存しました。")
if __name__ == "__main__":
split_first_page()
Python例:指定範囲(1〜3ページ)を切り出す
from PyPDF2 import PdfReader, PdfWriter
def split_range(input_file="sample.pdf", output_file="sample_pages_1_3.pdf"):
"""PDFの1〜3ページを切り出して新しいPDFとして保存する例です。"""
reader = PdfReader(input_file)
writer = PdfWriter()
# ページ番号は0始まりなので、0〜2が1〜3ページに相当します。
for page_index in range(0, 3):
page = reader.pages[page_index]
writer.add_page(page)
with open(output_file, "wb") as f:
writer.write(f)
print(f"1〜3ページを {output_file} に保存しました。")
if __name__ == "__main__":
split_range()
Pythonポイント:
PdfWriter()に対してadd_page()でページを追加していく。- 最後に
writer.write()で新しいPDFとして保存する。 - 「分割」とは、元PDFから必要なページだけを取り出して新しいPDFを作ること。
PDF結合:複数PDFを1つにまとめる
例:複数PDFを順番に結合する
# day40_pdf_merge.py
from PyPDF2 import PdfReader, PdfWriter
def merge_pdfs(input_files, output_file="merged.pdf"):
"""複数のPDFを結合して1つのPDFにする例です。"""
writer = PdfWriter()
for filename in input_files:
print(f"{filename} を結合対象として読み込みます。")
reader = PdfReader(filename)
# 各PDFの全ページを順番に追加します。
for page in reader.pages:
writer.add_page(page)
# 結合結果を新しいPDFとして保存します。
with open(output_file, "wb") as f:
writer.write(f)
print(f"結合したPDFを {output_file} に保存しました。")
if __name__ == "__main__":
files_to_merge = ["sample_page1.pdf", "sample_pages_1_3.pdf"]
merge_pdfs(files_to_merge, "merged_sample.pdf")
Pythonポイント:
- 複数のPDFファイルを
PdfReaderで順番に読み込む。 - 各ファイルの
reader.pagesをループしてadd_page()で追加していく。 - 最後に1つのPDFとして保存することで、「結合」が完了する。
テキスト抽出:PDFから文字情報を取り出す
例:全ページのテキストを抽出して表示する
# day40_pdf_text_extract.py
from PyPDF2 import PdfReader
def extract_text_from_pdf(filename="sample.pdf"):
"""PDFからテキストを抽出して表示する例です。"""
reader = PdfReader(filename)
all_text = ""
# 全ページをループしてテキストを抽出します。
for page_index, page in enumerate(reader.pages):
text = page.extract_text() # ページからテキストを抽出します。
print(f"=== ページ {page_index + 1} のテキスト ===")
print(text)
print("-----------------------------")
# 全ページ分のテキストをまとめておきます。
all_text += text + "\n"
return all_text
if __name__ == "__main__":
extract_text_from_pdf()
Pythonポイント:
page.extract_text()で、そのページに含まれるテキストを取得できる。- PDFの構造によっては、テキストがうまく取れない場合もありますが、 「テキストベースのPDF」であればかなりの確率で抽出できます。
抽出したテキストをファイルに保存する
from PyPDF2 import PdfReader
def extract_text_to_file(input_pdf="sample.pdf", output_txt="sample_text.txt"):
"""PDFからテキストを抽出してテキストファイルに保存する例です。"""
reader = PdfReader(input_pdf)
all_text = ""
for page in reader.pages:
text = page.extract_text()
all_text += text + "\n"
# テキストファイルとして保存します。
with open(output_txt, "w", encoding="utf-8") as f:
f.write(all_text)
print(f"PDFのテキストを {output_txt} に保存しました。")
if __name__ == "__main__":
extract_text_to_file()
PythonDay 40総合テンプレート:PDF基本操作ツール
最後に、Day 40で扱った要素をまとめた「PDF基本操作ツール」のテンプレートを示します。
# day40_pdf_tool.py
from PyPDF2 import PdfReader, PdfWriter
def read_pdf_info(filename="sample.pdf"):
reader = PdfReader(filename)
num_pages = len(reader.pages)
print(f"PDFファイル: {filename}")
print(f"ページ数: {num_pages}")
return reader
def split_pdf(input_file="sample.pdf", output_file="sample_pages_1_3.pdf", start=0, end=3):
reader = PdfReader(input_file)
writer = PdfWriter()
for page_index in range(start, end):
writer.add_page(reader.pages[page_index])
with open(output_file, "wb") as f:
writer.write(f)
print(f"{input_file} の {start + 1}〜{end} ページを {output_file} に保存しました。")
def merge_pdfs(input_files, output_file="merged.pdf"):
writer = PdfWriter()
for filename in input_files:
reader = PdfReader(filename)
for page in reader.pages:
writer.add_page(page)
with open(output_file, "wb") as f:
writer.write(f)
print(f"PDFを結合して {output_file} に保存しました。")
def extract_text(input_pdf="sample.pdf", output_txt="sample_text.txt"):
reader = PdfReader(input_pdf)
all_text = ""
for page_index, page in enumerate(reader.pages):
text = page.extract_text()
print(f"=== ページ {page_index + 1} ===")
print(text)
print("-----------------------------")
all_text += text + "\n"
with open(output_txt, "w", encoding="utf-8") as f:
f.write(all_text)
print(f"テキストを {output_txt} に保存しました。")
def main():
# 1. PDF情報表示
read_pdf_info("sample.pdf")
# 2. PDF分割(1〜3ページ)
split_pdf("sample.pdf", "sample_pages_1_3.pdf", start=0, end=3)
# 3. PDF結合
merge_pdfs(["sample_pages_1_3.pdf", "sample_pages_1_3.pdf"], "merged_sample.pdf")
# 4. テキスト抽出
extract_text("sample.pdf", "sample_text.txt")
if __name__ == "__main__":
main()
PythonDay 40のまとめ
Day 40では、PDF操作として、
PdfReaderでPDFを読み込み、ページ数やページオブジェクトにアクセスする方法PdfWriterを使って、特定ページだけを切り出して新しいPDFを作る「分割」の方法- 複数PDFの全ページを順番に追加して1つのPDFにする「結合」の方法
extract_text()でPDFからテキストを抽出し、画面表示やテキストファイル保存を行う方法
をステップバイステップで体験していただきました。
ここまで来ると、PDFを「ただ見るだけのファイル」から、 「Pythonで分割・結合・テキスト抽出できるデータ源」 として扱えるようになります。 この基礎をベースに、業務で使うPDF帳票の自動整理や、 テキスト抽出による検索・分析などにも応用していくことができます。
