poi讀取word簡歷(僞word格式的doc文件 )提取文本內容報錯

  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);
html

   調試時,發現老是報異常:app

     查資料,大部分網友都說把word文件Save As後就能夠解決該bug,可是這不是我想要的。下面是網友的解決方法:網站

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

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

2.解決思路(對僞word的文件格式分析)spa

利用office對該51job簡歷word(resume.doc)Save As 時,忽然發現該word的具體格式是mht,固然還有其餘方法分析僞word的具體格式。.net

上圖說明51job生成的doc文件本質上是個mht文件; (而獵聘和智聯生成的是htm文件)。所以,也獲得一個啓示:下次若是項目中須要導出word格式文件,也可用mht或htm格式來冒充,反正word也能夠正常打開。調試

mht 百度百科 介紹:MHTML文件又稱爲聚合HTML文檔、Web檔案或單一文件網頁。單個文件網頁可將網站的全部元素(包括文本和圖形)都保存到單個文件中。這種封裝使您 可將整個網站發佈爲單個內嵌 MIME (MIME:經過 Internet 鏈接傳遞多媒體資源的一列標準。MIME 類型通知程序對象所包含的內容(如圖形、聲音或視頻)的聚合HTML文檔(MHTML)文件,或將整個網站做爲一個電子郵件或附件發送。Internet Explorer 4.0及更高版本支持此格式。視頻

 

項目源碼及jar包下載連接http://download.csdn.net/detail/s1945227880/9556831htm

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

   等有時間了再整理下代碼更新上傳、下班回去咯!

相關文章
相關標籤/搜索