SpringBoot集成itextpdf实现根据模板动态生成PDF

 更新时间:2024年03月28日 10:32:46   作者:二进制诗人  
这篇文章主要为大家详细介绍了SpringBoot如何集成itextpdf实现根据模板动态生成PDF,文中的示例代码讲解详细,需要的小伙伴可以参考一下

需求说明

根据合同模板,将动态的合同标签,合同方以及合同签约时间等动态的生成PDF,供用户下载打印。

前期准备

安装 Adobe Acrobat DC

链接:https://pan.baidu.com/s/1T8wTCkxn0YcHjxZQ8G6WeQ

提取码:j6b9

Spring Boot 集成

添加依赖

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.9</version>
            <scope>compile</scope>
        </dependency>
        <!--中文问题解决-->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>       

构建工具类

public class PDFUtils {
    private static final Logger log = LoggerFactory.getLogger(PDFUtils.class);

    /**
     * 根据pdf模板输出流
     * @param templateFileName 模板文件名
     * @param resultMap 包含文件字段名和值的map
     * @return 生成的文件字节流
     */
    public static ByteArrayOutputStream createPdfStream(String templateFileName,
                                                        Map<String, String> resultMap){

        ByteArrayOutputStream ba = new ByteArrayOutputStream();
        PdfStamper stamp =null;
        PdfReader reader = null;
        try {


            reader = new PdfReader(templateFileName);
            stamp = new PdfStamper(reader, ba);

            //使用字体
            BaseFont bf = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            /* 获取模版中的字段 */
            AcroFields form = stamp.getAcroFields();

            //填充表单
            if (resultMap != null) {
                for (Map.Entry<String, String> entry : resultMap.entrySet()) {

                    form.setFieldProperty(entry.getKey(), "textfont", bf, null);
                    form.setField(entry.getKey(), entry.getValue()!=null?entry.getValue():"");
                }
            }
            //不能编辑
            stamp.setFormFlattening(true);

        } catch (IOException e) {
            log.error("文档构建I/O异常",e);
        } catch (DocumentException e) {
            log.error("文档构建异常",e);
        }
        finally {
            if(stamp!=null){
                try {
                    stamp.close();
                } catch (DocumentException e) {
                    log.error("流关闭错误",e);
                } catch (IOException e) {
                    log.error("流关闭错误",e);
                }
            }
            if(reader!=null){
                reader.close();
            }
        }
        return ba;
    }
}

构建MultipartFile

方便之后上传OSS返回url

public UploadFileModel createUrl(String filePath, ByteArrayOutputStream byteArrayOutputStream) throws URISyntaxException {
        try{

            byte[] pdfBytes = byteArrayOutputStream.toByteArray();
            MultipartFile multipartFile = new MockMultipartFile(
                    "file",
                    filePath,
                    "application/pdf",
                    pdfBytes
            );

            return uploadFileUtil.upload(multipartFile);
        } catch (Exception e) {
            log.error("创建Url时出错:" + e.getMessage());
        }
        return null;
    }

编辑PDF模板

Java代码设置对应form的key-value

pdf模板放在springboot 项目目录resources/static 目录下

 public String createContract(CreateContractRequest request) {
        HashMap<String, String> map = new HashMap<>();
        map.put("companyName",request.getCompanyName());
        map.put("phone",request.getPhone());
        UploadFileModel url = null;
        ByteArrayOutputStream pdfStream = PDFUtils.createPdfStream(UserApplication.class.getResource("/").getPath() + "static/contract.pdf", map);
        try {
            url = createUrl("合同.pdf", pdfStream);
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
        return url.getUrl();
    }

到此这篇关于SpringBoot集成itextpdf实现根据模板动态生成PDF的文章就介绍到这了,更多相关SpringBoot itextpdf生成PDF内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于JAVA每月运势api调用代码实例

    基于JAVA每月运势api调用代码实例

    这篇文章主要为大家详细介绍了JAVA每月运势api调用代码实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • java获取linux服务器上的IP操作

    java获取linux服务器上的IP操作

    这篇文章主要介绍了java获取linux服务器上的IP操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • springboot3+r2dbc响应式编程实践

    springboot3+r2dbc响应式编程实践

    本文主要介绍了springboot3+r2dbc响应式编程实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Java详解Swing中的几种常用按钮的使用

    Java详解Swing中的几种常用按钮的使用

    这篇文章主要介绍了怎么用Java来创建和使用Swing中的几种常用按钮,按钮是我们经常要用的工具,但是你有想过自己怎么去实现它吗,感兴趣的朋友跟随文章往下看看吧
    2022-04-04
  • 基于Java解析国密数字证书的操作方法

    基于Java解析国密数字证书的操作方法

    在Java环境中解析使用国密算法(如SM3WITHSM2)的数字证书可能遇到挑战,使用BouncyCastle加密库可以解决Java标准库无法识别国密算法椭圆曲线的问题,成功解析国密数字证书,添加BouncyCastle依赖并修改代码,使其支持国密算法,即可解析采用SM3WITHSM2算法的数字证书
    2024-09-09
  • 配置了jdk的环境idea却提示找不到jdk解决办法

    配置了jdk的环境idea却提示找不到jdk解决办法

    在使用Java编程语言进行开发时,IDEA是一个非常流行和强大的集成开发环境,这篇文章主要给大家介绍了关于配置了jdk的环境idea却提示找不到jdk的解决办法,需要的朋友可以参考下
    2023-12-12
  • Springboot动态切换数据源的具体实现与原理分析

    Springboot动态切换数据源的具体实现与原理分析

    目前有个需求,需要使用不同的数据源,例如某业务要用A数据源,另一个业务要用B数据源,所以下面这篇文章主要给大家介绍了关于Springboot动态切换数据源的具体实现与原理分析,需要的朋友可以参考下
    2021-12-12
  • java 随机生成6位短信验证码实例代码

    java 随机生成6位短信验证码实例代码

    这篇文章主要介绍了java 随机生成6位短信验证码的实例代码,文中给大家扩展介绍了java随机生成四位数字验证码的方法,需要的朋友可以参考下
    2019-12-12
  • 轻松掌握Java模板模式

    轻松掌握Java模板模式

    这篇文章主要帮助大家轻松掌握Java模板模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • sharding-jdbc中的事务详细解读

    sharding-jdbc中的事务详细解读

    这篇文章主要介绍了sharding-jdbc中的事务详细解读,sharding-jdbc在分库分表方面提供了很大的便利性,在使用DB的时候,通常都会涉及到事务这个概念,而在分库分表的环境上再加上事务,就会使事情变得复杂起来,需要的朋友可以参考下
    2023-12-12

最新评论