はじめに
あなたのライブラリーから、点数で見たマナ・コストがX以下のアーティファクト・カードを1枚探し、それを場に出す。1 nikkieです。
異常系への対応という文脈になりますが、PDFにもOCRを適用できるんです!
目次
pdfminer.sixでPDFを読み取る
extract_text()
関数にPDFのパスを渡すだけで読み取れました!
しかしながら、スキャンされたPDFを読めない2ことも分かっています。
例:https://www.city.fujiyoshida.yamanashi.jp/div/shoko/pdf/toukei04/syougyou.pdf3
これを読む方法(の1つ)をアウトプットです。
pdf2image
- Python 3.11.8
- pdf2image 1.17.0
- pillow 10.2.0 も合わせて入りました
macOSでは、PDF rendering libraryのpopplerのインストールも必要でした。
READMEを参照すると、使い方はこちらもとっても簡単。
https://github.com/Belval/pdf2image/tree/v1.17.0?tab=readme-ov-file#how-does-it-work
convert_from_path()
関数にPDFのパスを渡すだけです!
>>> from pdf2image import convert_from_path >>> images = convert_from_path("syougyou.pdf") >>> images[0].save("page0.png")
TesseractでOCR
Tesseractの環境構築はこちら
- tesseract 5.3.4
- tessdata_bestのjpn, jpn_vertをインストール
pdf2imageを使って保存した画像を渡します。
% tesseract page0.png tmp -l jpn txt
(出力されるtmp.txtがOCR結果です)
pytesseractでPythonからもOCR
- pytesseract 0.3.10
>>> import pytesseract >>> result = pytesseract.image_to_string(images[1], lang='jpn')
pdf2imageがPillowのImage
を返すので、それをそのままpytesseractに渡せます4
終わりに
スキャンされたPDFはpdfminer.sixで読み取れませんが、pdf2image と OCR (Tesseract) の合わせ技で読み取れます!
これは私のアイデアではなく、Unstructured5のソースコードを読んでいて知りました。
Unstructuredのpartition_pdf
の仕組みはどこかでアウトプットできたらいいな〜と思っています。
- 《求道者テゼレット》↩
- https://github.com/pdfminer/pdfminer.six/issues/597#issuecomment-804797643↩
- で知ったPDFです。こちらにまとめた事例の1つです ↩
-
images[1]
は回転させて保存した画像を渡した方が、精度が高そうに思われます↩ - Unstructured素振り記事 ↩