java按照模板导出pdf或者word

这篇具有很好参考价值的文章主要介绍了java按照模板导出pdf或者word。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、java按照模板导出pdf

(一)制作模板

 1、在word里制作模板

        因为PDF常用的软件不支持编辑,所以先用Word工具,如WPS或者Office新建一个空白Word文档,里面制作出自己想要的样式。

java根据模板生成pdf,pdf,word

2、 将Word转换成PDF形式

         将设置好的Word文档转换成PDF形式,保存起来。

java根据模板生成pdf,pdf,word

3、编辑PDF准备表单 

        用Adobe Acrobat DC 软件打开保存好的PDF模板文件,点击右侧的准备表单按钮

java根据模板生成pdf,pdf,word

java根据模板生成pdf,pdf,word

        接下来进行数据源配置,在要显示图像的区域,点击鼠标右键,选择文本域,设定好图像的显示位置,并指定数据源字段。需要注意的是,配置的数据源字段必须与Java中的实体类对象的字段名保持一致。

java根据模板生成pdf,pdf,word

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

java根据模板生成pdf,pdf,word

(二)java代码编写

1、导入依赖 

<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 {
    /**接收业务总次数*/
    private String total;
    /**接收业务总次数(去年同期)*/
    private String lastToatl;
    /**处理次数*/
    private String dealNum;
    /**处理次数(去年同期)*/
    private String lastDealNum;
    /**已完成次数*/
    private String completeNum;
    /**已完成次数(去年同期)*/
    private String lastCompleteNum;
    /**售后次数*/
    private String afterSales;
    /**售后次数(去年同期)*/
    private String lastAfterSales;
}

3、service层代码实现

