poi读取word简历(伪word格式的doc文件 )提取文本内容报错

来源:互联网 发布:网络问卷调研 编辑:程序博客网 时间:2024/06/02 18:32
摘要: 最近对51job、猎聘、智联导出来的简历进行解析,可是以为该doc文件是Word文件,就直接使用Apache poi中提供的WordExtractor来读取word文本内容,结果总是报Invalid header signature; read 0x6D78206C6D74683C, expected 0xE11AB1A1E011CFD0,查了好多资料,记录下不成熟解决思路
  1. 常规思路(利用poi对word进行解析)

           ////word 2003: 图片不会被读取
            InputStream is = new FileInputStream(new File("D:\\word\\中文简历_20160622.doc"));    
            WordExtractor ex = new WordExtractor(is);//is是WORD文件的InputStream 
            String text2003 = ex.getText();
            System.out.println("2003------->"+text2003);

   调试时,发现总是报异常:

     查资料,大部分网友都说把word文件Save As后就可以解决该bug,但是这不是我想要的。下面是网友的解决方法:

http://www.techcrony.info/2008/02/18/admin/avaioioexception-invalid-header-signature-read/

http://blog.sina.com.cn/s/blog_6829be5c01017t6x.html

2.解决思路(对伪word的文件格式分析)

利用office对该51job简历word(resume.doc)Save As 时,突然发现该word的具体格式是mht,当然还有其他方法分析伪word的具体格式。

上图说明51job生成的doc文件本质上是个mht文件; (而猎聘和智联生成的是htm文件)。因此,也得到一个启示:下次如果项目中需要导出word格式文件,也可用mht或htm格式来冒充,反正word也可以正常打开。

mht 百度百科 介绍:MHTML文件又称为聚合HTML文档、Web档案或单一文件网页。单个文件网页可将网站的所有元素(包括文本和图形)都保存到单个文件中。这种封装使您 可将整个网站发布为单个内嵌 MIME (MIME:通过 Internet 连接传递多媒体资源的一列标准。MIME 类型通知程序对象所包含的内容(如图形、声音或视频)的聚合HTML文档(MHTML)文件,或将整个网站作为一个电子邮件或附件发送。Internet Explorer 4.0及更高版本支持此格式。

  

1.拿到伪word格式,根据制定文件的文件头判断其文件类型,然后再对mht和htm格式的文件进行解析。

public class FileType {    
    public final static Map<String, String> FILE_TYPE_MAP = new HashMap<String, String>();         
    private FileType(){}     
    static{     
        getAllFileType(); //初始化文件类型信息     
    }              
    /**   
     * Discription:[getAllFileType,常见文件头信息] 
     */     
    private static void getAllFileType()     
    {     
        FILE_TYPE_MAP.put("3c68746d6c20786d6c6e", "htm");//猎聘、智联简历.htm
        FILE_TYPE_MAP.put("46726f6d3a3cd3c920cd", "mht");//51job简历.mht
    }                       
    
    /**
     * 得到上传文件的文件头
     * @param src
     * @return
     */
    public static String bytesToHexString(byte[] src) {
        StringBuilder stringBuilder = new StringBuilder();
        if (src == null || src.length <= 0) {
            return null;
        }
        for (int i = 0; i < src.length; i++) {
            int v = src[i] & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
        return stringBuilder.toString();
    }
    
    /**
     * 根据制定文件的文件头判断其文件类型
     * @param filePaht
     * @return
     */
    public static String getFileType(String filePaht){
        String res = null;
        try {
            FileInputStream is = new FileInputStream(filePaht);
            byte[] b = new byte[10];
            is.read(b, 0, b.length);
            String fileCode = bytesToHexString(b);               
            System.out.println(fileCode);                      
            //这种方法在字典的头代码不够位数的时候可以用但是速度相对慢一点
            Iterator<String> keyIter = FILE_TYPE_MAP.keySet().iterator();
            while(keyIter.hasNext()){
                String key = keyIter.next();
                if(key.toLowerCase().startsWith(fileCode.toLowerCase()) || fileCode.toLowerCase().startsWith(key.toLowerCase())){
                    res = FILE_TYPE_MAP.get(key);
                    break;
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return res;
    }
    public static void main(String[] args) throws Exception {
        
        String type = getFileType("D:\\word\\51job_resume.doc");
        System.out.println("Except : "+type);   
                
    }
}

2.解析htm的很简单,就不过多的说了,主要是介绍下解析mht格式文件(主要方法),注意文件编码的问题

 /**     
     * 方法说明:mht转html    

   * 输入参数:strMht mht文件路径; strHtml html文件路径                                                                                                                           
     * 返回类型:      * /  
    public static void mht2html(String strMht, String strHtml) {  
        try {  
            //InputStream is = new FileInputStream(new File("D:\\word\\resume.doc"));
            InputStream fis = new FileInputStream(strMht);  
            Session mailSession = Session.getDefaultInstance(System  
                    .getProperties(), null);  
            MimeMessage msg = new MimeMessage(mailSession, fis);  
            Object content = msg.getContent();  
            if (content instanceof Multipart) {  
                MimeMultipart mp = (MimeMultipart) content;  
                MimeBodyPart bp1 = (MimeBodyPart) mp.getBodyPart(0);  
                String strEncodng = getEncoding(bp1);  
                System.out.println("strEncodng first"+strEncodng);
                ////////////////////////////////
                //修改
                if (strEncodng == null) {  
                    strEncodng = "UTF-8"; // 2012.04.23  
                } else {  
                    
                    strEncodng = strEncodng.replace("\"", "");  
                }
                
                String strText = getHtmlText(bp1, strEncodng);  
                if (strText == null)  
                    return;  
                File parent = null;  
                if (mp.getCount() > 1) {  
                    parent = new File(new File(strHtml).getAbsolutePath() + ".files");  
                    parent.mkdirs();  
                    if (!parent.exists())  
                        return;  
                }  
                for (int i = 1; i < mp.getCount(); ++i) {  
                    MimeBodyPart bp = (MimeBodyPart) mp.getBodyPart(i);  
                    String strUrl = getResourcesUrl(bp);  
                    if (strUrl == null)  
                        continue;  
                    DataHandler dataHandler = bp.getDataHandler();  
                    MimePartDataSource source = (MimePartDataSource) dataHandler  
                            .getDataSource();  
                    File resources = new File(parent.getAbsolutePath()  
                            + File.separator + getName(strUrl, i));  
                    if (saveResourcesFile(resources, bp.getInputStream()))  
                        strText = JHtmlClear.replace(strText, strUrl, resources  
                                .getAbsolutePath());  
                }  
                saveHtml(strText, strHtml);  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  

 

3.项目源码及jar包下载链接: http://download.csdn.net/detail/s1945227880/9556831

 

0 0
原创粉丝点击