【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)
この記事が気に入ったらサポートをしてみませんか?