使用R进行OCR处理

16

我一直在努力在R中进行OCR(读取PDF数据并将其转换为扫描图像)。阅读了这篇文章:http://electricarchaeology.ca/2014/07/15/doing-ocr-within-r/

这是一篇非常好的文章。

有效的步骤包括:

  1. 将pdf转换为ppm(图像格式)
  2. 使用ImageMagick将ppm转换为tif,以便使用tesseract(convert工具)
  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" ))
  })

前两个步骤进行得很好。(虽然处理4页PDF需要花费相当长的时间,但之后会考虑可扩展性,现在先尝试这是否有效)

运行时,前两个步骤正常。

在运行第三步骤时,即

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

我遇到了这个错误:

Error: evaluation nested too deeply: infinite recursion / options(expressions=)?

或者说 Tesseract 崩溃了。

如果有任何解决方法或根本原因分析,将不胜感激。


你能提供“myfiles”的内容吗? - bdecaf
@bdecaf - 很遗憾,由于数据安全问题,我无法提供。基本上,公司的财务报表(扫描图像)在pdf文件中(4页)。那个单一的pdf文件在我的文件中。这不是一个r问题(这就是我所想的,但更多的是tesseract问题)。 - anshuk_pal
1
@r_analytics,你找到解决问题的方法了吗? - R Yoda
我在安装和运行Teseract方面遇到了很多麻烦。有没有帮助让它正常运行的建议? - Pierre L
3个回答

13

我使用"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文档中也可以看到类似的例子,在这里。一个小提示:library(tesseract)也会加载pdftools包,所以不需要调用library(pdftools),特别是您还使用了pdftools::样式来调用函数。 - Valentin_Ștefan
1
另外,对于纯文本文件的目的,也许使用writeLineswrite.table稍微好一些,可以参考这里。希望这个反馈有所帮助。 - Valentin_Ștefan

7

只是为了澄清,这种方法只适用于可搜索的PDF文件,而不适用于扫描的PDF文件。 - Andres Mora
您还可以考虑基于RDCOMClient的方法(例如,请参见https://stackoverflow.com/questions/42294770/refine-table-extracted-from-pdf-tabulizer/73750966#73750966)。使用RDCOMClient R软件包,您可以通过使用嵌入在Word软件中的OCR将PDF转换为Word。之后,可以从Word文件中提取文本。此方法适用于可搜索的pdf和扫描的pdf。 - Emmanuel Hamel

0
这里有另一种可以考虑的方法:
library(reticulate)
conda_Env <- conda_list()

if(any(conda_Env[, 1] == "ocrTable") == FALSE)
{
  reticulate::conda_create(envname = "ocrTable", python_version = "3.7.16")
  reticulate::conda_install(envname = "ocrTable", packages = "transformers", pip = TRUE)
  reticulate::conda_install(envname = "ocrTable", packages = "torch", pip = TRUE)
  reticulate::conda_install(envname = "ocrTable", packages = "requests", pip = TRUE)
  reticulate::conda_install(envname = "ocrTable", packages = "Pillow", pip = TRUE)
}

reticulate::use_condaenv("ocrTable")

transformers <- import("transformers")
TrOCRProcessor <- transformers$TrOCRProcessor
VisionEncoderDecoderModel <- transformers$VisionEncoderDecoderModel
processor <- TrOCRProcessor$from_pretrained("microsoft/trocr-base-handwritten")
model <- VisionEncoderDecoderModel$from_pretrained("microsoft/trocr-base-handwritten")

requests <- import("requests")
PIL <- import("PIL")
Image <- PIL$Image
url <- "https://fki.tic.heia-fr.ch/static/img/a01-122-02.jpg"
image <- Image$open(requests$get(url, stream = TRUE)$raw)$convert("RGB")
pixel_values <- processor(image, return_tensors = "pt")$pixel_values
generated_ids <- model$generate(pixel_values)
generated_text <- processor$batch_decode(generated_ids, skip_special_tokens = TRUE)
generated_text

[1] "industry, \" Mr. Brown commented icily. \" Let us have a"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接