有关《java抽取word,pdf的四种武器》的实验和总结未分类这几天要做一个抽取word或pdf中的文本信息的工作,看了一些资料,也做了一点实验,总结一下。
我的实验主要基于《java抽取word,pdf的四种武器》这篇文章,可以去http://www.ibm.com/developerworks/cn/java/l-java-tips/index.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文件来说无疑是有很大帮助的。

posted on 2013-05-23 06:35  ProgramMonkey  阅读(794)  评论(0编辑  收藏  举报