目的
本プログラムは複数ディレクトリに保存された各PDFファイルをOCRし、.txt形式で保存することを目的としています。
テキストを取り込んでNLPにかけたいときなど、Rで一気にやれると楽なので作ってみました。
こんな感じのディレクトリ構造を想定しています
こんな感じで整理してください
カレントディレクトリ
|--ディレクトリA
| |--PDFファイルa1
| |--PDFファイルa2
| |--PDFファイルa3
|
|--ディレクトリB
| |--PDFファイルb1
| |--PDFファイルb2
| |--PDFファイルb3
|
|--ディレクトリC
|--...
まずはパッケージのインストールなどをします
OCRのパッケージは精度が高めなtesseractを使います。なお、そのままだと日本語を認識しないため、日本語パックを使えるようにします。
install.packages("tesseract")#OCRのパッケージ
install.packages("Rcpp")#tesseractを利用するための依存パッケージ
library(tesseract)
tesseract_download('jpn')#日本語パックをダウンロード
正常に動いているか確認します。
>tesseract_info()
$datapath
[1] "C:\\Users\\XXXXXXX\\AppData\\Local\\tesseract4\\tesseract4\\tessdata/"
$available
[1] "eng" "jpn" "osd"
$version
[1] "4.1.1"
$configs
[1] "alto" "ambigs.train" "api_config" "bigram" "box.train" "box.train.stderr"
[7] "digits" "get.images" "hocr" "inter" "kannada" "linebox"
[13] "logfile" "lstm.train" "lstmbox" "lstmdebug" "makebox" "pdf"
[19] "quiet" "rebox" "strokewidth" "tsv" "txt" "unlv"
[25] "wordstrbox"
$availableに"jpn"が含まれていれば日本語パックのインストールは成功です。
ではやっていきましょう
今回はEドライブの'PDFバックアップ'というディレクトリで実行しました。
tesseractの挙動は、
- PDFの各ページ個別に.pngファイルを生成する
- .pngファイルを生成後にOCRを実行する
という挙動なので実行後に大量のpngファイルが残ります。なのでfor文の最後にpngファイルを消すスクリプトを書いています。
current_dir <- "E:/PDFバックアップ/"
setwd(current_dir)
pdf_dir <- c(list.files()) #PDFを取得するディレクトリの一覧表を取得
for (j in 1:length(pdf_dir)){
setwd(paste(current_dir,pdf_dir[j], sep=""))
for (i in 1:length(pdfdata)){
write(ocr(pdfdata[i], engine ="jpn"), paste(pdfdata[i],".txt", sep=""))
}
png_files <- c(list.files(pattern=".png"))
file.remove(png_files)
}