kachick / times_kachick

`#times_kachick channel in chat` as a public repository. Personal Note and TODOs
https://github.com/kachick/times_kachick/issues?q=is%3Aissue+is%3Aclosed
6 stars 0 forks source link

2022-06-14 - 画像ファイルから OCR 掛けた searchable PDF をオフラインで作る #165

Closed kachick closed 2 years ago

kachick commented 2 years ago

以前持ってた紙の書籍とか自炊しようとしたけど、スキャナ(FI-7180)の付属ソフト任せでPDFにまで持っていくとあんま満足出来る画質にならなくて取り敢えずと画像ファイルの状態のままで取ってあった。当時 ImageMagick とか pngquant で素人なりに処理してた時のメモ書きが https://gist.github.com/kachick/8521699

自分にとってはかなり高価な機材なのにずっと押し入れで埃被ってたんだけど、PFUがリコーに買収というニュースを聞いてなんとなく引っ張り出して書類の類をなんでもこいつでPDF化しだしたら超速で便利便利・・・冊子形式の物は一回バラす手間があるので億劫なんだけど、プリントとかホチキスで止まってる程度でA4以内の物は全部こいつでいいやと思ってる。適した資材持ってるのに8年間眠らせて安物のフラットベッドスキャナだけ使ってたの悔やまれる。

そして当時画像のままでも良いんではと思ってたスキャンデータだけど、いやー全然読む気にならなかった。電子書籍読むときにはやっぱそれに適したワンファイルに固まってると便利なんだなー。 後は趣味のボードゲームで取り込むデータが定形A4の幅に収まらない事も多くて、今後も画像形式での取り込みを0に出来そうにない。ということで、こいつらをPDFにまとめて取り回ししやすくしたい。

Affinity のライセンスは買ってあるんだけど使い方がよくわからない。 Adobe もオンラインでPDF変換できる機能群を提供してくれている んだけど、OCRに関しては無料サービス外っぽいし、別にセンシティブなデータは無いはずといえそれなりにデカいファイルを何でもかんでもオンラインの処理に掛けるのはちょっとウッとなった。

ということでOCR出来るOSSを探してみると、 https://github.com/tesseract-ocr/tesseract が多言語対応してる。CLIも提供してくれてて pdf 変換も可能という事なのでちょっと使って見ることにした。 ただ複数の画像ファイルを1つの pdf に出力するというパターンでも、 input は 1 path なのでここにファイルのパスリストを渡す必要があるというちょっとクセのある感じだった。

windows のバイナリインストールに時間かかってる間に WSL2 側がさっくり終わったので、最終的に使ってるワンライナー?をメモっておく

まず入れる。

sudo add-apt-repository ppa:alex-p/tesseract-ocr-devel
sudo apt update
sudo apt-get install tesseract-ocr tesseract-ocr-jpn tesseract-ocr-jpn-vert tesseract-ocr-script-jpan tesseract-ocr-script-jpan-vert

以下で、カレントディレクトリに有るそれっぽい画像ファイルを、カレントディレクトリ名ごにょごにょ.pdf に吐き出す。 -l の先の指定順で使用言語とその優先順を指定できるみたいなんだけど、jpn 単体から eng 混ぜやその順番まで日本語のファイルに幾つか試してみてもこれは理想的だ~みたいな結果は出なかった。これは tesseract の対応がまだあんま良くないのかもっといい方法が有るのか・・・ 縦書きだと vert の方が必要っぽい。

(list=$(mktemp -t tesseract-inputfiles.XXXXXX) && find "$PWD" -type f -regextype gnu-awk -regex '.*.(png|jpe?g|tiff?)' | sort >> "$list" && tesseract "$list" "./$(basename "$PWD")-Japanese+jpn+eng" -l Japanese+jpn+eng pdf && rm -f "$list")

ということでオプション部分とかは変わるかもだけど、取り敢えず使える。 試したバージョンは以下

❯ tesseract --version
tesseract 5.1.0-32-gf36c0
 leptonica-1.79.0
  libgif 5.1.4 : libjpeg 8d (libjpeg-turbo 2.0.3) : libpng 1.6.37 : libtiff 4.1.0 : zlib 1.2.11 : libwebp 0.6.1 : libopenjp2 2.3.1
 Found AVX2
 Found AVX
 Found FMA
 Found SSE4.1
 Found OpenMP 201511
 Found libarchive 3.4.0 zlib/1.2.11 liblzma/5.2.4 bz2lib/1.0.8 liblz4/1.9.2 libzstd/1.4.4
 Found libcurl/7.68.0 OpenSSL/1.1.1f zlib/1.2.11 brotli/1.0.7 libidn2/2.2.0 libpsl/0.21.0 (+libidn2/2.2.0) libssh/0.9.3/openssl/zlib nghttp2/1.40.0 librtmp/2.3

余談。 Windows の path に WSL でアクセスする際は mnt/ドライブ名つけて~みたいな感じなんだけど、セパレータが違ってたりで微妙に面倒なんだよなー。と思ってたら wslpath という組み込みのツールが合った。地味に便利。

kachick commented 1 year ago

どっかのタイミングから、OCRがまともにかからなくなったようだった。原因はよくわかってないながら、そもそもそんなに日本語に対する精度が高く無かった事もあって他のを探してみた。

https://github.com/PaddlePaddle/PaddleOCR がやたら ⭐ 多い。中華圏で盛り上がっているからか多言語対応精度高そうなんだけど、docker の image pull が完了しなかったり、 直接 python 使うには anaconda とかいうの入れる必要がある上に https://github.com/PaddlePaddle/Paddle/issues/43908 だとか Ubuntu 22.04 未対応とかで引っかかって面倒になってしまった。 https://github.com/PaddlePaddle/Paddle/issues/44571#issuecomment-1268797171 みたいな話もあったけど、rc入れても解消せず。

そこで次に ⭐ 多め見てみると、 なんか最近アクティビティが増えたようなプロジェクトが https://github.com/ocrmypdf/OCRmyPDF 。そうだよなー、6月に調べた時たどり着けなかった気が・・・ 画像からPDF化する際には1ページ限定なので先に https://github.com/josch/img2pdf 使うと良いよとか、エンジンには tesseract-ocr を使ってるということが書いてあるのでラッパーというかフロントエンドリファインみたいな感じ・・・?

しかし、たしかに取り敢えずサクッと動いた。過去の中途半端にテキストが乗っかってしまったOCRデータを上書きする --redo-ocr オプションとかもある。エンジンが同じということで、大幅に日本語の読み取り精度上がった印象は受けなかったけど、使い易いので助かる。

使い方の一例

img2pdf ./*.png -o out.pdf && ocrmypdf -l jpn+eng out.pdf ocred.pdf
kachick commented 5 months ago

この手のツールセットと自分のコードとグルースクリプトみたいなのまとめて管理するのNixが最適なので https://github.com/kachick/pdf-workspace へ リポジトリ化しておいた