2025年6月23日月曜日

agent が pdf を読めない

今まで Visual Studio 2022 の github copilot の chat モードでAIと戯れていたんですが、 Visual studio code を使うと、github copilot の agent モードというのがあって、こいつ、Visual Studio code で開いたプロジェクトディレクトリ下なら、トランザクション操作付きでファイルを読み書きできると知りました(今まで、全く気が付いていませんでした)。

agent にお願いしたら、markdown 形式のテキストファイルなら、がんがん書き込んでくれます。
ファイルを書き込むためには、最初 mcp-filesystem が必要だと思ってたんで、びっくり。
こちらで実行ボタンを押す必要がありますが、agent にバッチファイルを書かせて、バッチファイルを実行させる事もできます。
調子こいて、Android Studio でビルドしたエラー switch 文を if文に修正する仕事を、Visual Studio code 上で agent に任せて仕事をさせました。
そしたら、ちゃんと修正してくれる。
ただし、書き換えた中身をチェックしないと、前後の id とかいう変数を勝手に if文に組み込んで書き換えようとしたり、時々、とんでもない間違いをします
5000行あるファイルの修正では、
  foo = hoge.bar();
という同じ内容が記載されている行間をバッサリと削除してくれたりもしました。
ファイルが大きいと、エラーメッセージで指摘されている行うよりも下の箇所を修正しようとしたりしまして、「当該箇所より40行ほど上の箇所」とエージェントに指示しないと正しい箇所を修正してくれない時もありました。

まあ、そんな感じでagent使えるじゃん!と、気をよくしてPDFから処理をさせようとしたら、pdfが読めない
先日 markdown ファイルを印刷したいと思って、pandoc を入れました。
PDFを直接読んでくれたら楽なんですけど、まだ、そこまでAIは学習していないようで、mcp-server で pdf を読めるものを試してみましたが、今一つ
ぼやいてたら、ツールの変換内容によって、ちゃんと文字列として変換できない場合もあり、そんな時は精度が上がらないと教えていただきました

じゃ、pdf に変換は? pandoc input.pdf -o output.md でOKかと思いきや、日本語関係でうまく行かない
で、こちらを試してみたんですが、これも日本語フォントがダメでうまく動かない
という事で、結局、こちらを参考に書きました

ほんと、やっつけです。ごめんなさい
pip install pymupdf4llm
して、下記 pdf2md.py を実行します。
C:\doc>python pdf2md.py
または、
C:\doc>python pdf2md.py hoge.pdf
以下、pdf2md.py です。
import os
import re
import sys
import glob
import pymupdf4llm
import pathlib


def extract_text_from_pdf(pdf_file):
    return pymupdf4llm.to_markdown(pdf_file)


def convert_pdf_to_marp(pdf_file):
    base_name = os.path.splitext(pdf_file)[0]
    md_file = f"{base_name}.md"

    try:
        # PDFからテキストを抽出
        extracted_text = extract_text_from_pdf(pdf_file)
        
        # 変更を保存
        with open(md_file, "w", encoding="utf-8") as file:
            file.write(extracted_text)

        print(f"Converted {pdf_file} to {md_file}")
    except Exception as e:
        print(f"Unexpected error occurred while processing {pdf_file}: {e}")

def main():
    if len(sys.argv) > 1:
        pdf_files = sys.argv[1:]
    else:
        pdf_files = glob.glob("*.pdf")
    
    if not pdf_files:
        print("No PDF files found or specified.")
        return

    for file in pdf_files:
        if os.path.isfile(file) and file.lower().endswith('.pdf'):
            convert_pdf_to_marp(file)
        else:
            print(f"Skipping {file}: Not a valid PDF file.")

if __name__ == "__main__":
    main()

0 件のコメント: