最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java按照模板導(dǎo)出pdf或word文件詳細代碼

 更新時間:2023年11月11日 11:25:26   作者:北葵向暖_南梔傾寒  
有時候業(yè)務(wù)中我們需要使用pdf模板生成一份pdf文件,下面這篇文章主要給大家介紹了關(guān)于java按照模板導(dǎo)出pdf或word文件的相關(guān)資料,文中給出了詳細的代碼示例,需要的朋友可以參考下

一、java按照模板導(dǎo)出pdf

(一)制作模板

1、在word里制作模板

因為PDF常用的軟件不支持編輯,所以先用Word工具,如WPS或者Office新建一個空白Word文檔,里面制作出自己想要的樣式。

2、 將Word轉(zhuǎn)換成PDF形式

將設(shè)置好的Word文檔轉(zhuǎn)換成PDF形式,保存起來。

3、編輯PDF準備表單 

用Adobe Acrobat DC 軟件打開保存好的PDF模板文件,點擊右側(cè)的準備表單按鈕

接下來進行數(shù)據(jù)源配置,在要顯示圖像的區(qū)域,點擊鼠標右鍵,選擇文本域,設(shè)定好圖像的顯示位置,并指定數(shù)據(jù)源字段。需要注意的是,配置的數(shù)據(jù)源字段必須與Java中的實體類對象的字段名保持一致。

配置完成之后保存pdf文件,留作模板使用。

(二)java代碼編寫

1、導(dǎo)入依賴 

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-asian</artifactId>
    <version>5.2.0</version>
</dependency>

2、實體類

import lombok.Data;
/**
 * 報表實體類
 */
@Data
public class MsaBusinessVO {
    /**接收業(yè)務(wù)總次數(shù)*/
    private String total;
    /**接收業(yè)務(wù)總次數(shù)(去年同期)*/
    private String lastToatl;
    /**處理次數(shù)*/
    private String dealNum;
    /**處理次數(shù)(去年同期)*/
    private String lastDealNum;
    /**已完成次數(shù)*/
    private String completeNum;
    /**已完成次數(shù)(去年同期)*/
    private String lastCompleteNum;
    /**售后次數(shù)*/
    private String afterSales;
    /**售后次數(shù)(去年同期)*/
    private String lastAfterSales;
}

3、service層代碼實現(xiàn)

/**
  * 生成報表
  * @param id
  * @param response
  */
