pip install pymupdf
import fitz # PyMuPDF
import tkinter as tk
from tkinter import filedialog
import os
def mark_text_in_pdf(input_path, output_path, target_text):
"""
PDF内の特定の文字列を検索し、青枠で囲んで保存する関数
"""
try:
doc = fitz.open(input_path)
count = 0
for page in doc:
text_instances = page.search_for(target_text)
for rect in text_instances:
# 青枠を描画 (colorはRGB 0~1, widthは線の太さ)
page.draw_rect(rect, color=(0, 0, 1), width=1.5)
count += 1
if count > 0:
doc.save(output_path)
print(f"\n成功! '{target_text}' は {count} 箇所見つかりました。")
print(f"保存ファイル: {output_path}")
else:
print(f"\n結果: '{target_text}' は見つかりませんでした。")
doc.close()
except Exception as e:
print(f"エラーが発生しました: {e}")
def select_pdf_file():
"""
エクスプローラー(ファイル選択ダイアログ)を開く関数
"""
# ルートウィンドウを作成し、すぐに非表示にする(余計な小窓を出さないため)
root = tk.Tk()
root.withdraw()
# ファイル選択ダイアログを表示
file_path = filedialog.askopenfilename(
title="処理するPDFファイルを選択してください",
filetypes=[("PDFファイル", "*.pdf")]
)
return file_path
# --- メイン処理 ---
if __name__ == "__main__":
print("PDFファイルを選択してください...")
# 1. エクスプローラーでファイルを選択
input_file = select_pdf_file()
if input_file:
# 2. 検索したい言葉を入力
print(f"選択されたファイル: {input_file}")
search_word = input("検索して囲みたい文字列を入力してください: ")
if search_word:
# 出力ファイル名を自動生成 (例: data.pdf -> data_marked.pdf)
base_name, ext = os.path.splitext(input_file)
output_file = f"{base_name}_marked{ext}"
# 3. 処理実行
mark_text_in_pdf(input_file, output_file, search_word)
else:
print("検索文字が入力されなかったため、処理を中断しました。")
else:
print("ファイルが選択されませんでした。")


コメント