用 R 做 OCR

Posted

技术标签:

【中文标题】用 R 做 OCR【英文标题】:Doing OCR with R 【发布时间】:2015-11-05 22:14:39 【问题描述】:

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

这是一篇非常好的帖子。

有效的 3 个步骤:

    将 pdf 转换为 ppm(一种图像格式) 将 ppm 转换为 tif 准备好进行 tesseract(使用 ImageMagick 进行转换) 将 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" ))
  )

前两个步骤进行得很好。 (虽然花了很多时间,4页的pdf,但稍后会研究可扩展性部分,首先尝试是否可行)

运行时,前两个步骤可以正常工作。

在运行第三步时,即

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

我遇到了这个错误:

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

或者 Tesseract 崩溃了。

我们将不胜感激任何解决方法或根本原因分析。

【问题讨论】:

可以给myfiles的内容吗? @bdecaf - 不幸的是,由于数据安全问题,我不能。本质上是其公司的财务报表(扫描图像),位于 pdf(4 页)内。那个 pdf 在我的文件中。这不是一个 r 问题(这就是我的想法,但更多的是一个 tesseract 问题。 @r_analytics 您找到解决问题的方法了吗? 我在安装和运行 Teseract 时遇到了很多麻烦。有什么帮助吗? 【参考方案1】:

通过使用“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")

我是 R 和编程的新手。有错的请指教。希望对您有所帮助。

【讨论】:

是的,这很有帮助。您还可以在tesseract 小插图here 中看到类似的示例。一个小提示:library(tesseract) 也加载了pdftools 包,因此无需调用library(pdftools),尤其是您还使用了pdftools:: 调用函数的方式。 另外,对于纯文本文件,使用writeLines 代替write.table 可能会稍微好一些,请参阅here。希望此反馈对您有所帮助。【参考方案2】:

新发布的tesseract 包可能值得一试。它允许您在没有 shell 调用的情况下在 R 内部执行整个过程。

采用help documentation of the tesseract package 中使用的过程,您的函数将如下所示:

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" ))
)

【讨论】:

只是为了澄清这种方法只适用于可搜索的 pdf 而不是扫描的

以上是关于用 R 做 OCR的主要内容,如果未能解决你的问题,请参考以下文章

用matlab如何做一个变量关于另一个变量的曲线

用R语言做因子分析

统计|用R语言做Bootstrapping

用R语言pie函数做饼图

网络精讲 | 用R语言做统计初高级速成班(7.25-26)

推荐一款强大的OCR工具