void generateMsaBusiness(String id,HttpServletResponse response) throws UnsupportedEncodingException;
@Override
public void generateMsaBusiness(String id,HttpServletResponse response) throws UnsupportedEncodingException {
    //通過id獲取msaBusinessVO
    MsaBusinessVO msaBusinessVO = msaBusinessDao.getMsaBusinessInfo(id);
    // 模板名稱
    String templateName = "msaBusiness.pdf";
    String path = "/static/template/";
    //String path = "";
    // 獲取操作系統(tǒng)名稱,根據(jù)系統(tǒng)名稱確定模板存放的路徑
    /*String systemName = System.getProperty("os.name");
    if(systemName.toUpperCase().startsWith("WIN")){
        path = "D:/pdf/";
    }else {
        path = "/usr/local/pdf/";
    }*/
    // 生成導(dǎo)出PDF的文件名稱
    String fileName = "海事行政執(zhí)法業(yè)務(wù)數(shù)據(jù)統(tǒng)計"+msaBusinessVO.getStartDate()+"至"+msaBusinessVO.getEndDate()+".pdf";
    fileName = URLEncoder.encode(fileName, "UTF-8");
    // 設(shè)置響應(yīng)頭
    response.setContentType("application/force-download");
    response.setHeader("Content-Disposition",
            "attachment;fileName=" + fileName);
    OutputStream out = null;
    ByteArrayOutputStream bos = null;
    PdfStamper stamper = null;
    PdfReader reader = null;
    try {
        // 保存到本地
        // out = new FileOutputStream(fileName);
        // 輸出到瀏覽器端
        out = response.getOutputStream();
        // 讀取PDF模板表單
        reader = new PdfReader(path + templateName);
        // 字節(jié)數(shù)組流,用來緩存文件流
        bos = new ByteArrayOutputStream();
        // 根據(jù)模板表單生成一個新的PDF
        stamper = new PdfStamper(reader, bos);
        // 獲取新生成的PDF表單
        AcroFields form = stamper.getAcroFields();
        // 給表單生成中文字體,這里采用系統(tǒng)字體,不設(shè)置的話,中文顯示會有問題
        //BaseFont font = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        BaseFont bf = BaseFont.createFont("/static/fonts/simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        form.addSubstitutionFont(bf);
        // 裝配數(shù)據(jù)
        this.setMsaBusinessToForm(form, msaBusinessVO);
        // 表明該PDF不可修改
        stamper.setFormFlattening(true);
        // 關(guān)閉資源
        stamper.close();
        // 將ByteArray字節(jié)數(shù)組中的流輸出到out中(即輸出到瀏覽器)
        Document doc = new Document();
        PdfCopy copy = new PdfCopy(doc, out);
        doc.open();
        //改成這樣就不會只顯示一頁了。
        PdfImportedPage importPage = null;
        ///循環(huán)是處理成品只顯示一頁的問題
        for (int i=1;i<=reader.getNumberOfPages();i++){
            importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i);
            copy.addPage(importPage);
        }
        doc.close();
        log.info("*****************************PDF導(dǎo)出成功*********************************");
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (out != null) {
                out.flush();
                out.close();
            }
            if (reader != null) {
                reader.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
 
 
/**
 * 裝配數(shù)據(jù)
 * @param form
 * @param msaBusinessVO
 * @throws DocumentException
 * @throws IOException
 */
public void setMsaBusinessToForm(AcroFields form,MsaBusinessVO msaBusinessVO) throws DocumentException, IOException {    
    form.setField("total",msaBusinessVO.getTotal());//進出港船舶總艘次
    form.setField("lastTotal",msaBusinessVO.getLastTotal());//進出港船舶總艘次(去年同期)
    form.setField("dealNum",msaBusinessVO.getDealNum());//進出港報告內(nèi)河船艘次
    form.setField("lastDealNum",msaBusinessVO.getLastDealNum());//進出港報告內(nèi)河船艘次(去年同期)
    form.setField("completeNum",msaBusinessVO.getCompleteNum());//進出港報告海船艘次
    form.setField("lastCompleteNum",msaBusinessVO.getLastCompleteNum());//進出港報告海船艘次(去年同期)
    form.setField("afterSales",msaBusinessVO.getAfterSales());//進出口岸查驗船舶艘次
    form.setField("lastAfterSales",msaBusinessVO.getLastAfterSales());//進出口岸查驗船舶艘次(去年同期)
}

4、Controller層代碼實現(xiàn)

/**
 * 導(dǎo)出pdf
 * @param id
 * @param response
 */
@GetMapping("/generateMsaBusiness")
public void generateMsaBusiness(String id,HttpServletResponse response){
    try {
        msaBusinessService.generateMsaBusiness(id,response);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
}

二、java按照模板導(dǎo)出word

(一)制作模板

1、word模板文件處理,如下圖所示在word 文檔中填值的地方寫入占位變量,值得注意的是,word中的占位變量要與java代碼中寫入的元素名稱保持一致。

 2、將word文檔另存為xml文件,編輯如下圖,找到填寫的占位,修改為${total}格式

 3、將文件后綴名改為.ftl文件 ,留作模板使用。

(二)java代碼編寫

1、引入依賴

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.28</version>
    <scope>compile</scope>
</dependency>

2、service層代碼實現(xiàn)

/**
 * 導(dǎo)出word
 * @param param
 */
void exportSimpleWord(Map<String,Object> param);
/**
 * 保存打印記錄
 * @param param  
 * Map<String,Object> param 中的字段要與模板中的占位符名稱一致
 */
@Override
@Transactional(rollbackFor = Exception.class)
public void exportSimpleWord(Map<String,Object> param){    
    //param.put("total",total);
    //param.put("lastTotal",lastTotal);         
    try {
        // 要填充的數(shù)據(jù) dataMap, 注意map的key要和word中${xxx}的xxx一致
        //Configuration用于讀取ftl文件
        Configuration configuration = new freemarker.template.Configuration(Configuration.VERSION_2_3_23);
        System.out.println(configuration.getVersion());
        configuration.setDefaultEncoding("utf-8");
        //指定路徑的第一種方式(根據(jù)某個類的相對路徑指定)
        configuration.setClassForTemplateLoading(this.getClass(), "/static/template/");
        // 輸出文檔路徑及名稱
        File outFile = new File("D:/附件"+new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+".doc");
        //以utf-8的編碼讀取ftl文件  名字要正確,最好不要放在本地,可能會出現(xiàn)找不到。
        Template t1 = configuration.getTemplate("unpackCheck.ftl", "utf-8");
        // Template t =  configuration.getTemplate("a.ftl","utf-8");
        Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"), 10240);
        t1.process(param, out);
        out.close();
    }catch (IOException e) {
        e.printStackTrace();
    } catch (TemplateException e) {
        e.printStackTrace();
    }
}

3、Controller層代碼實現(xiàn)

@PostMapping("/exportSimpleWord")
public void exportSimpleWord(@RequestBody Map<String,Object> param) {
    dangerCompareService.exportSimpleWord(param);
}

總結(jié)

到此這篇關(guān)于java按照模板導(dǎo)出pdf或word文件的文章就介紹到這了,更多相關(guān)java模板導(dǎo)出pdf或word內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中String、StringBuffer、StringBuilder的區(qū)別詳解

    Java中String、StringBuffer、StringBuilder的區(qū)別詳解

    java中String、StringBuffer、StringBuilder是編程中經(jīng)常使用的字符串類,他們之間有什么區(qū)別呢?下面小編給大家總結(jié)了Java中String、StringBuffer、StringBuilder的區(qū)別詳解,需要的朋友參考下吧
    2016-06-06
  • Spring實現(xiàn)Bean的初始化和銷毀的方式

    Spring實現(xiàn)Bean的初始化和銷毀的方式

    這篇文章主要介紹了Spring實現(xiàn)Bean的初始化和銷毀的方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • MySQL MAX(IF())中table.column有值但顯示default的解決方案

    MySQL MAX(IF())中table.column有值但顯示default的解決方案

    這篇文章主要介紹了MySQL MAX(IF())中table.column有值但顯示default的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-11-11
  • SpringBoot+Flying Saucer+Thymeleaf實現(xiàn)PDF生成的完整指南

    SpringBoot+Flying Saucer+Thymeleaf實現(xiàn)PDF生成的完整指南

    在實際開發(fā)中,PDF生成是常見需求,本文將詳細講解如何基于 Spring Boot + Flying Saucer + Thymeleaf 實現(xiàn) PDF 生成,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2026-01-01
  • 探討Java中最常見的十道面試題(超經(jīng)典)

    探討Java中最常見的十道面試題(超經(jīng)典)

    本篇文章是對Java中最常見的十道面試題進行了詳細的分析介紹,需要的朋友參考下
    2013-07-07
  • Mybatis-Plus使用saveOrUpdate及問題解決方法

    Mybatis-Plus使用saveOrUpdate及問題解決方法

    本文主要介紹了Mybatis-Plus使用saveOrUpdate及問題解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2023-01-01
  • Java中過濾器 (Filter) 和 攔截器 (Interceptor)的使用

    Java中過濾器 (Filter) 和 攔截器 (Interceptor)的使用

    這篇文章主要介紹了Java中過濾器 (Filter) 和 攔截器 (Interceptor)的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2021-05-05
  • Gradle 創(chuàng)建Task的多種方法

    Gradle 創(chuàng)建Task的多種方法

    本文主要介紹了Gradle 創(chuàng)建Task的多種方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Java?IDEA集成開發(fā)工具中英文切換圖文教程

    Java?IDEA集成開發(fā)工具中英文切換圖文教程

    相信很多小伙伴們剛接觸IDEA時,看到一堆英文界面不知道如何下手,這篇文章主要給大家介紹了關(guān)于Java?IDEA集成開發(fā)工具中英文切換的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • SpringBoot如何使用@RequestBody進行數(shù)據(jù)校驗

    SpringBoot如何使用@RequestBody進行數(shù)據(jù)校驗

    在Web開發(fā)中,前臺向后臺發(fā)送數(shù)據(jù)是非常常見的場景,而在SpringBoot框架中,我們通常使用@RequestBody注解來接收前臺發(fā)送的?JSON數(shù)據(jù),并將其轉(zhuǎn)化為Java對象,本文將介紹如何在?SpringBoot?中使用?@RequestBody?進行數(shù)據(jù)校驗
    2023-06-06

最新評論

临颍县| 运城市| 肇源县| 永昌县| 抚松县| 本溪市| 额尔古纳市| 湖南省| 平塘县| 仁寿县| 临沭县| 兴文县| 惠安县| 高淳县| 唐海县| 河间市| 岗巴县| 揭西县| 民乐县| 恭城| 本溪市| 大荔县| 当阳市| 改则县| 柘城县| 通河县| 东丽区| 河源市| 黑水县| 石柱| 北海市| 电白县| 长兴县| 凯里市| 桐城市| 视频| 瑞金市| 丹巴县| 鄯善县| 蛟河市| 瑞金市|