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文件来说无疑是有很大帮助的。