Java-根据模板生成PDF

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


前言

在有些场景下我们可能需要根据指定的模板来生成 PDF,比如说合同、收据、发票等等。因为 PDF 是不可编辑的,所以用代码直接对 PDF 文件进行修改是很不方便的,这里我是通过 itextAdobe Acrobat 来实现的,以下就是具体实现方法。


一、准备模板

Adobe Acrobat 是由 Adobe 公司开发的一款 PDF(Portable Document Format,便携式文档格式)编辑软件。借助它,你可以以 PDF 格式制作和保存文档 ,以便于浏览和打印,或使用更高级的功能。

说白一点就是 Adobe Acrobat 可以让你的 PDF 文件编程可编辑文件,PDF 文件可编辑的话,使用代码去修改就会方便很多。

adobe 中文官网:https://www.adobe.com/cn/

Adobe Acrobat 中文官网:https://www.adobe.com/cn/acrobat.html

如果你之前没有使用过这个软件,可以在上面我提供的官网里面去下载

java生成pdf,日常积累,java,pdf,数据库

PS:不过这个软件是收费的,但是可以注册一个账号申请免费试用,然后按照提示去下载该软件,大概有一周左右的使用期限

下载完,打开该软件大概是这个样子的

java生成pdf,日常积累,java,pdf,数据库

软件有了之后就是准备模板,这里我以 劳动合同模板 为例:

java生成pdf,日常积累,java,pdf,数据库

以上一个为 PDF 的劳动合同模板,使用 Adobe Acrobat 软件中的 准备表单 工具将该 .pdf 文件导入进来

进入到 工具 栏,选择 准备表单,点击 打开

java生成pdf,日常积累,java,pdf,数据库

选择模板文件

java生成pdf,日常积累,java,pdf,数据库

再点击 开始

java生成pdf,日常积累,java,pdf,数据库

进来之后就可以对 PDF 文件进行编辑,那些需要填入的值的地方,可以 添加文本域,之后通过代码设置的值就会直接填入到文本域当中

java生成pdf,日常积累,java,pdf,数据库

双击文本域,可编辑文本域的信息

java生成pdf,日常积累,java,pdf,数据库

其中最重要的就是 名称,如果想要在这个位置上赋值的话,就需要绑定该名称,类似于给 Map 赋值需要知道 key 一样,虽然说在添加文本域的时候就会生成一个名称,但是还是建议最好自己取一个见名知意的名称。

模板各文本域名称和备注如下:

{
    "companyName":"用人单位名称",
    "legalPerson":"法人",
    "companyAddress":"用人单位地址",
    "companyPhone":"用人单位联系方式",
    "term":"合同期限",
    "startYear":"起始时间-年",
    "startMonth":"起始时间-月",
    "startDay":"起始时间-日",
    "endYear":"终止时间-年",
    "endMonth":"终止时间-月",
    "endDay":"终止时间-日",
    "probationPeriodStartYear":"试用期起始时间-年",
    "probationPeriodStartMonth":"试用期起始时间-月",
    "probationPeriodStartDay":"试用期起始时间-日",
    "probationPeriodEndYear":"试用期终止时间-年",
    "probationPeriodEndMonth":"试用期终止时间-月",
    "probationPeriodEndDay":"试用期终止时间-日",
    "probationPeriodTerm":"试用期期限",
    "post":"岗位",
    "salary":"薪资",
    "probationPeriodSalary":"试用期薪资",
    "salaryGrant":"薪资发放时间"
}

java生成pdf,日常积累,java,pdf,数据库

同时还能够设置其它一些属性,比如说字体大小、字体、对齐方式等等,这里我是把字体大小都设置为 10,字体设置为宋体,居中对齐

然后保存即可,再打开该 PDF 文件时,该文件就已成为可编辑文件了,模板到此准备完成

java生成pdf,日常积累,java,pdf,数据库


二、代码实现

导入 itext 相关的依赖:

        <!--itext-->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.4.2</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.13</version>
        </dependency>

接口编写:

java生成pdf,日常积累,java,pdf,数据库

PdfController.java

import com.mike.server.system.service.PdfService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@Slf4j
@RestController
@RequestMapping("/test")
@Api(tags = "【PDF-管理】")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@CrossOrigin(origins = "*", methods = {RequestMethod.POST, RequestMethod.GET})
public class PdfController {

