需要使用Tesseract API实现批量PDF提取

问题描述:

我有大量的PDF文档,我需要从中提取文本。提取的文本我用于进一步处理。我使用线性方法对Tesseract API中的一小部分文档进行了处理,并获得了所需的输出。但是,当我拥有大量文档时,这需要很长时间。需要使用Tesseract API实现批量PDF提取

我试图使用Hadoop环境处理功能(Map-Reduce)和存储(HDFS)来解决这个问题。但是,我正面临将Tesseract API应用于Hadoop(Map-Reduce)方法的问题。当Teserract将文件转换为中间图像文件时,我很困惑如何在HDFS内部处理Tesseract-API进程的中间结果图像文件。

我已搜查和unsuccesfully尝试了几个选项前面,如:

  1. 我已经使用Hadoop-的map-reduce扩展FileInputFormat类到我自己的PdfInputFormat类,为此,我使用的Apache提取从PDF文本PDFBox从pdf中提取文本,但是当涉及到包含图像的扫描pdf时,此解决方案不会提供所需的结果。

  2. 我在同一主题上找到了几个答案,声明使用-Fuse,这将有助于或应该在本地生成图像文件,并将其上传到hdfs进行进一步处理。不知道这是否是正确的方法。

想知道这个方法。

+0

Apache Tika使用Apache PDFBox呈现文件,然后用tesseract做OCR,也许这是给你的...... –

+0

@TilmanHausherr谢谢你的回应。我可以使用Map Reduce方法做这项工作吗?请尽可能详细说明/分享一些例子。 – Bonson

+0

对不起,我无法帮助其余的。我只是因为PDFBox才来到这里。 –

这是发现处理多个PDF的使用Hadoop框架的功率来提取文本,然后使用该文本以供进一步处理的方法:

  1. 把所有的PDF文件被转换在一个为文本夹。
  2. 为每个pdf创建一个文本文件以包含pdf的路径。例如如果我有10个pdf文件进行转换,那么我会生成10个文本文件,每个文件都包含相应pdf的唯一路径。
  3. 这些文本文件在map-reduce程序中作为输入给出
  4. 由于输入文件的大小非常小,因此1个输入的框架仅生成1个输入拆分。例如,如果我有10个pdf作为输入,那么框架将生成10个输入分割。
  5. 从每个输入拆分一行(记录)由记录读取器读取并作为值传递给一个映射器。因此,如果输入文本文件中有10条记录(行==文件路径),则10次映射器将运行。由于每个输入分割都有一条记录,因此一个映射器减速器被分配为为该输入分割执行任务。
  6. 由于我有10个输入分割10映射器将运行,并行。
  7. Mapper ghost脚本内部生成图像,并从Mapper value属性传递文件名。使用映射器内部的Tesseract将图像转换为文本以获取每个pdf的文本。这是输出。
  8. 传递给reducer根据需要进行其他分析工作。

这是当前的解决方案。希望对此有所反馈。