【覚書】PythonでPDFのテキストミスチェックツール作った

目的

PDFのファイル名とPDFに記載されたテキストの不一致を自動で発見する。

判定する対象と内容

【対象ファイル形式】
PDFデータ

【やりたいこと】
PDFに記載されているテキスト内に、ファイル名と完全一致するテキストがあるか判定したい。
Pythonの環境が無い人も使えデータにして配布する前提で作る。

【ねらい】
誤字脱字防止、チェック時の手間削減

【できたらいいな】
フォルダ内全てのPDFをまとめて判定したい
判定の表示はアルファベット順に出したい
追加機能としてPDFを直接ドラックアンドドロップで入れても判定できるようにしたい(←これは現段階では一旦諦め中)

作る前に考えたこと

PDF テキスト抽出、テキストの一致、デスクトップアプリ作成を組み合わせたら、欲しいツールが作れそう!

完成したコード

エディター上で判定する場合

from pdfminer.high_level import extract_text
import os

# PDFファイルが保存されているディレクトリを指定
pdf_directory = "該当フォルダの場所を入力"

# 該当フォルダ内のPDFファイルをループして処理
for pdf_file in os.listdir(pdf_directory):
    # ファイル名が.pdfで終わるか確認
    if pdf_file.endswith(".pdf"):
        # PDFファイルのパスを生成
        pdf_path = os.path.join(pdf_directory, pdf_file)
        
        # 期待するテキストを一つ目のファイル名(拡張子を除いた部分)に指定
        expected_text = os.path.splitext(pdf_file)[0]
        
        # PDFファイルからテキストを抽出
        pdf_text = extract_text(pdf_path)
        
        # 期待するテキストが抽出したテキスト内にあるか判定
        if expected_text in pdf_text:
            print(f"{pdf_file}: Match")
        else:
            print(f"{pdf_file}: No match")

Pythonが使えない環境でも同じように判定できるように、
デスクトップアプリにしたい!

TKinterでデスクトップアプリにできそう!

デスクトップアプリで判定する場合

import tkinter as tk
from tkinter import filedialog
from pdfminer.high_level import extract_text
import os


def check_pdf_files(pdf_directory):
    result_text.delete(1.0, tk.END)  

    matches = []
    no_matches = []

    for pdf_file in os.listdir(pdf_directory):
        if pdf_file.endswith(".pdf"):
            pdf_path = os.path.join(pdf_directory, pdf_file)
            pdf_text = extract_text(pdf_path)

            expected_text = os.path.splitext(pdf_file)[0]

            if expected_text in pdf_text:
                matches.append(pdf_file)
            else:
                no_matches.append(pdf_file)

    result_text.insert(tk.END, "【〇 Match】\n")  
    for match in sorted(matches):
        result_text.insert(tk.END, f"{match}\n")

    result_text.insert(tk.END, "\n【× Not match】\n")  
    for no_match in sorted(no_matches):
        result_text.insert(tk.END, f"{no_match}\n")


def select_directory():
    pdf_directory = filedialog.askdirectory()
    directory_entry.delete(0, tk.END)
    directory_entry.insert(0, pdf_directory)


app = tk.Tk()
app.title("PDF File Name Checker")

# ディレクトリ選択ボタン
select_button = tk.Button(app, text="フォルダを選択", command=select_directory)
select_button.place(x=5, y=1)

# ディレクトリ入力エントリー
directory_entry = tk.Entry(app)
directory_entry.place(x=5, y=31)

# チェックボタン
check_button = tk.Button(app, text="Check", command=lambda: check_pdf_files(directory_entry.get()))
check_button.place(x=5, y=61)

# 結果表示エリア
result_text = tk.Text(app)
result_text.place(x=1, y=91)

app.mainloop()

実行すると、デスクトップアプリが立ち上がる。

該当フォルダを選択、もしくは場所を貼り付けして指定。
checkを押すと、

判定結果が出る!

考えられる誤字脱字データを一通り作成して検証。

テキストデータでなので、不要なオブジェクトの重なりとか、紙面からはみ出ているとかの間違いは見つけられないけど、おおむね作りたいものができた!

使い方や注意点の資料作って、配布準備する。

PDF を直接ドラッグアンドドロップして判定できる機能を追加したかったけど、なかなか追加できず一旦諦め。
もう少し力がついた未来の自分に託す。

配布用データ作成

配布用データ作成も初めてで手こずったのでメモ。
Macで作ってたので、windowsで使えるようにするのも一苦労。

作ってみて

プログラミング全くの初心者なのに、
仕事でこんなのあったら役立つのでは?と思いつき、
勉強を始め、勢いで作った。
完全無知だったので環境構築から何度もつまずき、何回もエラーになるし、エラーでなくても判定がうまくできていなくて半べそ。

突破口!と思ったのは順番の指定だった。
コードはほとんどchatGPTに書いてもらっていたけど、なかなか目指す結果が出なかった。
やりたいことを整理して、コードを分解して、順序を指定したら即解決。
(なるほど、世に言うプログラミング思考とか論理的な説明ってこういうこと…?っていうのが少し体感できたのが収穫!)

始めたときは無理かも…と思ってたけど、コツコツ頑張ってみたら作れた!
え!なんか、できちゃった!という喜びと、
いかんせん勢いで作ったので、忘れるスピードも早そう…忘れないために、書いておくことにしたのでした。

初めてのツール作成に役立ったものも後でまとめよう〜。


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