本次PDF簡歷信息導出的處理流程能夠簡化爲以下操做,下面會詳細說明每一步的具體操做。前端
導出PDF文件本身總結如下兩種方式:linux
第一種 Doc文件轉換成PDF文件web
第二種 Html轉換成PDF文件json
在考慮將所須要信息填充入過程當中Doc或Html中時,發現能夠經過FreeMarker將所需信息填充入Word模板中,考慮到後期有打印簡歷的須要,用word文檔打印的效果會更好,因此本次考慮用word建立模板再轉換成PDF文件。瀏覽器
FreeMarker是一款模板引擎:基於模板和要改變的數據,生成輸出文本(Word、Html)的通用工具。它是一款簡單的、專用語言,在模板中,咱們只需專一如何顯示數據,而在模板外專一於展現的數據。服務器
經過網站https://www.bejson.com/otherformat/xml/對另存爲生成的xml文件進行格式化,格式化可以是咱們方便的看清楚文檔的結構,以及作內容的替換。session
maven包導入:app
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.20</version> </dependency>
對模板進行編輯,將咱們須要替換的內容給替換上去,例如圖片中姓名那塊對應以下代碼。框架
<w:tblPrEx> <w:tblBorders> <w:top w:val="none" w:color="auto" w:sz="0" w:space="0"/> <w:left w:val="none" w:color="auto" w:sz="0" w:space="0"/> <w:bottom w:val="none" w:color="auto" w:sz="0" w:space="0"/> <w:right w:val="none" w:color="auto" w:sz="0" w:space="0"/> <w:insideH w:val="none" w:color="auto" w:sz="0" w:space="0"/> <w:insideV w:val="none" w:color="auto" w:sz="0" w:space="0"/> </w:tblBorders> <w:tblLayout w:type="fixed"/> <w:tblCellMar> <w:top w:w="0" w:type="dxa"/> <w:left w:w="108" w:type="dxa"/> <w:bottom w:w="0" w:type="dxa"/> <w:right w:w="108" w:type="dxa"/> </w:tblCellMar> </w:tblPrEx> <w:trPr> <w:trHeight w:val="522" w:hRule="atLeast"/> </w:trPr> <w:tc> <w:tcPr> <w:tcW w:w="2590" w:type="dxa"/> </w:tcPr> <w:p> <w:pPr> <w:jc w:val="left"/> <w:rPr> <w:rFonts w:ascii="Heiti SC Light" w:eastAsia="Heiti SC Light"/> </w:rPr> </w:pPr> <w:r> <w:rPr> <w:rFonts w:hint="eastAsia" w:ascii="Heiti SC Light" w:eastAsia="Heiti SC Light"/> <w:color w:val="7F7F7F" w:themeColor="background1" w:themeShade="80"/> </w:rPr> <w:t>姓名:</w:t> </w:r> <w:r> <w:rPr> <w:rFonts w:hint="eastAsia" w:ascii="Heiti SC Light" w:eastAsia="Heiti SC Light"/> </w:rPr> <w:t>xxxxxxxx</w:t> </w:r> </w:p> </w:tc>
而咱們須要作的是把xxxxxxxx替換成${name}的FreeMarker語法,這樣在生成時,就會用name的值去替換xxxxxx這塊內容了。在完成模板的修改後,將xml文件另存爲ftl文件。dom
<#if isRelativesInCompany == "0" > aaa <#else> bbb </#if>
<#list workInfo as work> <w:r> <w:rPr> <w:rFonts w:hint="eastAsia" w:ascii="Heiti SC Light" w:eastAsia="Heiti SC Light"/> <w:color w:val="7F7F7F" w:themeColor="background1" w:themeShade="80"/> </w:rPr> <w:t>起止日期:</w:t> </w:r> <w:r> <w:rPr> <w:rFonts w:hint="eastAsia" w:ascii="Heiti SC Light" w:eastAsia="Heiti SC Light"/> </w:rPr> <w:t>${work.time}</w:t> </w:r> </#list>
//一、生成template模板,一共有三種方式,我經過的是獲取web項目上下文去獲取 try { Configuration configuration = new Configuration(); configuration.setDefaultEncoding("UTF-8"); configuration.setServletContextForTemplateLoading(session.getServletContext(),"/temp"); Template template = configuration.getTemplate("applicant.ftl"); //文件名 //本地建立空文件 String fileName = "outFile"+sdf.format(new Date())+(int)(Math.random()*100)+".doc"; File outFile = new File(fileName); outFile.createNewFile(); Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8")); //將內容寫進建立的outFile文件中 template.process(hashMap, out); //將生成的doc上傳到文件服務器,並返回訪問地址 filePath = UploadUtils.getDfsProductPath(outFile); out.close(); //刪除本地建立的文件 outFile.delete(); } catch (Exception e) { e.printStackTrace(); }
在拿到生成後的doc文檔後,接下來要作的即是將文件轉換成PDF的問題了,因而百度、Google了一通發現大體的解決方法分爲:
1.使用Jacob,可是使用jacob中要依賴Office,部分博文中還會依賴插件,如SaveAsPDFandXPS.exe。可是也發現不須要依賴Office,可使用wps、pdfcreator,在使用wps的時候還不須要安裝插件(注意:wps有linux版,office到如今爲止尚未linux版)
2.OpenOffice,能夠結合Jodconverter開源框架和OpenOffice.org辦公軟件,具備跨平臺的優勢,轉化速度快,可是部分office的格式彷佛不支持。
3.Adobe Acrobat + jacob,這個用到什麼虛擬打印機,和微軟的一塊兒使用效果比較好。(這個我不太懂)
4.Jcom + Adobe Acrobat ,會用到IDispatch。 (這4段是拷貝的)
本來覺得doc轉pdf會很簡單,沒想到看似簡單的功能卻有大學問,在轉換時要麼會兼容性很差樣式出現錯亂,要麼是跨平臺兼容性問題,總之轉換起來很麻煩。在糾結了許久後,偶然想到公司知識庫有文檔預覽功能。發現預覽功能是直接購買的外部服務,既然是RMB玩家,那就去該公司的官網去看,還真發現了有幫你將doc文件轉成PDF的功能,美滋滋的我就直接拿來用了。(有的文件預覽也有免費的體驗版)能夠實現的功能是
文件瀏覽器預覽: http://xxxx/?i=您的網站ID&fname=簡歷預覽&furl=要預覽的Office文件下載地址 PDF下載:http://xxxx/?i=您的網站ID&fname=簡歷&furl=要預覽的Office文件下載地址
看似很複雜的生成PDF文檔功能,沒想到在實際操做實現過程當中並無想象中那麼複雜(除了word轉PDF那塊),經過FreeMarker的應用,可以輕鬆的實現word模板數據的填充,拿到咱們須要的DOC的word文件。固然這個實現方法也有一個最大的弊端:每一次模板的改動,就須要從新FreeMarker去從新填充,這樣操做起來會很是的機械,若是下次還有機會的話就去嘗試用HTML生成PDF了。。。。。。