經過FreeMarker生成word文檔及處處PDF文件

經過FreeMarker生成word文檔及處處PDF文件

1.導出流程

本次PDF簡歷信息導出的處理流程能夠簡化爲以下操做,下面會詳細說明每一步的具體操做。前端

  • 建立好導出用Word模板並轉存爲xml文件
  • 用FreeMarker語法替換內容生成ftl模板
  • 將生成的word上傳到文件服務器,並返回地址Url給前端
  • 前端經過url進行網頁預覽或導出PDF操做

2.建立Word模板、將word轉存爲xml文件

導出PDF文件本身總結如下兩種方式:linux

第一種 Doc文件轉換成PDF文件web

第二種 Html轉換成PDF文件json

在考慮將所須要信息填充入過程當中Doc或Html中時,發現能夠經過FreeMarker將所需信息填充入Word模板中,考慮到後期有打印簡歷的須要,用word文檔打印的效果會更好,因此本次考慮用word建立模板再轉換成PDF文件。瀏覽器

FreeMarker是一款模板引擎:基於模板和要改變的數據,生成輸出文本(Word、Html)的通用工具。它是一款簡單的、專用語言,在模板中,咱們只需專一如何顯示數據,而在模板外專一於展現的數據。服務器

3.生成ftl文件模板

3.1 格式化xml文檔

經過網站https://www.bejson.com/otherformat/xml/對另存爲生成的xml文件進行格式化,格式化可以是咱們方便的看清楚文檔的結構,以及作內容的替換。session

3.2 進行模板內容的替換

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

3.3 導入模板用到的FreeMarker語法:
3.3.1 文字內容替換: ${name} ,xml模板中圖片會以base64儲存,若須要替換圖片只需${base64Pic}傳入對應圖片base64碼便可。
3.3.2 if else 判斷:
<#if isRelativesInCompany == "0" >
        aaa
    <#else>
        bbb
    </#if>
3.3.3 list集合遍歷: <#list workList as work> 即會遍歷集合,經過work.就能夠將每次遍歷出來的數據取出來。
<#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>
3.3.4 判斷list集合長度:<#if (workList?size == 0 )></#if>
3.3.5 判斷list集合是否到達最後一條:<#if work_has_next></#if>

4.生成doc文件並上傳到文件服務器

//一、生成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();
    }

5.實現文檔在線預覽與PDF文件下載

在拿到生成後的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文件下載地址

6.最後總結:

看似很複雜的生成PDF文檔功能,沒想到在實際操做實現過程當中並無想象中那麼複雜(除了word轉PDF那塊),經過FreeMarker的應用,可以輕鬆的實現word模板數據的填充,拿到咱們須要的DOC的word文件。固然這個實現方法也有一個最大的弊端:每一次模板的改動,就須要從新FreeMarker去從新填充,這樣操做起來會很是的機械,若是下次還有機會的話就去嘗試用HTML生成PDF了。。。。。。

相關文章
相關標籤/搜索