/**
  * 生成报表
  * @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 = "";
    // 获取操作系统名称,根据系统名称确定模板存放的路径
    /*String systemName = System.getProperty("os.name");
    if(systemName.toUpperCase().startsWith("WIN")){
        path = "D:/pdf/";
    }else {
        path = "/usr/local/pdf/";
    }*/
    // 生成导出PDF的文件名称
    String fileName = "海事行政执法业务数据统计"+msaBusinessVO.getStartDate()+"至"+msaBusinessVO.getEndDate()+".pdf";
    fileName = URLEncoder.encode(fileName, "UTF-8");
    // 设置响应头
    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);
        // 字节数组流,用来缓存文件流
        bos = new ByteArrayOutputStream();
        // 根据模板表单生成一个新的PDF
        stamper = new PdfStamper(reader, bos);
        // 获取新生成的PDF表单
        AcroFields form = stamper.getAcroFields();
        // 给表单生成中文字体,这里采用系统字体,不设置的话,中文显示会有问题
        //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);
        // 装配数据
        this.setMsaBusinessToForm(form, msaBusinessVO);
        // 表明该PDF不可修改
        stamper.setFormFlattening(true);
        // 关闭资源
        stamper.close();
        // 将ByteArray字节数组中的流输出到out中(即输出到浏览器)
        Document doc = new Document();
        PdfCopy copy = new PdfCopy(doc, out);
        doc.open();
        //改成这样就不会只显示一页了。
        PdfImportedPage importPage = null;
        ///循环是处理成品只显示一页的问题
        for (int i=1;i<=reader.getNumberOfPages();i++){
            importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i);
            copy.addPage(importPage);
        }
        doc.close();
        log.info("*****************************PDF导出成功*********************************");
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (out != null) {
                out.flush();
                out.close();
            }
            if (reader != null) {
                reader.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


/**
 * 装配数据
 * @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());//进出港报告内河船艘次
    form.setField("lastDealNum",msaBusinessVO.getLastDealNum());//进出港报告内河船艘次(去年同期)
    form.setField("completeNum",msaBusinessVO.getCompleteNum());//进出港报告海船艘次
    form.setField("lastCompleteNum",msaBusinessVO.getLastCompleteNum());//进出港报告海船艘次(去年同期)
    form.setField("afterSales",msaBusinessVO.getAfterSales());//进出口岸查验船舶艘次
    form.setField("lastAfterSales",msaBusinessVO.getLastAfterSales());//进出口岸查验船舶艘次(去年同期)
}

4、Controller层代码实现

/**
 * 导出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按照模板导出word

(一)制作模板

1、word模板文件处理,如下图所示在word 文档中填值的地方写入占位变量,值得注意的是,word中的占位变量要与java代码中写入的元素名称保持一致。

java根据模板生成pdf,pdf,word

 2、将word文档另存为xml文件,编辑如下图,找到填写的占位,修改为${total}格式

java根据模板生成pdf,pdf,word

java根据模板生成pdf,pdf,word 3、将文件后缀名改为.ftl文件 ,留作模板使用。

java根据模板生成pdf,pdf,word

 (二)java代码编写

1、引入依赖

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

2、service层代码实现

/**
 * 导出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 {
        // 要填充的数据 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");
        //指定路径的第一种方式(根据某个类的相对路径指定)
        configuration.setClassForTemplateLoading(this.getClass(), "/static/template/");
        // 输出文档路径及名称
        File outFile = new File("D:/附件"+new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+".doc");
        //以utf-8的编码读取ftl文件  名字要正确,最好不要放在本地,可能会出现找不到。
        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层代码实现文章来源地址https://www.toymoban.com/news/detail-738447.html

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

到了这里,关于java按照模板导出pdf或者word的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java】itext 实现 html根据模板生成pdf 中文不显示/图片不显示问题解决

    工作中需要使用生成pdf记录,选取使用的是itext 生成 pdf方式。分享下实现方式及遇到的问题。 这里随便找个html课程表作为示例,添加了几张图片为了展示图片转pdf功能。 一:引入jar包 二:导入ftl文件 这块使用的是html语法,将文件后缀名改为ftl即可,在需要参数的地方通过

    2024年02月05日
    浏览(46)
  • Springboot -- 按照模板生成docx、pdf文件,docx转pdf格式

    使用 poi-tl 根据模板生成 word 文件。 使用 xdocreport 将 docx 文件转换为 pdf 文件。 xdocreport 也支持根据模板导出 word ,但是 poi-tl 的功能更齐全,操作更简单,文档清晰。 poi-tl 、xdocreport 内部均依赖了 poi ,要注意两者中 poi 和 自身项目引用的 poi 的版本是否存在冲突。 使用 p

    2024年02月15日
    浏览(39)
  • nodejs根据pdf模板填入中文数据并生成新的pdf文件

    首先 const templateBytes = await fs.promises.readFile(templatePath);   const pdfDoc = await PDFDocument.load(templateBytes);   const form = pdfDoc.getForm(); 这三行表示读文件,并且读取pdf表单,然后注册fontkit,将你要的字体嵌入pdf中,之后在pdf的表单中寻找字段,填入字段,并把字体样式更新为你嵌入pd

    2024年02月10日
    浏览(45)
  • java根据模板导出word

    日常开发中,常常会遇到各种各样的表格进行导出,比较好的办法就是提前弄好word模版,再通过遍历的方式进行导出文档 模版编写 内容替换 目标下面模版进行多页展示 将word转换成xml 将xml格式化 再将xml改成ftl xml格式化地址 list找到起始位置和结束位置 起始位置插入#list

    2024年02月15日
    浏览(92)
  • java根据excel模板进行导出数据

     一、pom文件添加以下依赖 二、添加util包 三、在resources目录下添加template并添加xlsx模板  注意:xlsx模板使用${list.XXX}     XXX表示数据源list(map形式的list)的数据key值,如果list是对象形式的,那么就是该业务字段  四、业务层使用:

    2024年02月11日
    浏览(44)
  • java 导出word,java根据提供word模板导出word文档

    本文主要讲解,利用poi-tl在word中动态生成表格行,进行文字、图片填充。一共提供了两种方式,1.基于本地文件 2.基于网络文件 本文讲解思路,1.先看示例,2. 示例对应的代码展示 3. 基本概念讲解(api自行查阅文档)。 这样便于快速展示,不符合你的业务需求的可以直接划走

    2024年02月14日
    浏览(43)
  • 【PDFBox】PDFBox操作PDF文档之读取指定页面文本内容、读取所有页面文本内容、根据模板文件生成PDF文档

    这篇文章,主要介绍PDFBox操作PDF文档之读取指定页面文本内容、读取所有页面文本内容、根据模板文件生成PDF文档。 目录 一、PDFBox操作文本 1.1、读取所有页面文本内容 1.2、读取指定页面文本内容 1.3、写入文本内容 1.4、替换文本内容 (1)自定义PDTextStripper类 (2)创建Key

    2024年02月16日
    浏览(69)
  • Java导出PDF文档(模板导出和自定义)

    需要导出PDF文档,支持模板导出和自定义文档格式。 PDF模板创建可使用表单域创建表单字段,引入数据填充,或者根据实际需要生成html转换成pdf。 PDF模板可以考虑使用PDF编辑器编辑,创建表单域,配置好相应字段      

    2024年02月16日
    浏览(55)
  • java调用poi根据模板生成ppt

    吐槽:像这种需求半年碰不到一个 O.o 可以多去poi官网翻一下官方文档虽然很难理解但有用  所有代码基于个人习惯编写,懒得贴图了相信兄弟们的理解能力,有问题可以留言我尽量解决。 本文所有代码生成都基于pptx文件编写,可根据具体业务修改代码 1.打开模板文件 2.创建

    2024年02月21日
    浏览(52)
  • java 根据word模板生成word文件

    Java可以使用Apache POI库来生成Word文件,并且也可以使用freemarker等模板引擎来实现根据Word模板生成Word文件的功能。 下面是一个简单的示例代码,可以帮助您快速入门。 模板制作:offer,wps都行,我使用wps进行操作  第一步制作模板 CTRL+f9生成域------》鼠标右键编辑域------》选

    2024年02月14日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包