nikkie-ftnextの日記

イベントレポートや読書メモを発信

スキャンされたPDFを画像にして(pdf2image)、Tesseractで読み取る

はじめに

あなたのライブラリーから、点数で見たマナ・コストが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の仕組みはどこかでアウトプットできたらいいな〜と思っています。


  1. 《求道者テゼレット》
  2. https://github.com/pdfminer/pdfminer.six/issues/597#issuecomment-804797643
  3. で知ったPDFです。こちらにまとめた事例の1つです
  4. images[1]は回転させて保存した画像を渡した方が、精度が高そうに思われます
  5. Unstructured素振り記事