2009-02-24 61 views
3

我需要将PDF转换为正常文本(这是我们县注册服务商的“投票声明”)。这些文件很大(2000页左右),大部分都包含表格。一旦我把它写入文本,然后我将使用我正在写的一个程序来解析它,并将数据放入数据库中。 我试过Adobe Reader中的“另存为文本”功能,但它并不像我想要的那样精确,特别是在将表格数据分隔成CSV格式时。 那么,对工具或Java库的任何建议都可以做到这一点?PDF到文本工具或Java库?

+2

我有一种感觉的表中的数据可能会引起你一些头痛... – Knobloch 2009-02-24 21:15:48

+0

是的。还有表格标题和页面标题。虽然在整个文档中是一致的,但它们在不同文档之间并不一致。每次选举一个文件,似乎他们不断改变每次选举的格式。 – 2009-02-24 21:24:42

回答

6

那么,有iText。我只有有限的经验,但it seems它可以做你想做的。

Apache PDFBox当然可以做到这一点。它的网站提到“PDF到文本提取”作为其主要特征。有一个ExtractText command line tool专门为此(source code),基于其PDFTextStripper class。还有一个PDFBox Text Extraction Guide

+0

iText可以做一些阅读,我想但是可能会有更好的工具(PDFBox,如你所提到的,也许)来达到这个目的...... – Knobloch 2009-02-24 21:14:40

0

使用文本(行)打印机打印到文件。

2

我一直发现xpdf工具非常有用。

我们成功使用PDF到文本转换来转换用于EDI的PDF业务文档。保留布局的选项可以很好地工作,以便将事情定位好,以便在程序中解析。

0

我使用iText的和我“去过它真的很高兴。 我以前用过xmlpdf和iText的是在我看来,远优于。

0

不知道在你的PDF页面的布局就很难说

我建议下载和尝试都的iText和PDBox你会发现两者在其网站上的文字提取的例子。 - 你应该有一个提取器在< 30分钟运行假设你知道围绕Java的方式

从PDFBox开始,因为它的文本提取能力更好比iText的。

别人提到了xpdf,这可能对你有用。这是一个C库,其中包含一些命令行工具。它有很多文本提取器,你可以很容易地格式化输出。再次,它真的取决于你的页面布局。

1

PDFTextStream是我们的Java + .NET库,用于从PDF文档中提取内容;你可以试试看。此外,它提供了一些基本的table data extraction utilities,它们位于PDFTextStream的表格检测功能之上。这绝不是一个通用的解决方案(尽管我们也在研究其中的一个!),但是如果表格数据被明确定义(例如,由行和行等限定的行和列),那么您可能会发现现在有什么妥善解决。

5

鉴于问题的标题:Apache Tika工作得很好,我从PDF中提取纯文本。我没有用它从表格中获取文本。

对于PDF,它实际上是使用PDFBox。但除了PDF之外,其他格式如Microsoft Word(doc和docx),Excel和PowerPoint,OpenOffice.org/LibreOffice ODT,HTML,XML和many more也是如此。它的AutoDetectParser使得从任何输入中获取文本变得容易。

如果需要处理结果文本(例如将它传递给Mahout进行分类),可以使用ParsingReader将结果读取到Reader中,同时后台进程将其提取出来。最后,虽然extrating的内容,这还罢了发现的元数据:

public Reader getPlainTextReader(final InputStream is) { 
    try { 
     Detector detector = new DefaultDetector(); 
     Parser parser = new AutoDetectParser(detector); 
     ParseContext context = new ParseContext(); 
     context.set(Parser.class, parser); 
     Metadata metadata = new Metadata(); 

     Reader reader = new ParsingReader(parser, is, metadata, context); 

     for (String name : metadata.names()) { 
      for (String value : metadata.getValues(name)) { 
       logger.debug("Document {}: {}", name, value); 
      } 
     } 

     return reader; 

    } catch (IOException e) { 
     ... 
    } 
}