見出し画像

【Python】PDFからコメント付きページのみを抜き出す

PDFに赤字を入れていて、赤字を入れたページのみを抽出する必要が出てきたので、スクリプトを生成AIに書いてもらった。

GPT-4とGeminiでは何度やってもダメだったので、Claude 3 Opusに放り込んだら一発でできた。

from PyPDF2 import PdfReader, PdfWriter

def extract_pages_with_comments(input_pdf, output_pdf):
    reader = PdfReader(input_pdf)
    writer = PdfWriter()

    for page_num in range(len(reader.pages)):
        page = reader.pages[page_num]
        if '/Annots' in page:
            writer.add_page(page)

    with open(output_pdf, 'wb') as f:
        writer.write(f)

# 使用例
input_pdf = 'input.pdf'
output_pdf = 'output.pdf'
extract_pages_with_comments(input_pdf, output_pdf)

ライブラリはPyPDF2を使っている。なお、環境はHomebrewからpyenvを入れてPython 3.12.3導入(それさえないところからスタートした)。

環境のインストール時には、以下のページを参照した。

「pyenv global x.x.x」を忘れると、普通に詰まるので注意。

なお、たまにコメントのないページが抽出される模様。「/Annots」という文字列?をPDFで探しているようだが、コメントがないのにその文字列がヒットしたページが抽出される。条件は不明だ。

追記(2024.6.15)

特に問題ないPDFなのに、上に挙げたスクリプトで抽出できないものがあったので、GPT-4で作り直した。使用ライブラリがPyMuPDFに変更されている。

import fitz  # PyMuPDF

def extract_pages_with_comments(input_pdf, output_pdf):
    try:
        document = fitz.open(input_pdf)
        writer = fitz.open()

        for page_num in range(document.page_count):
            page = document.load_page(page_num)
            if page.first_annot:
                writer.insert_pdf(document, from_page=page_num, to_page=page_num)

        writer.save(output_pdf)
        writer.close()
        print(f"Pages with comments have been extracted to {output_pdf}")
    except Exception as e:
        print(f"Error processing PDF file: {e}")

# 使用例
input_pdf = 'input.pdf'
output_pdf = 'output.pdf'
extract_pages_with_comments(input_pdf, output_pdf)


この記事が気に入ったらサポートをしてみませんか?