用 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的主要内容,如果未能解决你的问题,请参考以下文章