最近做的一个程序中,需要把从51job导出来的简历进行解析,51job支持doc和mht格式。开始时以为该doc文件是Word文件,于是采用Apache POI中提供的WordExtractor来进行,从word文件中提取文本内容。
import org.apache.poi.hwpf.extractor.WordExtractor; WordExtractor wordExtractor = new WordExtractor(new FileInputStream(tempFile)); content = wordExtractor.getText();
测试时,发现总是报异常
Invalid header signature; read 0x7265762D656D696D, expected 0xE11AB1A1E011CFD0
用Notepad++打开看了一下,发现是个文本文件
mime-version: 1.0 From: <由 网才@51Job 生成> date: 13 Apr 2012 17:20:13 +0800 subject: Resume content-type: multipart/related; boundary=--boundary_578_1d3227f5-c157-41cf-b651-c43d296bd49f ----boundary_578_1d3227f5-c157-41cf-b651-c43d296bd49f content-type: text/html; charset=gb2312 content-transfer-encoding: quoted-printable <html><body><table width=3D'650' height=3D'62' border=3D'0' align=3D'center'= cellpadding=3D'0' cellspacing=3D'0'><tr><td width=3D'62%' height=3D'60'= align=3D'left' valign=3D'bottom' class=3D'top'>=D3=A6=C6=B8=D6=B0=CE=BB=A3=BA<span=
这表明51job生成的doc文件本质上是个mht文件。因此,也得到一个启示:下次如果项目中需要导出word格式文件,也可用mht格式来冒充,反正word也可以正常打开。
现在的问题变成了,怎么从mht中提取html内容了。在iteye上找到了,还挺好用,
thinkgem 的 《Java实现 HTML to MHT》,地址:http://thinkgem.iteye.com/blog/724208
使用方法如下:
String htmlFile = tempFile.substring(0, tempFile.length() - 4) + ".html"; log.debug("html=" + htmlFile); Html2MHTCompiler.mht2html(tempFile, htmlFile);
这样之后,htmlFile指定的文件中保存的就是提取出来html内容。在实际的测试中,发现需要对代码做一下小的修改,在类Html2MHTCompiler第441行附近。
MimeMultipart mp = (MimeMultipart) content; MimeBodyPart bp1 = (MimeBodyPart) mp.getBodyPart(0); String strEncodng = getEncoding(bp1); String strText = getHtmlText(bp1, strEncodng); if (strText == null) return;
因为我碰到两种情况:
1. strEncodng 可能为空;
2. strEncodng 不为空时,字符串可能带有双引号;
这两种情况都会导致后面的 getHtmlText 调用抛出异常。
可修改如下:
String strEncodng = getEncoding(bp1); if (strEncodng == null) { strEncodng = "GBK"; // 2012.04.23 } else { strEncodng = strEncodng.replace("\"", ""); } String strText = getHtmlText(bp1, strEncodng);
至少在我测试的doc/mht文件中能正确处理。