java模板匯出PDF檔案

Home Well Go發表於2020-10-26

前言

前段時間在專案中遇到了匯出pdf的問題,之前在專案中遇到匯出檔案莫不是excle或者word檔案的匯出,所以在遇到需要匯出pdf檔案時,我搜尋了許多的網頁內容,但是很多網頁給出的答案也不是正解,走了許多的歪路後才最終實現了pdf檔案的匯出,下面提供的pdf檔案匯出希望能幫助到你

PDF檔案匯出

word檔案轉換pdf檔案

通過使用word轉換pdf的方式實現pdf檔案的匯出,因為專案在需求前是要求匯出word檔案的,然後客戶方要求匯出為pdf檔案,所以在此基礎上我使用的是用word檔案轉換pdf。

  1. 第一步 :通過freemaker模板匯出word檔案
  2. 匯入doc4j的jar包
    <dependency>
           <groupId>org.docx4j</groupId>
           <artifactId>docx4j</artifactId>
           <version>3.2.1</version>
    </dependency>
    
  3. java程式碼
    	/**
     *  根據ftl模板匯出word檔案
     * @param wordPath word檔案存放路徑
     * @param pdfPath 匯出pdf檔案存放路徑
     * */
    public static void exportPdfForDoc4j(String wordPath,String pdfPath){
    
        InputStream is = null;
    
        OutputStream target=null;
    
        try {
    
            is=new FileInputStream(new File(wordPath));
    
            target=new FileOutputStream(new File(pdfPath));
    
            WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(is);
            //設定字型
            Mapper fontMapper = new IdentityPlusMapper();
    		/**
    			*你的模板中使用了什麼字型,需要往專案中放入字型格式檔案,
    			*沒設定時可能在windows上不會出現問題,但是linux上沒有該
    			*字型的話就會使用其預設字型。
    			**/
            URL fontUrl=ExportPdfUtils.class.getResource("/font/FangSong_GB2312.ttf");
    
            PhysicalFonts.addPhysicalFont("FangSong_GB2312",fontUrl);
    
            fontMapper.put("仿宋_GB2312",PhysicalFonts.get("FangSong_GB2312"));
    
            FOSettings foSettings = Docx4J.createFOSettings();
    
            foSettings.setWmlPackage(wordMLPackage);
    
            List<SectionWrapper> sections = wordMLPackage.getDocumentModel().getSections();
            //去掉頁尾
            for (SectionWrapper section : sections) {
    
                FooterPart footerPart = section.getHeaderFooterPolicy().getDefaultFooter();
    
                if(footerPart!=null){
    
                    List<Object> content = footerPart.getContent();
    
                    for (int i = 0; i < content.size(); i++) {
    
                        footerPart.getContent().remove(i);
    
                    }
    
                }
    
            }
    
            Docx4J.toFO(foSettings, target, Docx4J.FLAG_EXPORT_PREFER_XSL);
    
        } catch (Exception e) {  e.printStackTrace();
    
        }finally {
    
            try {
    
                if(is!=null) is.close();
    
                if(target!=null) target.close();
    
            }catch (IOException e){  e.printStackTrace(); }
    
        }
    
    }
    
  4. 以上就是通過word檔案轉換pdf的過程,但是轉換的pdf的格式等可能會出現錯亂等問題,所以以下是一些問題的解決
    在這裡插入圖片描述
    • 換行問題:首先看到的是身份證號碼過長而沒有換行行,但是word中格式確實是換行了的,所以我能找到的辦法就是資料中強制的換行,值的注意的是換行符一定要拼接上去否則換行符無效:
      在這裡插入圖片描述

    • 邊框變粗:這個問題也是轉換pdf遇到的最大的問題,但是我沒有找到具體的解決方案,只能通過加粗整體邊框線來使這少許的加粗看起來不明顯(加粗後的列印不會有邊框變粗的問題),這裡你可以通過全域性替換w:sz="x"來加粗或變細你的邊框,轉換比例為:1磅==4,
      在這裡插入圖片描述

    • 空格被省略:我們看到年月日中應該出現的樣子是如下圖展示的一樣,但是在pdf轉換後年月日位置更換不說,中間的空格也被縮減了;所以在做模板時要使用全形的輸入法進行空格的輸入,這樣在匯出pdf時就不會對空格進行縮減。
      在這裡插入圖片描述

    • 以上問題解決後匯出pdf概覽:
      在這裡插入圖片描述

相關文章