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

这篇具有很好参考价值的文章主要介绍了java集成itextpdf实现通过pdf模板填充数据生成pdf。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、制作pdf模板

1.1、使用excel制作一个表格

java填充pdf表单,java,pdf

1.2、转成pdf

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

java填充pdf表单,java,pdf

1.3、设置表单域

java填充pdf表单,java,pdf

1.4、最终模版效果

java填充pdf表单,java,pdf

二、引入POM依赖

<!--pdf处理-->
 <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>

三、代码实现

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

java填充pdf表单,java,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;

/**
 * pdf相关工具类
 * 注意事项:
 * 1、时间类型需要转成字符串
 * 2、只支持对象嵌对象,两层结构;对象嵌对象再嵌对象,第三层对象无法解析,如果遇到这种情况需要写成递归或解析第三次。
 *
 * @author zero
 */
@Slf4j
public class PdfUtil {

    private static boolean isPrimitiveOrWrapper(Class<?> clazz) {
        return clazz.isPrimitive() || clazz.getName().startsWith("java.lang");
    }

    private static Map<String, String> turnMap(Object object) {
        Map<String, Object> stringObjectMap = BeanUtil.beanToMap(object);
        Map<String, String> map = new HashMap<>(stringObjectMap.size() * 2);
        // 打印输出属性名称和属性值
        for (Map.Entry<String, Object> 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<Object> list = (List) value;
                        for (int i = 0; i < list.size(); i++) {
                            Object o = list.get(i);
                            Map<String, Object> stringObjectMap1 = BeanUtil.beanToMap(o);
                            for (Map.Entry<String, Object> entry1 : stringObjectMap1.entrySet()) {
                                String key1 = entry1.getKey();
                                Object value1 = entry1.getValue();
                                map.put(StrUtil.format("{}.{}{}", key, key1, i), String.valueOf(value1));
                            }
                        }
                    } else {
                        Map<String, Object> stringObjectMap1 = BeanUtil.beanToMap(value);
                        for (Map.Entry<String, Object> 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<BaseFont> 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("操作异常请联系管理员!");
        }
    }

    /**
     * 填充数据
     *
     * @param fields
     * @param data
     * @throws IOException
     * @throws DocumentException
     */
    private static void fillData(AcroFields fields, Map<String, String> data) throws IOException, DocumentException {
        Map<String, AcroFields.Item> formFields = fields.getFields();
        for (String key : data.keySet()) {
            if (formFields.containsKey(key)) {
                String value = data.get(key);
                // 为字段赋值,注意字段名称是区分大小写的
                fields.setField(key, value);
            }
        }
    }

    /**
     * 写出文件
     *
     * @param request
     * @param response
     * @param fileName
     * @param deleteOnExit 是否需要删除本地文件
     */
    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;

/**
 * @author zero
 */
@Data
public class TestDto {
    private String name;
    private String birthday;
    private Other other;
    private List<Other> 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;

/**
 * 测试 控制层
 *
 * @author zero
 */
@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<TestDto.Other> 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为你的端口,访问结果如下:

java填充pdf表单,java,pdf文章来源地址https://www.toymoban.com/news/detail-604556.html

到了这里,关于java集成itextpdf实现通过pdf模板填充数据生成pdf的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Java使用itextpdf生成PDF文件

    iText是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF文档,而且可以将Html文件转化为PDF文件。 构造方法: 指定PDF的页面大小,页边距。 默认 Document()为:A4,36,36,36,36 属性信息: 添加文字段落: 添加空页面: 是否显示空白页: 设置页面边距 构造方法: ll

    2024年01月19日
    浏览(43)
  • Java导出PDF(itextpdf)-通俗易懂

    在java开发的过程中会遇到太多太多文档pdf导出,excle导出等业务场景,时隔三个月或半年来一次每一次遇到这样的业务场景对我都是非常痛苦的过程,本文旨在记录工具类使用方法和技术分享。 itextpdf是一个开源的Java库,用于创建和操作PDF文档。使用itextpdf,您可以创建新的

    2024年02月12日
    浏览(47)
  • itextpdf实现word模板生成文件

    使用word模板生成文件,如下图,将左侧的模板生成为右侧的填充word文档。 引入依赖 创建模板,创建一份template2.docx文件,内容如下 编写代码 编写测试用例,并执行测试用例 生成得到被填充出来的文件。

    2024年02月11日
    浏览(49)
  • java JFreeChart 绘制各种图形 并使用itextPdf生成PDF导出

    参考: https://blog.csdn.net/hfy1237/article/details/126693786 https://blog.csdn.net/qq_39149275/article/details/119381389

    2024年01月19日
    浏览(45)
  • Java 使用 poi 和 aspose 实现 word 模板数据写入并转换 pdf 增加水印

    本项目所有源码和依赖资源都在文章顶部链接,有需要可以下载使用 1. 需求描述 从指定位置读取一个 word 模板 获取业务数据并写入该 word 模板,生成新的 word 文档 将新生成的 word 文档转换为 pdf 格式 对 pdf 文档添加水印 2. 效果预览 word 模板 带水印的 pdf 文档 3. 实现思路

    2024年02月08日
    浏览(46)
  • Java Excel转PDF,支持xlsx和xls两种格式, itextpdf【即取即用】

    本篇主要为工具方法整理,参考学习其他博主文章做了整理,方便使用。 1、本地转换 导入依赖 创建工具方法 传入输入输出流或文档地址即可。 2、网络下载 通过POI或者easyExcel生成或填充,再由后端转换PDF响应前端 思路 :将网络下载拆分为本地转换,再响应前端即可。 现

    2024年02月04日
    浏览(45)
  • aspose-words、itextpdf完美解决java将word、excel、ppt、图片转换为pdf文件

    我是 傲骄鹿先生 ,沉淀、学习、分享、成长。 如果你觉得文章内容还可以的话,希望不吝您的「一键三连」,文章里面有不足的地方希望各位在评论区补充疑惑、见解以及面试中遇到的奇葩问法 面对日常开发过程中,将各种文件转换为pdf文件的问题,总是让人头疼,这次终

    2024年02月03日
    浏览(66)
  • 工具类——Java导出EXCEL2(设置样式、加载并填充图片、加载指定模板、大数据量设置窗口大小与刷新频率)

    书接上篇:工具类——Java 浏览器导入、导出Excel(Java import、export)demo POI的导出方式:创建/加载Workbook,设置样式,填充数据,然后生成本地临时文件,最终以浏览器的形式打开,完成整个导出动作。 demo如下, demo如下, XSSFClientAnchor anchor = new XSSFClientAnchor(int dx1, int dy1,

    2024年02月01日
    浏览(41)
  • Java导出Excel模板,导出数据到指定模板,通过模板导入数据(一)

    本文章主要是介绍阿里巴巴的easyexcel的使用 1. 首先需要我们导入easyexcel的依赖包 2. 前期工作准备 编写相关导出模板和导入模板。在项目的resources下创建文件夹,命名为excel 导出模板(此处仅做示例,字段根据自己项目来):  导入模板(导入时需要哪些字段根据自己项目业

    2024年02月03日
    浏览(46)
  • 【Java结合EasyExcel,模板文件填充并导出Excel】

    需求描述: 客户网页上填一个Excel表格,数据存到数据库,这个导出接口要做的就是从数据库中的获取数据并填充到模板文件,最后通过response返给前端一个下载链接,用户即可获取填充好的Excel文件。 方案一: 一开始使用的是easypoi,发现当填充一行数据时是OK的,但是如果

    2024年02月09日
    浏览(57)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包