word pdf excel等文件的信息抽取

很多人用Java进行文档操作时经常会碰到一个问题,就是如何获得Word,Excel,pdf等文档的内容?我研究了一下,在这里总结一下抽取word,pdf的几种方法。
  1 .用jacob
  其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 
  
  jacob jar与dll文件下载: http://www.matrix.org.cn/down_view.ASP?id=13 
  
  下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: 
  
  
  import java.io.File;
  import com.jacob.com.*;
  import com.jacob.activeX.*;
  /**
   * Title: pdf extraction
   * Description: email:chris@matrix.org.cn
   * Copyright: Matrix Copyright (c) 2003
   * Company: Matrix.org.cn
   * @author chris
   * @version 1.0,who use this example pls remain the declare
   */
  public class FileExtracter{
   public static void main(String[] args) {
   ActiveXComponent component = new ActiveXComponent("Word.Application");
   String inFile = "c:\\test.doc";
   String tpFile = "c:\\temp.htm";
   String otFile = "c:\\temp.XML";
   boolean flag = false;
   try {
   component.setProperty("Visible", new Variant(false));
   Object wordacc = component.getProperty("document.").toDispatch();
   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method, 
   new Object[]{inFile,new Variant(false), new Variant(true)},
   new int[1] ).toDispatch();
   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);
   Variant f = new Variant(false);
   Dispatch.call(wordfile, "Close", f);
   flag = true;
   } catch (Exception e) {
   e.printStackTrace();
   } finally {
   component.invoke("Quit", new Variant[] {});
   }
   }
  }
  
   
  
  
  2. 用apache的poi来抽取word,excel。
  poi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: 
  
  下载经过封装后的poi包: http://www.matrix.org.cn/down_view.asp?id=14 
  
  下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: 
  
  
  import java.io.*;
  import org.textmining.text.extraction.WordExtractor;
  /**
   * 
Title: word extraction


   * 
Description: email:chris@matrix.org.cn


   * 
Copyright: Matrix Copyright (c) 2003


   * 
Company: Matrix.org.cn


   * @author chris
   * @version 1.0,who use this example pls remain the declare
   */
  
  public class PdfExtractor {
   public PdfExtractor() {
   }
   public static void main(String args[]) throws Exception
   {
   FileInputStream in = new FileInputStream ("c:\\a.doc");
   WordExtractor extractor = new WordExtractor();
   String str = extractor.extractText(in);
   System.out.println("the result length is"+str.length());
   System.out.println("the result is"+str);
  }
  }
  
   
  
  
  3. pdfbox-用来抽取pdf文件
  但是pdfbox对中文支持还不好,先下载pdfbox: http://www.matrix.org.cn/down_view.asp?id=12 
  
  下面是一个如何使用pdfbox抽取pdf文件的例子: 
  
  
  import org.pdfbox.pdmodel.PDdocument.
  import org.pdfbox.pdfparser.PDFParser;
  import java.io.*;
  import org.pdfbox.util.PDFTextStripper;
  import java.util.Date;
  /**
   * 
资料引用:http://www.knowsky.com/364976.html

-----------------------------------------------------------------------------------

上看。这是人大的chris师兄03年做的总结,是网上有关java抽取word,pdf转载最多的文章。


一、word转txt
方法一:用jacob
这个我没有动手去试,有人试过的话也可以告诉我。
方法二:用apache的poi来抽取word,excel
出于对apache莫名其妙的好感,我开始便选择了这个方法。这个方法很简单,只要下载下载经过封装后的poi包,我下的是tm-extractors-0.4.jar,放在该放的位置就好了。
调用的代码也很简单,参考推荐文章。

二、pdf转txt
这个我实现就没上面那么顺利了。chris的文章中提到的两种方法,分别是基于xpdf和pdfbox。作者说pdfbox不支持中文,我便径直选择了xpdf。

应用xpdf抽取pdf文件,核心语句是
       String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};
Process p = Runtime.getRuntime().exec(cmd);
它调用了pdftotext.exe文件并传给它一定的参数,来实现ptf到txt的转化。
应用这种方法,将在要转换的pdf路径下得到同名的一个txt文件,chris师兄用下面的代码
BufferedInputStream bis = new BufferedInputStream(p.getInputStream());
InputStreamReader reader = new InputStreamReader(bis, "UTF-8");
StringWriter out = new StringWriter();
char [] buf = new char[10000];
int len;
while((len = reader.read(buf))>= 0) {
//out.write(buf, 0, len);
System.out.println("the length is"+len);
}
reader.close();
String ts=new String(buf);
System.out.println("the str is"+ts);
想要在转化文件格式的同时将读到的文本信息放在字符串里,在我的程序中跑起来得到的结果是一连串0,不知道是我的问题还是这种方法是不可行的。

应用这种方法需要注意的是要将chinese-simplified文件夹、pdftotext.exe程序和xpdfrc文件放在同一级目录内,否则不会转换成功。

这种方法比较恶心的一点是,xpdf的本地方法,也就是pdftotext.exe是C写的编译过的可执行程序,这就意味着我们不能得到源码,而且只要是执行了pdftotext.exe而不管是不是执行正确,都不会报错。

chris师兄有个需要完善的地方,就是Runtime.getRuntime().exec(cmd);语句后最好加一句process.waitFor();,以保证转换程序完成之后再进行其它操作。

这种方法我遇到了一个问题,就是在应用程序下这种方法可以实现,通过web调用在服务器端执行这个程序却始终没能得到想要的txt文件。排除了各种可能之后,我觉得问题出在传给pdftotext.exe的文件路径不对,它没能找到这个文件。我试着将文件的绝对路径、相对路径等一切我能想到的路径传给exe,始终没有转换成功,最终放弃。这个部分还能有高人指点。

pdfbox抽取pdf文件

pdfbox是一个为开发人员读取和创建pdf文档而准备的纯java类库。在上面的方法遇到挫折的时候,我转向了这个方法,然后惊喜的发现,pdfbox的最新版本PDFBox-0.7.3已经解决了不支持中文的问题。
chris师兄文章写的时候估计还只有PDFBox-0.7.1版,我试过了,的确不能支持中文。
对于这种方法,我想讲的是如果想在我们自己的project中使用该方法,需要下载PDFBox-0.7.3.zip,解压缩,将external下的所有jar包,以及lib下的PDFBox-0.7.3.jar统统添加到我们的project中。
我想是因为pdfbox版本的不同,chris师兄的程序需要一点修改才能运行,我觉得有用的主要有以下几条语句:

                PDDocument document = PDDocument.load(pdfFile);   //在内存中存储的PDF Document,pdfFile为pdf文件名

            // 将转化后的文本信息写入txt文件

            Writer output = new OutputStreamWriter(new FileOutputStream(textFile), "UTF-8"); //textFile为新生成的txt文件名
            PDFTextStripper stripper = new PDFTextStripper(); // PDFTextStripper来提取文本                   
            stripper.writeText(document, output); // 调用PDFTextStripper的writeText提取并输出文本
            //将pdf的文本信息读到String中
            String text = stripper.getText(document);
            
用我的方法由pdfbox生成的txt文件是没有格式信息的,而且中文的字与字之间都加了空格,我想是因为我并没有很深入的研pdfbox导致的。
而xpdf生成的文本则是包含格式信息的,这对于处理格式固定的pdf文件来说无疑是有很大帮助的。