Freemarker模板生成word文檔及在Windows系統下(linux系統暫不支持)手機版打開爲xml異常處理方法

package net.aykj.util;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.Version;
import net.aykj.pojo.Educational;
import net.aykj.pojo.PeopleInfo;
import net.aykj.pojo.WorkExperience;
import sun.misc.BASE64Encoder;

/**
 * 通過選擇簡歷模板生成簡歷
 * @author Add by Bingyong.Wang 
 *
 */
public class TestCreatePeoleInfoByResumeTemplate {

	public static void main(String[] args) throws ParseException {
//		String str = "/uploadDir/ftl/20200416/1587017088881.ftl";
//		System.out.println(str.substring(0,str.lastIndexOf("/")));
//		System.err.println("=========================");
//		System.out.println(str.substring(str.lastIndexOf("/") + 1));
		autoCreatePeopleInfo();
	}

	/**
	 * 通過調用簡歷模板自動生成不帶圖的簡歷和帶圖的簡歷
	 * 
	 * 正式生成簡歷時:
	 *           1  會員簡歷信息動態獲取.
	 *           2  會員動態選取簡歷模板
	 *           3  生成的簡歷如何存放?存放在哪裏?(這裏生成的放在附件表裏,通過會員ID獲取.)
	 * @throws ParseException 
	 */
	public static void autoCreatePeopleInfo() throws ParseException{
        
		PeopleInfo peopleInfo = new PeopleInfo();
		
		// 會員
		peopleInfo.setMemberId(1);
		// 簡歷模板
		peopleInfo.setResumeTemplateId(1);
		// 姓名
		peopleInfo.setName("王容之");
		// 性別
		//peopleInfo.setSex(1);
		peopleInfo.setGender("男");
		// 簡歷右側頭像
		// 婚姻狀況
		peopleInfo.setMaritalStatus("未婚");;
		// 電話
		peopleInfo.setTel("15812090956");
		// 郵箱
		peopleInfo.setEmail("[email protected]");
		// 工作年限
		peopleInfo.setWorkingYears(3);
		// 技能名稱
		peopleInfo.setSpecialSkill("Java程序開發,前端開發,網頁設計,大數據分析".replace(",", "<w:br/>"));
		// 個人優勢
		peopleInfo.setPersonalAdvantage("兵臨城下,永不言敗");
		// 求職意向
		peopleInfo.setCareerObjective("軟件開發工程師");
		// 意向城市
		peopleInfo.setIntentionCity("昆明");
		// 期望薪資
		peopleInfo.setPay("10K");
		// 目前工作狀況(在職、離職)
		peopleInfo.setCurrentWorkingStatus("在職,一個月內到崗");
		// 教育背景  start
		peopleInfo.setSchool("清華大學");
		peopleInfo.setMajor("信息管理與信息系統");
		peopleInfo.setEducationStartTime(new SimpleDateFormat("yyyy-MM-dd").parse("2012-08-31"));
		peopleInfo.setEducationEndTime(new SimpleDateFormat("yyyy-MM-dd").parse("2016-06-25"));
		peopleInfo.setEducationExperience("GPA:X.X / 4.0(專業前X%)  獲得學校一級獎學金");
		// 教育背景 end
		
		/** Update 教育背景 start*/
		Educational educational = new Educational();
        educational.setSchool("羅平一中");
        educational.setMajor("理科");
        educational.setEducation("高中");
        educational.setEducationExperience("好學校");
        educational.setEducationStartTime(new SimpleDateFormat("yyyy-MM-dd").parse("2009-08-31"));
        educational.setEducationEndTime(new SimpleDateFormat("yyyy-MM-dd").parse("2012-06-25"));
        
        Educational educational2 = new Educational();
        educational2.setSchool("武科大");
        educational2.setMajor("信息管理與信息系統");
        educational2.setEducation("本科");
        educational2.setEducationExperience("學習認真負責");
        educational2.setEducationStartTime(new SimpleDateFormat("yyyy-MM-dd").parse("2012-08-31"));
        educational2.setEducationEndTime(new SimpleDateFormat("yyyy-MM-dd").parse("2016-06-25"));
		/** Update 教育背景 end*/
		
		// 工作經驗  start
		peopleInfo.setCompany("奧遠科技");
		peopleInfo.setHistoryPosts("java開發工程師");
		peopleInfo.setStartTime(new SimpleDateFormat("yyyy-MM-dd").parse("2018-05-21"));
		peopleInfo.setEndTime(new SimpleDateFormat("yyyy-MM-dd").parse("2020-05-31"));
		peopleInfo.setWorkDescription("在職期間任職CMS事業部程序開發職責,主要負責各類個性網站和系統的程序開發,比如醫科大論文系統等,從數據庫設計到最終的調試,都由我負責。");
		// 工作經驗 end
		
		/** Update 工作經歷 start */
        WorkExperience workExperience = new WorkExperience();
        workExperience.setCompany("一心堂");
        workExperience.setHistoryPosts("java軟件開發工程師");
        workExperience.setWorkDescription("工作認真,克勤克儉");
        workExperience.setStartTime(new SimpleDateFormat("yyyy-MM-dd").parse("2016-09-20"));
        workExperience.setEndTime(new SimpleDateFormat("yyyy-MM-dd").parse("2018-03-25"));
        
        WorkExperience workExperience2 = new WorkExperience();
        workExperience2.setCompany("奧遠科技");
        workExperience2.setHistoryPosts("軟件開發工程師");
        workExperience2.setWorkDescription("工作認真");
        workExperience2.setStartTime(new SimpleDateFormat("yyyy-MM-dd").parse("2018-05-10"));
        workExperience2.setEndTime(new SimpleDateFormat("yyyy-MM-dd").parse("2020-06-05"));
        /** Update 工作經歷 end */
		
		// 榮譽獎項
		peopleInfo.setAwards("計算機四級證書,網絡工程師資格證書等".replace(",", "<w:br/>"));
		
		// 籍貫
		peopleInfo.setHometown("雲南曲靖");
		// 民族
		peopleInfo.setNation("漢");
		// 政治面貌
		peopleInfo.setPoliticalStatus("團員");
		// 學歷
		peopleInfo.setEducation("本科");
		// 學制
		peopleInfo.setAcademicSystem("四年");
		// 專業
		peopleInfo.setMajor("信息管理與信息系統");
		// 婚姻狀況
		peopleInfo.setMaritalStatus("未婚");
		// 身高
		peopleInfo.setHeight("175cm");
		// 身體狀況
		peopleInfo.setPhysicalConditions("健康");
		// 畢業院校
		peopleInfo.setSchool("武漢科大");
		// 聯繫地址
		peopleInfo.setAddress("雲南省昆明市官渡區織布營");
		// 郵編
		peopleInfo.setPostCode("650200");
		// 曾任職務
		peopleInfo.setPersonalPosition("無");
		
		// 計算機
		peopleInfo.setComputer("無");
		// 語言能力
		peopleInfo.setLanguageSkills("無");
		// 獲獎情況
		//peopleInfo.setAwards("都是讀書時期獲的");
		// 工作經歷
		peopleInfo.setWorkLife("2016年9月-2018年3月,在雲南鴻翔一心堂藥業集團股份有限公司電商事業開發部,任職程序員,"
				+ "2018年5月-至今,在昆明奧遠科技有限公司任職java程序員.");
		// 興趣特長
		peopleInfo.setHobby("跑步 籃球");
		// 自我評價
		peopleInfo.setContent("性格開朗,爲人正直");
		
		Map<String,Object> dataMap = new HashMap<String, Object>();
        try {
            // 姓名
            dataMap.put("name", peopleInfo.getName());
            //日期
            //dataMap.put("date", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse("2018-09-19")));
            // 性別
            dataMap.put("gender", peopleInfo.getGender());
            // 簡歷右側頭像
            dataMap.put("imgUrl", getImageStr());
            // 婚姻狀況
            dataMap.put("maritalStatus", peopleInfo.getMaritalStatus());
            // 電話
            dataMap.put("tel", peopleInfo.getTel());
            // 郵箱
            dataMap.put("email", peopleInfo.getEmail());
            // 工作年限
            dataMap.put("workingYears", peopleInfo.getWorkingYears());
            
            // 技能名稱
            dataMap.put("specialSkill", peopleInfo.getSpecialSkill());
            
            // 個人優勢
            dataMap.put("personalAdvantage", peopleInfo.getPersonalAdvantage());
            
            // 求職職位
            dataMap.put("careerObjective", peopleInfo.getCareerObjective());
            // 意向城市
            dataMap.put("intentionCity", peopleInfo.getIntentionCity());
            // 期望薪資
            dataMap.put("pay", peopleInfo.getPay());
            // 目前工作狀況(入職時間)
            dataMap.put("currentWorkingStatus", peopleInfo.getCurrentWorkingStatus());
            
            // 教育背景 start
            dataMap.put("school", peopleInfo.getSchool());
            dataMap.put("major", peopleInfo.getMajor());
            dataMap.put("educationStartTime", new SimpleDateFormat("yyyy-MM").format(peopleInfo.getEducationStartTime()));
            dataMap.put("educationEndTime", new SimpleDateFormat("yyyy-MM").format(peopleInfo.getEducationEndTime()));
            dataMap.put("educationExperience", peopleInfo.getEducationExperience());
            // 教育背景 end
            
            /** update 教育背景 start*/
            // 獲取當前簡歷下的教育經歷信息
            List<Map<String, Object>> eduList = new ArrayList<>();
            Map<String, Object> map = new HashMap<>();
            map.put("school", educational.getSchool());
            map.put("major", educational.getMajor());
            map.put("educationExperience", educational.getEducationExperience());
            map.put("educationStartTime", new SimpleDateFormat("yyyy-MM").format(educational.getEducationStartTime()));
            map.put("educationEndTime", new SimpleDateFormat("yyyy-MM").format(educational.getEducationEndTime()));
            map.put("educational", educational);
            
            Map<String, Object> map2 = new HashMap<>();
            map2.put("school", educational2.getSchool());
            map2.put("major", educational2.getMajor());
            map2.put("educationExperience", educational2.getEducationExperience());
            map2.put("educationStartTime", new SimpleDateFormat("yyyy-MM").format(educational2.getEducationStartTime()));
            map2.put("educationEndTime", new SimpleDateFormat("yyyy-MM").format(educational2.getEducationEndTime()));
            map2.put("educational2", educational2);
            //eduList.add(map);
            eduList.add(map2);
            dataMap.put("eduList", eduList);
            /** update 教育背景 end*/
            
            // 工作經驗  start
            dataMap.put("company", peopleInfo.getCompany());
            dataMap.put("historyPosts", peopleInfo.getHistoryPosts());
            /*dataMap.put("startTime", new SimpleDateFormat("yyyy-MM").format(peopleInfo.getStartTime()));
            dataMap.put("endTime", new SimpleDateFormat("yyyy-MM").format(peopleInfo.getEndTime()));*/
            dataMap.put("workDescription", peopleInfo.getWorkDescription());
            // 工作經驗  end
            
            /** Update 工作經驗 start */
            List<Map<String, Object>> workList = new ArrayList<>();
            Map<String, Object> workMap = new HashMap<>();
            
            workMap.put("company", workExperience.getCompany());
            workMap.put("historyPosts", workExperience.getHistoryPosts());
            workMap.put("workDescription", workExperience.getWorkDescription());
            workMap.put("startTime", new SimpleDateFormat("yyyy-MM").format(workExperience.getStartTime()));
            workMap.put("endTime", new SimpleDateFormat("yyyy-MM").format(workExperience.getEndTime()));
            workMap.put("workExperience", workExperience);
            
            Map<String, Object> workMap2 = new HashMap<>();
            workMap2.put("company", workExperience2.getCompany());
            workMap2.put("historyPosts", workExperience2.getHistoryPosts());
            workMap2.put("workDescription", workExperience2.getWorkDescription());
            workMap2.put("startTime", new SimpleDateFormat("yyyy-MM").format(workExperience2.getStartTime()));
            workMap2.put("endTime", new SimpleDateFormat("yyyy-MM").format(workExperience2.getEndTime()));
            workMap2.put("workExperience2", workExperience2);
            //workList.add(workMap);
            //workList.add(workMap2);
            dataMap.put("workList", workList);
            /** Update 工作經驗 end */
            
            // 榮譽獎項
            dataMap.put("awards", peopleInfo.getAwards());
            
//            // 出生年月
//            dataMap.put("birthday", peopleInfo.getBirthday());
//            // 籍貫
//            dataMap.put("hometown", peopleInfo.getHometown());
//            // 民族
//            dataMap.put("nation", peopleInfo.getNation());
//            // 政治面貌
//            dataMap.put("politicalStatus", peopleInfo.getPoliticalStatus());
//            // 學歷
//            dataMap.put("education", peopleInfo.getEducation());
//            // 學制
//            dataMap.put("academicSystem", peopleInfo.getAcademicSystem());
//            // 專業
//            dataMap.put("major", peopleInfo.getMajor());
//            // 身高
//            dataMap.put("height", peopleInfo.getHeight());
//            // 身體狀況
//            dataMap.put("physicalConditions", peopleInfo.getPhysicalConditions());
//            // 畢業院校
//            dataMap.put("school", peopleInfo.getSchool());
//            
//            // 聯繫地址
//            dataMap.put("address", peopleInfo.getAddress());
//            // 郵編
//            dataMap.put("postCode", peopleInfo.getPostCode());
//            
//            // 曾任職務
//            dataMap.put("personalPosition", peopleInfo.getPersonalPosition());
//            // 求職意向
//            dataMap.put("careerObjective", peopleInfo.getCareerObjective());
//            // 計算機
//            dataMap.put("computer", peopleInfo.getComputer());
//            // 語言能力
//            dataMap.put("languageSkills", peopleInfo.getLanguageSkills());
//            // 獲獎情況
//            dataMap.put("awards", peopleInfo.getAwards());
//            // 工作經歷
//            dataMap.put("workLife", peopleInfo.getWorkLife());
//            // 興趣特長
//            dataMap.put("hobby", peopleInfo.getHobby());
//            // 自我評價
//            dataMap.put("content", peopleInfo.getContent());
            
            
            //Configuration 用於讀取ftl文件
            Configuration configuration = new Configuration(new Version("2.3.0"));
            configuration.setDefaultEncoding("utf-8");
 
            /**
             * 以下是兩種指定ftl文件所在目錄路徑的方式,注意這兩種方式都是
             * 指定ftl文件所在目錄的路徑,而不是ftl文件的路徑
             */
            //指定路徑的第一種方式(根據某個類的相對路徑指定)
//                configuration.setClassForTemplateLoading(this.getClass(), "");
 
            //指定路徑的第二種方式,我的路徑是C:/a.ftl
            configuration.setDirectoryForTemplateLoading(new File("d:/"));
 
            //輸出文檔路徑及名稱 (不帶圖)
            //File outFile = new File("D:/簡潔不帶圖簡歷.doc");
            
            //輸出文檔路徑及名稱(帶圖)
            File outFile = new File("E:/時尚帶圖簡歷.doc");
 
            //以utf-8的編碼讀取ftl文件
            //Template template = configuration.getTemplate("簡潔.ftl", "utf-8");
            Template template = configuration.getTemplate("時尚(帶圖).ftl", "utf-8");
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"), 10240);
            template.process(dataMap, out);
            out.close();
            
            // ---------- word轉PDF start
            //Xml2Word2Pdf.word2Pdf("E:/時尚帶圖簡歷.doc", "D:/new時尚帶圖簡歷.pdf");
            // ---------- word轉PDF end
            
            /** 此處使用JAVA-JACOB 技術 處理通過java-FreeMarker模板生成的word文檔在移動端打開爲xml文件                              start*/
            ActiveXComponent _app = new ActiveXComponent("Word.Application");
            _app.setProperty("Visible", Variant.VT_FALSE);

            Dispatch documents = _app.getProperty("Documents").toDispatch();

            // 打開FreeMarker生成的Word文檔
            Dispatch doc = Dispatch.call(documents, "Open", "E:/時尚帶圖簡歷.doc", Variant.VT_FALSE, Variant.VT_TRUE).toDispatch();
            // 另存爲新的Word文檔
            Dispatch.call(doc, "SaveAs", "D:/new時尚帶圖簡歷.doc", Variant.VT_FALSE, Variant.VT_TRUE);
            
            Dispatch.call(doc, "Close", Variant.VT_FALSE);
            _app.invoke("Quit", new Variant[] {});
            ComThread.Release();
            /** 此處使用JAVA-JACOB 技術 處理通過java-FreeMarker模板生成的word文檔在移動端打開爲xml文件                              end*/
            
            // 刪除臨時文件
            outFile.delete();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
	
	/**
	 * 處理圖片  轉爲圖碼
	 * 正式生成時,以下圖片爲用戶從自己的照片中選取,程序獲取其路徑即可.
	 * @return
	 */
	public static String getImageStr() {  
        String imgFile = "d:/x.jpg";  
        InputStream in = null;  
        byte[] data = null;  
        try {  
            in = new FileInputStream(imgFile);  
            data = new byte[in.available()];  
            in.read(data);  
            in.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        // 該代碼需要用到 sun.misc.BASE64Encoder 類,這個類就是JDK中的類,但在eclipse中默認是不訪問的,需要設置一下
        // 具體設置如下:
        // 項目上右鍵-->Build Path-->Configure Build Path
        // 雙擊Access rules,點擊add, 選擇Accessible,下方輸入**, OK , 這樣就可以訪問sun.misc.BASE64Encoder 類了 
        BASE64Encoder encoder = new BASE64Encoder();  
        return encoder.encode(data);  
    } 
}






/** 下面是實際生成系統下 將一些地址寫活*/

package net.aykj.util;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.Version;
import net.aykj.constants.AykjConstants;
import net.aykj.listener.InitialListener;
import net.aykj.pojo.Annex;
import net.aykj.pojo.Educational;
import net.aykj.pojo.PeopleInfo;
import net.aykj.pojo.WorkExperience;
import net.aykj.service.EducationalService;
import net.aykj.service.WorkExperienceService;
import sun.misc.BASE64Encoder;

/**
 * 通過選擇簡歷模板生成簡歷
 * @author Add by Bingyong.Wang 
 *
 */
public class CreatePeoleInfoByResumeTemplate {
	
	// 如下代碼解決異常: java.lang.IllegalStateException: Failed to instantiate standard serializer
	private CreatePeoleInfoByResumeTemplate(){}

	/**
	 * 通過調用簡歷模板自動生成不帶圖的簡歷和帶圖的簡歷
	 * 
	 * 正式生成簡歷時:
	 *           1  會員簡歷信息動態獲取.
	 *           2  會員動態選取簡歷模板
	 *           3  生成的簡歷如何存放?存放在哪裏?(這裏生成的放在附件表裏,通過會員ID獲取.)
	 * @throws ParseException 
	 */
	public static String autoCreatePeopleInfo(PeopleInfo peopleInfo, Annex annex, String imgUrl) throws ParseException{
		Map<String,Object> dataMap = new HashMap<String, Object>();
        try {
            // 姓名
            dataMap.put("name", GeneralUtil.isNotNull(peopleInfo.getName()) ? peopleInfo.getName() : "");
            //日期
            //dataMap.put("date", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse("2018-09-19")));
            // 性別
            dataMap.put("gender", GeneralUtil.isNotNull(peopleInfo.getGender()) ? peopleInfo.getGender() : "");
            // 簡歷右側頭像
            dataMap.put("imgUrl", GeneralUtil.isNotNull(getImageStr(imgUrl)) ? getImageStr(imgUrl) : "");
            // 婚姻狀況
            dataMap.put("maritalStatus", GeneralUtil.isNotNull(peopleInfo.getMaritalStatus()) ? peopleInfo.getMaritalStatus() : "");
            // 電話
            dataMap.put("tel", GeneralUtil.isNotNull(peopleInfo.getTel()) ? peopleInfo.getTel() : "");
            // 郵箱
            dataMap.put("email", GeneralUtil.isNotNull(peopleInfo.getEmail()) ? peopleInfo.getEmail() : "");
            // 工作年限
            dataMap.put("workingYears", GeneralUtil.isNotNull(peopleInfo.getWorkingYears()) ? peopleInfo.getWorkingYears() : "");
            
            // 技能名稱(將會車符轉換爲換行)
            dataMap.put("specialSkill", GeneralUtil.isNotNull(peopleInfo.getSpecialSkill()) ? peopleInfo.getSpecialSkill().replace(";", "<w:br/>") : "");
            
            // 個人優勢
            dataMap.put("personalAdvantage", GeneralUtil.isNotNull(peopleInfo.getPersonalAdvantage()) ? peopleInfo.getPersonalAdvantage() : "");
            
            // 求職職位
            dataMap.put("careerObjective", GeneralUtil.isNotNull(peopleInfo.getCareerObjective()) ? peopleInfo.getCareerObjective() : "");
            // 意向城市
            dataMap.put("intentionCity", GeneralUtil.isNotNull(peopleInfo.getIntentionCity()) ? peopleInfo.getIntentionCity() : "");
            // 期望薪資
            dataMap.put("pay", GeneralUtil.isNotNull(peopleInfo.getPay()) ? peopleInfo.getPay() : "");
            // 目前工作狀況(入職時間)
            dataMap.put("currentWorkingStatus", GeneralUtil.isNotNull(peopleInfo.getCurrentWorkingStatus()) ? peopleInfo.getCurrentWorkingStatus() : "");
            
            // 教育背景 start
            /*dataMap.put("school", GeneralUtil.isNotNull(peopleInfo.getSchool()) ? peopleInfo.getSchool() : "");
            dataMap.put("major", GeneralUtil.isNotNull(peopleInfo.getMajor()) ? peopleInfo.getMajor() : "");
            dataMap.put("educationStartTime", GeneralUtil.isNotNull(peopleInfo.getEducationStartTime()) ? new SimpleDateFormat("yyyy-MM").format(peopleInfo.getEducationStartTime()) : "");
            dataMap.put("educationEndTime", GeneralUtil.isNotNull(peopleInfo.getEducationEndTime()) ? new SimpleDateFormat("yyyy-MM").format(peopleInfo.getEducationEndTime()) : "");
            dataMap.put("educationExperience", GeneralUtil.isNotNull(peopleInfo.getEducationExperience()) ? peopleInfo.getEducationExperience() : "");*/
            // 教育背景 end
            
            /** Update 教育背景 start*/
            EducationalService educationalService = new EducationalService();
            // 獲取當前簡歷下的教育經歷
            List<Educational> educationals = educationalService.queryEducationalListByResumeId(null, peopleInfo.getId());
            List<Map<String, Object>> eduList = new ArrayList<>();
            Map<String, Object> map = new HashMap<>();
            if (GeneralUtil.isNotNull(educationals)) {
            	for(Educational educational : educationals) {
            		map.put("school", GeneralUtil.isNotNull(educational.getSchool()) ? educational.getSchool() : "");
                    map.put("major", GeneralUtil.isNotNull(educational.getMajor()) ? educational.getMajor() : "");
                    map.put("educationExperience", GeneralUtil.isNotNull(educational.getEducationExperience()) ? educational.getEducationExperience() : "");
                    map.put("educationStartTime", GeneralUtil.isNotNull(educational.getEducationStartTime()) ? new SimpleDateFormat("yyyy-MM").format(educational.getEducationStartTime()) : "");
                    map.put("educationEndTime", GeneralUtil.isNotNull(educational.getEducationEndTime()) ? new SimpleDateFormat("yyyy-MM").format(educational.getEducationEndTime()) : "");
                    
                    eduList.add(map);
            	}
            }
            dataMap.put("eduList", eduList);
            /** Update 教育背景 end*/
            
            // 工作經驗  start
            /*dataMap.put("company", GeneralUtil.isNotNull(peopleInfo.getCompany()) ? peopleInfo.getCompany() : "");
            dataMap.put("historyPosts", GeneralUtil.isNotNull(peopleInfo.getHistoryPosts()) ? peopleInfo.getHistoryPosts() : "");
            dataMap.put("startTime", GeneralUtil.isNotNull(peopleInfo.getStartTime()) ? new SimpleDateFormat("yyyy-MM").format(peopleInfo.getStartTime()) : "");
            dataMap.put("endTime", GeneralUtil.isNotNull(peopleInfo.getEndTime()) ? new SimpleDateFormat("yyyy-MM").format(peopleInfo.getEndTime()) : "");
            dataMap.put("workDescription", GeneralUtil.isNotNull(peopleInfo.getWorkDescription()) ? peopleInfo.getWorkDescription() : "");*/
            // 工作經驗  end
            
            /** Update 工作經驗 start*/
            WorkExperienceService workExperienceService = new WorkExperienceService();
            // 獲取當前簡歷下的教育經歷
            List<WorkExperience> workExperiences = workExperienceService.queryWorkExperienceListByResumeId(null, peopleInfo.getId());
            List<Map<String, Object>> workList = new ArrayList<>();
            Map<String, Object> workMap = new HashMap<>();
            if (GeneralUtil.isNotNull(workExperiences)) {
            	for(WorkExperience workExperience : workExperiences) {
            		workMap.put("company", GeneralUtil.isNotNull(workExperience.getCompany()) ? workExperience.getCompany() : "");
                    workMap.put("historyPosts", GeneralUtil.isNotNull(workExperience.getHistoryPosts()) ? workExperience.getHistoryPosts() : "");
                    workMap.put("workDescription", GeneralUtil.isNotNull(workExperience.getWorkDescription()) ? workExperience.getWorkDescription() : "");
                    workMap.put("startTime", GeneralUtil.isNotNull(workExperience.getStartTime()) ? new SimpleDateFormat("yyyy-MM").format(workExperience.getStartTime()) : "");
                    workMap.put("endTime", GeneralUtil.isNotNull(workExperience.getEndTime()) ? new SimpleDateFormat("yyyy-MM").format(workExperience.getEndTime()) : "");
                    
                    workList.add(workMap);
            	}
            }
            dataMap.put("workList", workList);
            /** Update 工作經驗 end*/
            
            // 榮譽獎項
            dataMap.put("awards", GeneralUtil.isNotNull(peopleInfo.getAwards()) ? peopleInfo.getAwards() : "");
            
            //Configuration 用於讀取ftl文件
            Configuration configuration = new Configuration(new Version("2.3.0"));
            configuration.setDefaultEncoding("utf-8");
 
            /**
             * 以下是兩種指定ftl文件所在目錄路徑的方式,注意這兩種方式都是
             * 指定ftl文件所在目錄的路徑,而不是ftl文件的路徑
             */
            //指定路徑的第一種方式(根據某個類的相對路徑指定)
//                configuration.setClassForTemplateLoading(this.getClass(), "");
 
            //指定路徑的第二種方式,獲取改文件存放在web應用的根目錄
            //configuration.setDirectoryForTemplateLoading(new File("d:/")); // /uploadDir/ftl/20200416/1587017088881.ftl
            configuration.setDirectoryForTemplateLoading(new File(InitialListener.basePath + annex.getPath().substring(0, annex.getPath().lastIndexOf("/"))));
 
            //輸出文檔路徑及名稱 (不帶圖)
            //File outFile = new File("D:/簡潔不帶圖簡歷.doc");
            
            // 輸出文檔路徑及名稱(帶圖)  這裏應該 會員生成的word簡歷文檔,放到對應的會員下的“我的簡歷”中。提示生成成功,可到會員中心“我的簡歷中查看”
            //File outFile = new File("D:/時尚帶圖簡歷.doc");
            //File outFile = new File("D:/時尚帶圖簡歷.doc");
            //File outFile = new File(InitialListener.basePath + AykjConstants.PEOPLEINFO_PATH + "/" + new SimpleDateFormat("yyyyMMdd").format(new Date()) + ".doc");
            // 防止同一份簡歷生成多個只是名字不同的簡歷(重新生成要刪除老的簡歷) 
            File outFile = new File(InitialListener.basePath + AykjConstants.PEOPLEINFO_PATH + "/" + (System.currentTimeMillis()/AykjConstants.NAMEDIVISOR) + ".doc");
            
            // 以utf-8的編碼讀取ftl文件
            //Template template = configuration.getTemplate("時尚(帶圖).ftl", "utf-8");
            Template template = configuration.getTemplate(annex.getPath().substring(annex.getPath().lastIndexOf("/") + 1), "utf-8");
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"), 10240);
            template.process(dataMap, out);
            out.close();
            
            /** 此處使用JAVA-JACOB  目前只支持windows  技術 處理通過java-FreeMarker模板生成的word文檔在移動端打開爲xml文件                              start*/
            /*ActiveXComponent _app = new ActiveXComponent("Word.Application");
            _app.setProperty("Visible", Variant.VT_FALSE);

            Dispatch documents = _app.getProperty("Documents").toDispatch();

            // 打開FreeMarker生成的Word文檔
            Dispatch doc = Dispatch.call(documents, "Open", outFile.getPath(), Variant.VT_FALSE, Variant.VT_TRUE).toDispatch();
            // 另存爲新的Word文檔
            File newFile = new File(InitialListener.basePath + AykjConstants.PEOPLEINFO_PATH + "/" + (System.currentTimeMillis()/AykjConstants.NAMEDIVISOR) + ".doc");
            Dispatch.call(doc, "SaveAs", newFile.getPath(), Variant.VT_FALSE, Variant.VT_TRUE);

            Dispatch.call(doc, "Close", Variant.VT_FALSE);
            _app.invoke("Quit", new Variant[] {});
            ComThread.Release();*/
            /** 此處使用JAVA-JACOB 技術 處理通過java-FreeMarker模板生成的word文檔在移動端打開爲xml文件                              end*/
            
            // 刪除臨時文件
            /*outFile.delete();
            System.out.println("delete temp filePath ==== " + outFile.getPath());*/
            
            return outFile.getPath().replace(InitialListener.basePath, "\\").replace("\\", "/");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
	
	/**
	 * 處理圖片  轉爲圖碼
	 * 正式生成時,以下圖片爲用戶從自己的照片中選取,程序獲取其路徑即可.
	 * @return
	 */
	public static String getImageStr(String imgUrl) {  
        String imgFile = InitialListener.basePath + imgUrl;  
        InputStream in = null;  
        byte[] data = null;  
        try {  
            in = new FileInputStream(imgFile);  
            data = new byte[in.available()];  
            in.read(data);  
            in.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        // 該代碼需要用到 sun.misc.BASE64Encoder 類,這個類就是JDK中的類,但在eclipse中默認是不訪問的,需要設置一下
        // 具體設置如下:
        // 項目上右鍵-->Build Path-->Configure Build Path
        // 雙擊Access rules,點擊add, 選擇Accessible,下方輸入**, OK , 這樣就可以訪問sun.misc.BASE64Encoder 類了 
        BASE64Encoder encoder = new BASE64Encoder();  
        return encoder.encode(data);  
    } 
}
  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章