iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >java集成itextpdf实现通过pdf模板填充数据生成pdf
  • 148
分享到

java集成itextpdf实现通过pdf模板填充数据生成pdf

javapdf 2023-08-18 09:08:18 148人浏览 薄情痞子
摘要

文章目录 一、制作pdf模板1.1、使用excel制作一个表格1.2、转成pdf1.3、设置表单域1.4、最终模版效果 二、引入POM依赖三、代码实现3.1、工具类3.2、实体对象3.3、Controller 一、制作


一、制作pdf模板

1.1、使用excel制作一个表格

在这里插入图片描述

1.2、转成pdf

我采用的是pdfelement 官网地址需要付费或者自行破解,也可以使用其他pdf编辑器。

在这里插入图片描述

1.3、设置表单域

在这里插入图片描述

1.4、最终模版效果

在这里插入图片描述

二、引入POM依赖

      com.itextpdf     itextpdf     5.5.13       com.itextpdf     itext-asian     5.2.0 

三、代码实现

将制作好的pdf模板放入项目resources/pdf目录下,如图

在这里插入图片描述

3.1、工具

import cn.hutool.core.bean.BeanUtil;import cn.hutool.core.util.ObjectUtil;import cn.hutool.core.util.StrUtil;import com.itextpdf.text.DocumentException;import com.itextpdf.text.pdf.AcroFields;import com.itextpdf.text.pdf.BaseFont;import com.itextpdf.text.pdf.PdfReader;import com.itextpdf.text.pdf.PdfStamper;import lombok.extern.slf4j.Slf4j;import org.apache.commons.io.IOUtils;import org.springframework.core.io.Resource;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import org.springframework.util.ResourceUtils;import javax.servlet.Http.httpservletRequest;import javax.servlet.http.HttpServletResponse;import java.io.*;import java.net.URLEncoder;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;@Slf4jpublic class PdfUtil {    private static boolean isPrimitiveOrWrapper(Class clazz) {        return clazz.isPrimitive() || clazz.getName().startsWith("java.lang");    }    private static Map turnMap(Object object) {        Map strinGobjectMap = BeanUtil.beanToMap(object);        Map map = new HashMap<>(stringObjectMap.size() * 2);        // 打印输出属性名称和属性值        for (Map.Entry entry : stringObjectMap.entrySet()) {            String key = entry.geTKEy();            Object value = entry.getValue();            if (ObjectUtil.isNotEmpty(value)) {                //基本类型和封装类型                if (isPrimitiveOrWrapper(value.getClass())) {                    map.put(key, String.valueOf(value));                } else {                    //其他类型                    if (value instanceof List) {                        List list = (List) value;                        for (int i = 0; i < list.size(); i++) {Object o = list.get(i);Map stringObjectMap1 = BeanUtil.beanToMap(o);for (Map.Entry entry1 : stringObjectMap1.entrySet()) {    String key1 = entry1.getKey();    Object value1 = entry1.getValue();    map.put(StrUtil.fORMat("{}.{}{}", key, key1, i), String.valueOf(value1));}                        }                    } else {                        Map stringObjectMap1 = BeanUtil.beanToMap(value);                        for (Map.Entry entry1 : stringObjectMap1.entrySet()) {String key1 = entry1.getKey();Object value1 = entry1.getValue();map.put(StrUtil.format("{}.{}", key, key1), String.valueOf(value1));                        }                    }                }            }        }        return map;    }    public static void generatePdf(HttpServletRequest request,       HttpServletResponse response,       String templateName, Object object,       boolean download) {        try (OutputStream responseOutputStream = response.getOutputStream();             ByteArrayOutputStream fileOut = new ByteArrayOutputStream()) {             //模板在项目中的位置            Resource resource = new PathMatchingResourcePatternResolver()                    .getResource(ResourceUtils.CLASSPATH_URL_PREFIX + "pdf/" + templateName);            PdfReader reader = new PdfReader(resource.getInputStream());            PdfStamper ps = new PdfStamper(reader, fileOut);//            BaseFont bf = BaseFont.createFont("STSong-Light","UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);            BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA_BOLD, BaseFont.WINANSI, BaseFont.EMBEDDED);            ArrayList fontList = new ArrayList<>();            fontList.add(bf);            //取出报表模板中的所有字段            AcroFields fields = ps.getAcroFields();            fields.setSubstitutionFonts(fontList);            PdfUtil.fillData(fields, PdfUtil.turnMap(object));            //必须要调用这个,否则文档不会生成的  如果为false那么生成的PDF文件还能编辑,一定要设为true            ps.setFormFlattening(true);            ps.close();            if (download) {                writerFile(request, response, templateName, false);            }            fileOut.writeTo(responseOutputStream);        } catch (Exception e) {            log.error("pdf生成异常:", e);            throw new RuntimeException("操作异常请联系管理员!");        }    }        private static void fillData(AcroFields fields, Map data) throws IOException, DocumentException {        Map formFields = fields.getFields();        for (String key : data.keySet()) {            if (formFields.containsKey(key)) {                String value = data.get(key);                // 为字段赋值,注意字段名称是区分大小写的                fields.setField(key, value);            }        }    }        private static void writerFile(HttpServletRequest request,       HttpServletResponse response,       String fileName,       boolean deleteOnExit) throws IOException {        File file = new File("/" + fileName);        file.createNewFile();        response.setCharacterEncoding(request.getCharacterEncoding());        response.setContentType("application/pdf");        try (FileInputStream fis = new FileInputStream(file);) {            //这里主要防止下载的PDF文件名乱码            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(file.getName(), "UTF-8"));            IOUtils.copy(fis, response.getOutputStream());            response.flushBuffer();            if (deleteOnExit) {                file.deleteOnExit();            }        } catch (Exception e) {            log.error("pdf生成异常1:", e);            throw new RuntimeException("操作异常1请联系管理员!");        }    }} 

3.2、实体对象

import lombok.Data;import java.util.List;@Datapublic class TestDto {    private String name;    private String birthday;    private Other other;    private List otherList;    @Data    public static class Other {        private String career;        private String company;    }}

3.3、Controller

import io.swagger.annotations.api;import org.springframework.WEB.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.util.ArrayList;import java.util.List;@RestController@RequestMapping("test")@Api(tags = "测试")public class TestController {    @GetMapping("/pdf")    public void pdf(HttpServletRequest request, HttpServletResponse response) {        TestDto testDto = new TestDto();        testDto.setName("张三");        testDto.setBirthday("2020-12-12");        TestDto.Other other = new TestDto.Other();        other.setCareer("码农");        other.setCompany("字节不跳动");        testDto.setOther(other);        List list = new ArrayList<>();        for (int i = 0; i <= 2; i++) {            TestDto.Other other1 = new TestDto.Other();            other1.setCareer("码农" + i);            other1.setCompany("字节不跳动" + i);            list.add(other1);        }        testDto.setOtherList(list);        PdfUtil.generatePdf(request, response, "test.pdf", testDto, false);    }   }

浏览器访问ip:port/test/pdf,其中ip为你的ip地址,port为你的端口,访问结果如下:

在这里插入图片描述

来源地址:https://blog.csdn.net/zero_wsh/article/details/130845151

--结束END--

本文标题: java集成itextpdf实现通过pdf模板填充数据生成pdf

本文链接: https://www.lsjlt.com/news/373801.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作