Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

スキャンしたpdfファイルにOCR処理を行い,テキスト埋め込みpdfを作成する

More than 3 years have passed since last update.

はじめに

スキャナーで取り込んだ書籍や,ダウンロードしてきた論文pdf等は,内部にテキストデータが保持されていません。よって,検索などの機能を使うことができず,不便な思いをすることがありました。

そこで,OCR(光学文字認識)エンジンであるTesseractを用いて,画像から文字の抽出を行い,それらの文字データをpdfに埋め込んだ形でpdfファイルに保存する方法を調べてみました。

大まかな手順は

  1. pdf から 画像形式(png or ppm)へ変換
  2. 画像ファイルに対し,tesseractを用いて文字認識,抽出,文字データの埋め込まれたpdfの作成
  3. 作成されたpdfファイル群を一つのpdfファイルにまとめる

です。以下では,順に説明していきます。

0. tesseractのインストール

と,その前に,tesseractのインストールを行います。Wikiにも書いてあることをそのまま書きます。詳しくはそちらを見てください。

Linux の場合:

apt

sudo apt-get install tesseract-ocr tesseract-ocr-jpn

pacman

pacman -S tesseract tesseract-data-eng tesseract-data-jpn

rpm

tesseract Download (DEB, RPM, TGZ, TXZ)

Mac OS X の場合:

MacPorts

sudo port install tesseract tesseract-jpn

Homebrew

brew install tesseract tesseract-jpn

Windows の場合:

ここ(https://github.com/tesseract-ocr/tesseract/wiki)からインストーラをダウンロードしてインストール

日本語データはtesseract-ocr/tessdataからzipダウンロードできるので,ダウンロード,解凍して,C:\Program Files\Tesseract OCR\tessdata的なところにおく。

MSYS2の場合

Cygwinの場合

1. pdfから画像へ変換

僕がUbuntuを使用しているので,それに従った形で進めていきます。ご了承ください。

pdftoppmコマンドを用いて,pdfをpng形式に変換します。

mkdir foo.d
pdftoppm -png foo.pdf foo.d/page

のようにすると,foo.dディレクトリ以下に,page-nnnnnn.png(nnnnnnはページ番号)のように画像ファイルが作られていきます。

ページ端に黒い線があったりする場合には,この時点で-x,-y,-W,-Hオプションを指定することによって切り取っておくことをおすすめします。

2. 画像ファイルに対し,tesseractを用いて文字抽出,文字データの埋め込まれたpdf作成

Wikiにあるとおり,言語を指定したり,バージョン3.03以降であればデータが埋め込まれた状態でpdf出力することができます。

したがって,先ほどの例で言えばfoo.dディレクトリ以下のpage-001.pngみたいなファイルに対して,それぞれ

tesseract page-001.png -l eng+jpn pdf

のようにすれば,文字認識され,そのデータが埋め込まれたpage-001.pdfが作成されます。

find "./foo.d" -type f -name "*.png" | sed 's/\.png$//' | xargs -P8 -n1 -I% tesseract %.png % -l eng+jpn pdf

のようにxargsを使えば,foo.d以下のpngファイルに対し,並列処理で実行できます。

3. 作成されたpdfファイル群を一つのpdfファイルにまとめる

pdftkコマンドを使います。

foo.dディレクトリ以下のpdfファイルを,ページ番号順にまとめてfoo-ocr.pdfとして保存したいとき,以下のようにします。

pdftk ./foo.d/*.pdf cat output "foo-ocr.pdf"

残ったpngファイルやpdfファイルが不要な場合はfoo.dディレクトリを削除します。

シェルスクリプト化 (pdfocr)

以上の3つの過程をシェルスクリプトにまとめたものです。ご自由にお使いください。

dotfiles/pdfocr at master · ssh0/dotfiles

pdfocr foo.pdf

とすると,同じディレクトリ内に文字データが埋め込まれたfoo-ocr.pdfというpdfファイルが作成されます。

まとめ

スキャンしたpdfに対しても検索出来るようになり,便利になりました。ただし,tesseractが動いている間はCPU使用率がマックスになりますし,できた後のpdfは大体2倍くらいの容量になるので注意してください。また,自分でtesseract触ったことのある人なら分かるかと思いますが,まだまだ精度的な面で発展の余地があります。気休め程度に思って使ってみるのがいいと思います。

ssh0
[興味]物理/数学/Python/Linux/ShellScript 編集リクエスト、コメント、フォロー等はお気軽に。
http://ssh0.hatenablog.com/
team-lab
最新のテクノロジーを活用したシステムやデジタルコンテンツの開発を行うウルトラテクノロジスト集団
https://www.team-lab.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away