    private final PdfService pdfService;

    @PostMapping(value = "/generate-pdf")
    @ApiOperation(value = "生成PDF", produces = "application/octet-stream")
    public void generatePdf(@RequestBody Map<String, String> params) {
        pdfService.generatePdf(params);
    }
}

PdfService.java

import java.util.Map;

public interface PdfService {

    void generatePdf(Map<String, String> params);
}

PdfServiceImpl.java

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 com.mike.common.core.utils.ServletUtils;
import com.mike.server.system.service.PdfService;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class PdfServiceImpl implements PdfService {

    private final HttpServletResponse response;

    @Override
    @SneakyThrows
    public void generatePdf(Map<String, String> params) {


        // 读取资源文件夹下的模板
        ClassPathResource resource = new ClassPathResource("pdf-template/简单劳动合同模板.pdf");
        InputStream inputStream = resource.getInputStream();

        /*
         * 或者通过 url 从网上下载 pdf 模板文件
         *
            // 获取文件地址
            String urlPath = "模板资源文件链接-url";
            // 下载文件
            URL url = new URL(urlPath);
            URLConnection connection = url.openConnection();
            // 设置请求超时时长为 5 秒
            connection.setConnectTimeout(5*1000);
            // 读取数据
            InputStream inputStream = connection.getInputStream();
         */

        PdfReader reader = null;
        ByteArrayOutputStream bos = null;
        try {
            reader = new PdfReader(inputStream);
            bos = new ByteArrayOutputStream();
            PdfStamper pdfStamper = new PdfStamper(reader, bos);
            AcroFields acroFields = pdfStamper.getAcroFields();

            // 中文字体
            BaseFont font = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);

            for (Map.Entry<String, String> param : params.entrySet()) {
                // 设置文本域的字体为中文字体
                acroFields.setFieldProperty(param.getKey(), "textfont", font,null);
                // 将 map 中的值写到 pdf 模板对应的文本域中
                acroFields.setField(param.getKey(), param.getValue());
            }

            // 如果为false那么生成的PDF文件还能编辑,所以一定要设为true
            pdfStamper.setFormFlattening(true);
            pdfStamper.close();
            // 返回文件
            ServletUtils.writeAttachment(response, "劳动合同.pdf", bos.toByteArray());
        } catch (IOException | DocumentException e) {
            e.printStackTrace();
        } finally {
            try {
                assert bos != null;
                bos.close();
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

ServletUtils.java 工具类部分代码:

import cn.hutool.core.io.IoUtil;
import org.springframework.http.MediaType;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;

/**
 * 客户端工具类
 *
 * @author system
 */
public class ServletUtils {

	...

	
    /**
     * 返回附件
     *
     * @param response 响应
     * @param filename 文件名
     * @param content  附件内容
     */
    public static void writeAttachment(HttpServletResponse response, String filename, byte[] content) throws IOException {
        // 设置 header 和 contentType
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
        // 输出附件
        IoUtil.write(response.getOutputStream(), false, content);
    }

	...

}

请求接口:

java生成pdf,日常积累,java,pdf,数据库
参数:

{
  "companyName": "xxxx科技有限公司",
  "legalPerson": "米大傻",
  "companyAddress": "广州xxxxxxx",
  "companyPhone": "18274563214",
  "term": "3",
  "startYear": "2023",
  "startMonth": "9",
  "startDay": "15",
  "endYear": "2026",
  "endMonth": "9",
  "endDay": "15",
  "probationPeriodStartYear": "2023",
  "probationPeriodStartMonth": "9",
  "probationPeriodStartDay": "15",
  "probationPeriodEndYear": "2023",
  "probationPeriodEndMonth": "11",
  "probationPeriodEndDay": "15",
  "probationPeriodTerm": "2",
  "post": "JAVA工程师",
  "salary": "23000",
  "probationPeriodSalary": "18000",
  "salaryGrant": "15"
}

效果:

java生成pdf,日常积累,java,pdf,数据库


三、源代码

------------------项目下载------------------
链接:百度网盘
提取码:ihyo
-------------------------------------------


总结

个人觉得代码实现起来不是很难,关键是要知道如何使用 Adobe Acrobat 工具设置 PDF 模板以及 itext 的一些 API 的使用,以后有时间我会出一篇关于 iText 的博客,主要介绍 iText 在日常开发中的主要应用。


itextpdf-接口文档:https://api.itextpdf.com/iText5/java/5.5.9/

itext 生成 PDF(一):https://blog.csdn.net/lcczpp/article/details/125424395

为何选择iText?java PDF开源库选择与iText发展历史:https://zhuanlan.zhihu.com/p/375700748

使用itext填充静态PDF模板,生成PDF新文件:https://www.cnblogs.com/hunter-space/p/static_pdf.html文章来源地址https://www.toymoban.com/news/detail-766019.html

到了这里,关于Java-根据模板生成PDF的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Java-模板生成PDF方式3-HtmlToPDF

    Java-模板生成PDF方式3-HtmlToPDF

    使用thymeleaf做html模板,由xhtmlrenderer/flying-saucer-pdf-openpdf将html转为PDF LGPL 和 MPL 许可 pom.xml引入依赖 yml增加配置 工具类转换 HTML模板 applying_for_volunteer_service_form_html.html 资源 字体 src/main/resources/fonts/simhei.ttf 源码地址 https://gitee.com/cocoxike/pdfdemo.git 效果图 问题 1.中文显示 方法中加

    2024年02月08日
    浏览(6)
  • Java 生成各种 PDF 实战方案(图片、模板、表格)

    Java 生成各种 PDF 实战方案(图片、模板、表格)

    本篇文章的重点还是在讲通过java生成pdf,其实如果是单纯的模板填充挺简单的,但是又要填充模板还要动态生成表格就比较麻烦了,因为如果在模板中画表格的框去生成的话,超过模板框的位置就会隐藏,我刚接到需求的时候也是有点难受,在网上也是找了大量的资料,研究

    2024年02月02日
    浏览(12)
  • java集成itextpdf实现通过pdf模板填充数据生成pdf

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

    我采用的是pdfelement 官网地址需要付费或者自行破解,也可以使用其他pdf编辑器。 将制作好的pdf模板放入项目resources/pdf目录下,如图 浏览器访问ip:port/test/pdf,其中ip为你的ip地址,port为你的端口,访问结果如下:

    2024年02月16日
    浏览(12)
  • 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日
    浏览(14)
  • 【Java】制作pdf模板使用后端程序填充字段生成pdf或者图片

    【Java】制作pdf模板使用后端程序填充字段生成pdf或者图片

    自行下载安装; 打开pdf文件,表单-添加或编辑域 添加文本域,调整大小,可以编辑域的名字,默认fill_1这种名字。域鼠标右键-属性,可以调整字体大小等样式,编辑好还可以锁定; 编辑好保存,这个pdf文件就可以当模板使用了; 防止中文乱码,需要在网上下载字体ttf文件

    2024年01月21日
    浏览(14)
  • 【导出Word】如何使用Java+Freemarker模板引擎,根据XML模板文件生成Word文档(只含文本内容的模板)

    【导出Word】如何使用Java+Freemarker模板引擎,根据XML模板文件生成Word文档(只含文本内容的模板)

    这篇文章,主要介绍如何使用Java+Freemarker模板引擎,根据XML模板文件生成Word文档。 目录 一、导出Word文档 1.1、基础知识 1.2、制作模板文件 1.3、代码实现 (1)引入依赖 (2)创建Freemarker工具类 (3)测试案例代码 (4)运行效果 Word文件有两种后缀格式,分别是:doc和docx,

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

    【PDFBox】PDFBox操作PDF文档之读取指定页面文本内容、读取所有页面文本内容、根据模板文件生成PDF文档

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

    2024年02月16日
    浏览(16)
  • Java使用ftl模板文件生成Word,以及Word转换图片或Pdf工具类

    Java使用ftl模板文件生成Word,以及Word转换图片或Pdf工具类

    一、写在前面 最近在项目中使用打印功能,发现这个功能我已经写过多次了,下面这个文章的发步日期在2020年,不得不感慨时间之快啊。 https://blog.csdn.net/weixin_43238452/article/details/109636200?spm=1001.2014.3001.5501 下面介绍一下应用场景:这次项目依旧是springboot项目,使用ftl模版生

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

    java根据模板导出word

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

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

    java根据excel模板进行导出数据

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

    2024年02月11日
    浏览(14)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包