我需要解析一个PDF文档。我有一个java程序来解析PDF文件。(当我解析PDF时,我在PDF中使用了这些段落的字体信息。我不会将其转换为文本,因为如果我将 PDF 转换为文本文件,我将丢失我的字体 information.so 我直接使用 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 将整个文档作为单个拆分传递,但它给了我 BytesWritable(value) 和 filename(key)。
我也有该PDF的SequenceFileFormat。
我怎样才能将PDFBox与这个SequenceFileFormat或WholeFileInputFormat一起使用? 并且它也应该保留其字体信息。没有字体信息,我无法解析我的PDF。
您可以创建一个序列文件来包含 PDF 文件。序列文件是一种二进制文件格式。您可以将序列文件中的每个记录设为 PDF。为此,您需要创建一个派生自 Wriable 的类,其中包含 PDF 和所需的任何元数据。然后,您可以使用任何java PDF库(如PDFBox)来操作PDF。
您说您正在使用自己的自定义 InputFormat(WholeFileInputFormat)在它而不是字节可写使用PDDocument对象作为你的值到映射,并将 pdf 的全部内容加载到 PDDocument 中的 WholeFileRecordReader(custome Reader) 的 nextKeyValue() 中。还要确保你的 isSplitable() 返回 false,以便加载整个 pdf。
Map-Reduce需要来自HDFS的输入路径。因此,您可以将本地文件上传到某个路径/文件夹中的HDFS(使用java API),并将其用作Map-Reduce的输入。