使用hadoop中的mapreduce程序解析pdf文件

时间:2013-09-11 07:05:11

标签: parsing pdf hadoop mapreduce pdfbox

我需要解析一个PDF文档。我有一个解析PDF文件的java程序。(当我解析PDF时,我使用了PDF中那些段落的字体信息。我不会将其转换为文本,因为如果我转换PDF进入文本文件我将失去我的字体信息。所以我直接使用Apache PDFBox解析带有字体信息的pdf。我使用以下代码加载pdf文件

String inputFile = "/home/Desktop/CTT/bcreg20130702a.pdf";
File input = new File(inputFile);
pd = PDDocument.load(input);

现在我需要编写一个map-reduce程序来解析PDF文档。我不能直接使用PDF文件作为mapreduce程序中map()函数的输入。我使用WholeFileInputFormat将整个文档作为单个split传递。但它给了我BytesWritable(value)和filename(key)。

我也有该PDF的SequenceFileFormat。

如何将PDFBox与此SequenceFileFormat或WholeFileInputFormat一起使用?它也应保留其字体信息。没有字体信息我无法解析我的PDF格式。

3 个答案:

答案 0 :(得分:3)

您可以创建一个SequenceFile来包含PDF文件。 SequenceFile是二进制文件格式。您可以将SequenceFile中的每条记录都设为PDF。为此,您将创建一个派生自Writable的类,该类将包含PDF和您需要的任何元数据。然后,您可以使用任何java PDF库(如PDFBox)来操作PDF。

答案 1 :(得分:1)

你说你正在使用自己的自定义InputFormat(WholeFileInputFormat) 而不是BytesWritable使用PDDocument对象作为Map的值, 并将整个pdf内容加载到WholeFileRecordReader(custome Reader)的nextKeyValue()中的PDDocument中。 还要确保你的isSplitable()返回false,以便加载整个pdf。

答案 2 :(得分:-2)

Map-Reduce需要来自HDFS的输入路径。因此,您可以在某个路径/文件夹中将本地文件上传到HDFS(使用java API),并将其用作Map-Reduce的输入。