我需要解析一个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格式。
答案 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的输入。