要想使用Lucene检索office文档(word、excel、ppt等)、PDF、HTML文档,通常的处理策略是先从这些文档中提取出纯文本,然后再进行相关索引处理等。
一、从office中提取纯文本
从office文件中提取纯文本,可以使用POI(http://poi.apache.org/),最新版本为3.8。从office文件中提取纯文本方法很简单。只需要两行代码即可。
POITextExtractor extractor = ExtractorFactory.createExtractor(is);
String contents = extractor.getText();
第一行中传入的is参数为office文件的inputstream。这里不分word、excle还是ppt,不区分03版还是07版,只需要将文件的inputStream传入此方法中。再使用extractor.getText()。得到的即为office文件的纯文本数据。
注意:有时候可能由于文件的源访问,导致提取的纯文本里面有一些特殊字符,可以使用下面的方法过滤掉。
/**
* 过滤特殊字符
*
* @param contents
* @return
*/
public static String filterSpecialChar(String contents) {
contents = contents.replace('\u0003', '\u0000');
contents = contents.replace('\u0004', '\u0000');
contents = contents.replace('\u000b', '\u0000');
contents = contents.replace('\u000c', '\u0000');
contents = contents.replace('\u0007', '\u0000');
contents = contents.replace('\u0008', '\u0000');
contents = contents.replace('\u0013', '\u0000');
contents = contents.replace('\u0014', '\u0000');
contents = contents.replace('\u0015', '\u0000');
contents = contents.replace('\u0016', '\u0000');
contents = contents.replace('\u0020', '\u0000');
return contents;
}
二、从PDF中提取纯文本
从PDF中提取纯文本,可以使用PDFBox组件(http://pdfbox.apache.org/),最新版本为1.7.1。需要的jar包为:pdfbox、fontbox、jempbox等,最好再加上pdfbox-lucene。
如果使用了pdfbox-lucene的包,则不用自己写pdfbox的处理方法,直接调用相关方法(LucenePDFDocument类里面)就行了,这里介绍,如何手写实现,也很简单。
PDDocument pdfDocument = PDDocument.load(is);
if (pdfDocument.isEncrypted()) {
// 仅仅尝试使用默认密码打开加密的PDF
pdfDocument.decrypt("");
}
// 创建一个writer用来作来存储文件正文
StringWriter writer = new StringWriter();
if (stripper == null) {
stripper = new PDFTextStripper();
} else {
stripper.resetEngine();
}
stripper.writeText(pdfDocument, writer);
String contents = writer.getBuffer().toString();
上面is同样为PDF文件的inputStream。下面的contents为提取到的PDF的纯文本内容。
三、从HTML文件中提取正文
从HTML文件中提取正文,简单说就是去除HTML文件中的HTML标签,这处常用的方法有许多,如使用正则表达式、html parse等。这里我们使用JSOUP,这个更方便快捷。可以参考我以前写的一篇文章:使用JSOUP处理HTML文档
在获取到Document之后,使用String text = document.text(); 即可获取到纯文本数据。