2009-02-24 64 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) { 
     ... 
    } 
}