从常见文档中提取纯文本内容
要想使用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(); 即可获取到纯文本数据。