用R做OCR

r_a*_*ics 11 pdf ocr shell tesseract r

我一直在尝试在R中进行OCR(读取数据作为扫描图像的PDF数据).一直在读这个@ http://electricarchaeology.ca/2014/07/15/doing-ocr-within-r/

这是一篇非常好的帖子.

有效3个步骤:

  1. 将pdf转换为ppm(图像格式)
  2. 将ppm转换为tif准备好tesseract(使用ImageMagick进行转换)
  3. 将tif转换为文本文件

根据链接帖子的上述3个步骤的有效代码:

lapply(myfiles, function(i){
  # convert pdf to ppm (an image format), just pages 1-10 of the PDF
  # but you can change that easily, just remove or edit the 
  # -f 1 -l 10 bit in the line below
  shell(shQuote(paste0("F:/xpdf/bin64/pdftoppm.exe ", i, " -f 1 -l 10 -r 600 ocrbook")))
  # convert ppm to tif ready for tesseract
  shell(shQuote(paste0("F:/ImageMagick-6.9.1-Q16/convert.exe *.ppm ", i, ".tif")))
  # convert tif to text file
  shell(shQuote(paste0("F:/Tesseract-OCR/tesseract.exe ", i, ".tif ", i, " -l eng")))
  # delete tif file
  file.remove(paste0(i, ".tif" ))
  })
Run Code Online (Sandbox Code Playgroud)

前两步发生得很好.(尽管需要花费大量时间,对于4页pdf,但稍后会考虑可扩展性部分,首先尝试这是否有效)

在运行这个时,第一步就可以了.

继续第三步,即

shell(shQuote(paste0("F:/Tesseract-OCR/tesseract.exe ", i, ".tif ", i, " -l eng")))
Run Code Online (Sandbox Code Playgroud)

我有这个错误:

错误:评估嵌套太深:无限递归/选项(表达式=)?

或者Tesseract正在崩溃.

任何变通方法或根本原因分析将不胜感激.

小智 7

通过使用“tesseract”,我创建了一个有效的示例脚本。即使它也适用于扫描的 PDF。

library(tesseract)
library(pdftools)

# Render pdf to png image

img_file <- pdftools::pdf_convert("F:/gowtham/A/B/invoice.pdf", format = 'tiff',  dpi = 400)

# Extract text from png image
text <- ocr(img_file)
write.table(text, "F:/gowtham/A/B/mydata.txt")
Run Code Online (Sandbox Code Playgroud)

我是 R 和编程的新手。如果错了请指导我。希望这对你有帮助。


Mar*_*ing 5

新发布的tesseract软件包可能值得一试。它使您无需shell调用即可在R内部执行整个过程。

按照tesseract软件包帮助文档中使用的过程,您的函数将如下所示:

lapply(myfiles, function(i){
  # convert pdf to jpef/tiff and perform tesseract OCR on the image

  # Read in the PDF
  pdf <- pdf_text(i)
  # convert pdf to tiff
  bitmap <- pdf_render_page(news, dpi = 300)
  tiff::writeTIFF(bitmap, paste0(i, ".tiff"))
  # perform OCR on the .tiff file
  out <- ocr(paste0, (".tiff"))
  # delete tiff file
  file.remove(paste0(i, ".tiff" ))
})
Run Code Online (Sandbox Code Playgroud)