服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java抽取word,pdf的四种武器


  chris (chris@matrix.org.cn)
  毕业于中国人民大学信息学院
  2003 年 6 月
  
  很多人用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;
  /**
   *

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 pdfextracter{
  
  public pdfextracter(){
   }
  public string gettextfrompdf(string filename) throws exception
   {
   string temp=null;
   pddocument.nbsppdfdocument.null;
   fileinputstream is=new fileinputstream(filename);
   pdfparser parser = new pdfparser( is );
   parser.parse();
   pdfdocument.nbsp= parser.getpddocument.);
   bytearrayoutputstream out = new bytearrayoutputstream();
   outputstreamwriter writer = new outputstreamwriter( out );
   pdftextstripper stripper = new pdftextstripper();
   stripper.writetext(pdfdocument.getdocument.), writer );
   writer.close();
   byte[] contents = out.tobytearray();
  
   string ts=new string(contents);
   system.out.println("the string length is"+contents.length+"/n");
   return ts;
  }
  public static void main(string args[])
  {
  pdfextracter pf=new pdfextracter();
  pddocument.nbsppdfdocument.nbsp= null;
  
  try{
  string ts=pf.gettextfrompdf("c://a.pdf");
  system.out.println(ts);
  }
  catch(exception e)
   {
   e.printstacktrace();
   }
  }
  
  }
  
  
  
  
  4. 抽取支持中文的pdf文件-xpdf
  xpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。
  
  下载xpdf函数包: http://www.matrix.org.cn/down_view.asp?id=15
  
  同时需要下载支持中文的补丁包: http://www.matrix.org.cn/down_view.asp?id=16
  
  按照readme放好中文的patch,就可以开始写调用本地方法的java程序了
  
  下面是一个如何调用的例子:
  
  
  import java.io.*;
  /**
   *

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 pdfwin {
   public pdfwin() {
   }
   public static void main(string args[]) throws exception
   {
   string path_to_xpdf="c://program files//xpdf//pdftotext.exe";
   string filename="c://a.pdf";
   string[] cmd = new string[] { path_to_xpdf, "-enc", "utf-8", "-q", filename, "-"};
   process p = runtime.getruntime().exec(cmd);
   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);
   }
  }
  
  
  
  
  关于作者
  作者简介:chris,毕业于中国人民大学信息学院。现于香港进行金融分析软件研发,作者亦活跃于 jxta p2p开源软件的开发社区,并热衷于网络安全,ai搜索引擎技术与基于java的游戏引擎技术。
  如果大家谁有更好的办法,请告诉作者 : chris@matrix.org.cn

扫描关注微信公众号