Fessで画像とスキャンPDFをOCR検索する

Fessで、画像やスキャンしたPDFに含まれる文字を検索できるように、Tesseract OCRを有効にする設定を追加しました。紙の見積書や請求書をPDF化して保管している場合など、これまで本文を抽出できなかった資料を検索対象にできます。今回はFess 15.9向けにマージされた変更を紹介します。

OCRの仕組み

画像はTika経由でTesseractを呼び出して文字を抽出します。PDFは従来どおりPDFBoxで本文を取り出し、本文が空の場合に限ってTikaへ処理を引き継ぎ、ページを画像化してOCRを行います。文字情報のあるPDFを一律にOCRし直す仕組みではありません。

OCRはデフォルトでは無効です。Fessの設定に加え、クローラープロセスが動く環境にTesseract本体と利用する言語データが必要になります。

設定方法

日本語と英語を読み取る場合は、fess_config.propertiesに以下を設定します。

crawler.document.ocr.enabled=true
crawler.document.ocr.language=jpn+eng
crawler.document.ocr.timeout=120

言語のデフォルトはeng、タイムアウトのデフォルトは120秒です。タイムアウトは画像1枚、またはPDFの1ページに対するTesseractの実行時間です。変更後はFessを再起動します。既にインデックスされたファイルにOCR本文を反映するには、本文抽出が再実行されるように再クロールしてください。

Tesseractの言語データは次のコマンドで確認できます。

tesseract --list-langs

日本語の文字間に不要な空白が入り、単語検索に一致しなくなる問題を避けるため、OCR設定ではpreserve_interword_spacesも有効にしています。

Dockerで利用する場合

docker-fessにcompose/tesseract/Dockerfileを追加しました。Tesseract本体とosd、eng、jpnのデータを含めたイメージをビルドするための構成です。osdはページの向きなどを判定する処理で利用します。

Composeではimage:の代わりにbuild: ./tesseractを使い、既存のJVMオプションに以下を加えます。

-Dfess.config.crawler.document.ocr.enabled=true
-Dfess.config.crawler.document.ocr.language=jpn+eng

追加時点のDockerfileは15.8.0をベースにしているため、そのままでは今回の設定を利用できません。OCR対応の15.9ビルドにベースイメージを合わせる必要があります。

既存環境での注意点

独自に変更したtika.xmlが保持されている環境では、TesseractOCRParserの除外設定が残っていないか確認してください。OCRを有効にしてもTesseractが使えない場合は警告を出します。また、クロール設定のconfig.tika.tesseract.configは全体設定より優先されます。

本文が空だった際の再解析ではOCRをスキップするため、文字のない画像などに同じOCR処理を繰り返さないようにしています。対象資料と必要な言語を確認しながら有効にすると、画像として保存していた文書にも検索を広げられます。

関連PR

saml2awsでplaywrightを取得できない

saml2awsの設定していて、ブラウザで認証させようとしても

Error authenticating to IdP.: could not install driver: could not install driver: error: got non 200 status code: 404 (404 Not Found) from https://playwright.azureedge.net/builds/driver/playwright-1.47.2-mac-arm64.zip
error: got non 200 status code: 404 (404 Not Found) from https://playwright-akamai.azureedge.net/builds/driver/playwright-1.47.2-mac-arm64.zip
error: got non 200 status code: 404 (404 Not Found) from https://playwright-verizon.azureedge.net/builds/driver/playwright-1.47.2-mac-arm64.zip

というエラーが出て、おかしいなーと思ったら、saml2awsが固定されたバージョンを見に行っている問題で、回避策はここに書いてあった。

CACHE=~/Library/Caches/ms-playwright-go/1.47.2
curl -sL -o /tmp/pw.zip "https://cdn.playwright.dev/dbazure/download/playwright/builds/driver/playwright-1.50.1-mac-arm64.zip"
mkdir -p "$CACHE" && unzip -oq /tmp/pw.zip -d "$CACHE" && chmod +x "$CACHE/node"
sed -i '' 's/"version": "1.50.1"/"version": "1.47.2"/' "$CACHE/package/package.json"
"$CACHE/node" "$CACHE/package/cli.js" install chromium

という感じで回避できた。

Smart Stock NotesのUIを更新する

https://www.smartstocknotes.jp のデザインを変えたいと思いつつ、着手できずに1年以上経過した感がある。WordPressを利用しているけど、独自テーマを作る時間もなかったので、どうしたものかと思っていたけど、今回、Claudeに丸投げして、独自テーマを作ってもらい、すっきりさせることができた。

広告枠とかの設定もAdsenseをどうしようかなとかも思っていたけど、それも含めて、Claude in ChromeでWordPressとAdsenseの設定から調整までまるっとやってもらった。自分でやろうとすると、調べたりとかしたりして、数日かかりそうな作業だが、数時間でできた。

Claudeでいろいろと更新ができる状態になったので、今後はもっと改善がしやすくなるはず。