文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-08-18 09:29

关注

1.1、使用excel制作一个表格

在这里插入图片描述

1.2、转成pdf

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

在这里插入图片描述

1.3、设置表单域

在这里插入图片描述

1.4、最终模版效果

在这里插入图片描述

      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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