2008-03-29
实现MHT文件格式的解析和内容抽取
关键字: mht parser decoder encoder由于我们的业务系统中有大量的MHT格式的资料,需要对其建立索引,搜索很久了一直没有找到相关解析的类库,只好自己动手丰衣足食了。已实现内容的提取以及和lucene的整合,稍后会完善编码检测及其他内容的提取,做一个完整的parser出来。
- 文本内容提取: 首先提取html部分的内容,解码之后使用nekoHtml提取文本内容;
public class MhtDocHandler extends HtmDocHandler {
private DOMFragmentParser parser = new DOMFragmentParser();
public Document getDocument(InputStream is) throws DocumentHandlerException {
DocumentFragment node = new HTMLDocumentImpl().createDocumentFragment();
try {
String mhts = IOUtils.toString(is);
int a1 = mhts.indexOf("<HTML");
int a2 = mhts.indexOf("</HTML>");
String html = mhts.substring(a1, a2 + 8);
//在mht中文本按照QuotedPrintable格式编码
html = decodeQuotedPrintable(html, "UTF-8");
StringReader r = new StringReader(html);
parser.parse(new InputSource(r), node);
}
catch (Exception e) {
throw new DocumentHandlerException("Cannot parse MHT document: ", e);
}
Document doc = new Document();
StringBuffer sb = new StringBuffer();
getText(sb, node, "title");
String title = sb.toString().trim();
sb.setLength(0);
getText(sb, node, "body");
String text = sb.toString().trim();
if (!title.equals("")) {
doc.add(new Field(WikiDOC.DOC_TITLE, title,
Field.Store.YES, Field.Index.TOKENIZED,
Field.TermVector.WITH_POSITIONS_OFFSETS));
}
if (!text.equals("")) {
doc.add(new Field(WikiDOC.DOC_CONTENT, text,
Field.Store.COMPRESS, Field.Index.TOKENIZED,
Field.TermVector.WITH_POSITIONS_OFFSETS));
}
return doc;
}
public static String decodeQuotedPrintable(String str, String encoding) {
if (str == null) {
return null;
}
try {
//str = str.replaceAll("=\n", "");//??
byte[] bytes = str.getBytes("US-ASCII");
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
for (int i = 0; i < bytes.length; i++) {
int b = bytes[i];
if (b == '=') {
int u = Character.digit((char) bytes[++i], 16);
int l = Character.digit((char) bytes[++i], 16);
if (u == -1 || l == -1) {//??
continue;
}
buffer.write((char) ((u << 4) + l));
} else {
buffer.write(b);
}
}
return buffer.toString(encoding);
}
catch (Exception e) {
e.printStackTrace();
return str;
}
}
}
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 6705 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
我的相册
翀儿
共 4 张
共 4 张
最新评论
-
JBPM与SPRING事务整合之深 ...
这是因为通过spring的类路径加载hbm方式在weblogic下有问题,无法正 ...
-- by betafox -
JBPM与SPRING事务整合之深 ...
你不觉得第一步很愚蠢,用jbpm还要去把jar包解压缩
-- by jinguizi -
JBPM与SPRING事务整合之深 ...
能把你的这几个配置文件件完整的贴出来参考一下吗?
-- by yuyanshan -
实现Microsoft Project 文 ...
我需要把数据库中的数据导出生成mpp文件,用mpxj,请问怎么实现啊邮箱chen ...
-- by chenhui_19850710@sina.com -
JBPM与SPRING事务整合之深 ...
留下脚印 日后备查
-- by isky






评论排行榜