2015-06-01 107 views
0

下面是将pdf文件转换为文本文件的代码。 代码成功运行,但不会生成生成的文本文件(Sample.txt)。任何人都可以对此有所了解吗? 代码部分是基于在行动书第一的iText的例子...如何使用itext liberary将pdf转换为文本文件

import com.lowagie.text.*; 
import com.lowagie.text.pdf.*; 

public class ConvertPDFToTEXT { 
    public static void main(String[] args) throws IOException { 
     try { 
      Document document = new Document(); 
      document.open(); 
      PdfReader reader = new PdfReader("Data Dictinary A4.pdf"); 
      PdfDictionary dictionary = reader.getPageN(1); 
      PRIndirectReference reference = (PRIndirectReference) 
      dictionary.get(PdfName.CONTENTS); 
      PRStream stream = (PRStream) PdfReader.getPdfObject(reference); 
      byte[] bytes = PdfReader.getStreamBytes(stream); 
      PRTokeniser tokenizer = new PRTokeniser(bytes); 
      FileOutputStream fos=new FileOutputStream("Sample.txt"); 
      StringBuffer buffer = new StringBuffer(); 
      while (tokenizer.nextToken()) { 
       if (tokenizer.getTokenType() == PRTokeniser.TK_STRING) { 
        buffer.append(tokenizer.getStringValue()); 
       } 
      } 
      String test=buffer.toString(); 
      StringReader stReader = new StringReader(test); 
      int t; 
      while((t=stReader.read())>0) 
       fos.write(t); 
      document.add(new Paragraph("..")); 
      document.close(); 
     } 
     catch (Exception e) {} 
    } 
} 
+0

你有catch(Exception e){}' - 有没有任何'Exceptions'进入那个黑洞?此外,一般而言,您的方法(收集PDF字符串)将完全无视您的定位和字体编码。 – mkl

+0

以下是上述捕获语句捕获的错误 org.codehaus.groovy.runtime.typehandling.GroovyCastException:无法将具有类'java.lang.Class'的对象'class com.lowagie.text.pdf.PRIndirectReference'转换为类' com.lowagie.text.pdf.PRIndirectReference' –

+0

你还可以提供堆栈跟踪吗?和你使用的iText版本?我只能在你的代码中看到一个将'PRIndirectReference'转换为某个地方的地方,但假设原始类型'Class'没有意义。可能它在下面的某个地方。 – mkl

回答

1

例如哪些您使用的是?如果是从575页中的一个,你会阅读以下内容:

“你这里有什么是穷人的文本提取它非常适合这个例子,但它不会与大多数PDF文件的工作,。可以在野外找到,如果你想使用iText作为文本提取库,应该考虑很多方面。“

下一章被命名为“为什么iText不会进行文本提取” - 因此该版本中的iText在文本提取方面受到限制。最后,你有两种基本的可能性:

  1. 升级到iText的新版本,它提供了更好的文本提取功能

  2. 如果你必须使用2.1.7版本坚持再看看在PdfTextExtractor.java而不是你在做什么。这里是另一个post发现了一些代码:

    PdfReader reader = new PdfReader(yourInputstream); 
    PdfTextExtractor extractor = new PdfTextExtractor(reader);   
    int pagenumber = reader.getNumberOfPages(); 
    
    for(int i = 1; i<= pagenumber; i++) { 
        System.out.println("============PAGE NUMBER " + i + "============="); 
        String line = extractor.getTextFromPage(i); 
        System.out.println(line); 
    } 
    

    但你可以在这取决于PDF其他职位看,提取并不总是在该版本中工作...

+0

*但是正如你可以在其他文章中看到的,取决于PDF的提取并不总是在那个版本中工作。* - iText中的文本提取类直到早期的5.x版本本质上仅仅是一个概念验证。 – mkl