Java读取pdf模板,并动态生成pdf文件,如动态生成准考证、学位证书等

Java读取pdf模板,并动态生成pdf文件,如动态生成准考证

​ 前几天遇到了一个生成准考证的需求,并提供用户下载,然后百度了一圈还是觉得使用itextpdf这个框架好用点。但是还需要找到一个能创建pdf表单的工具来生成pdf模板。可以使用Adobe Acrobat进行创建,但是我自己电脑上刚好有一个软件可以制作就没有去下载了😆

​ 下面只是用到了itextpdf一部分的功能,如果还有其他字体格式、样式的需求可以参考他的官方网址Overview (iText 5.5.13 API) (itextpdf.com)

1. 模板制作

我是用的是一款pj软件PDFelement,当初下它是用来转换pdf到word,没想到也可以制作pdf表单😀

在这里插入图片描述

可能有点看不清楚框框里写的啥,就是写的后端实体类中属性的名称,dddd最好一一对应嘛

2. 效果展示

还可以吧,此准考证模板地址:https://download.csdn.net/download/SleepNot_Need/87576794
在这里插入图片描述

3. 导入依赖

在pom.xml里导入下面两个依赖就行了

        <!--pdf-->
        <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
        <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>

4. 数据填充

public class PdfTest {
    public static void main(String[] args) {
        // 模板地址
        String tempPath = "D:\\test\\ticketPdfTemplate.pdf";
        // 生成pdf后的保存地址
        String outTempPath = "D:\\test\\ticketPdf.pdf";
        File old = new File(outTempPath);
        if (old.exists()){
            old.delete();
        }

        PdfReader reader;
        FileOutputStream out;
        ByteArrayOutputStream bos;
        PdfStamper pdfStamper;

        try {
            // 查询准考证数据
            ScpStudentAdmissionTicket ticket = this.baseMapper.selectById(id);

            // 读取pdf模板
            reader = new PdfReader(tempPath);
            // 将填充完成后的pdf输出到指定位置
            out = new FileOutputStream(outTempPath);
            bos = new ByteArrayOutputStream();
            pdfStamper = new PdfStamper(reader, bos);

            // 获取到表单集合
            AcroFields acroFields = pdfStamper.getAcroFields();
            // 加载字体
            BaseFont font = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            // 设置写入字体
            acroFields.addSubstitutionFont(font);

            // 设置文本信息
            acroFields.setField("activityName", ticket.getActivityName());
            acroFields.setField("studentName", ticket.getStudentName());
            acroFields.setField("admissionNumber", ticket.getAdmissionNumber());
            acroFields.setField("idCard", ticket.getIdCard());
            acroFields.setField("examination", ticket.getExamination());
            LocalDateTime examBeginTime = ticket.getExamBeginTime();
            LocalDateTime examEndTime = ticket.getExamEndTime();
            String time = examBeginTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日 "))
                    + examBeginTime.format(DateTimeFormatter.ofPattern("HH:mm"))
                    + " - "
                    + examEndTime.format(DateTimeFormatter.ofPattern("HH:mm"));
            acroFields.setField("examinationTime", time);

            // 设置图片
            String url = ticket.getUrl();
            // 根据地址读取需要放入pdf中的图片
            Image image = Image.getInstance(url);

            // 设置图片在哪一页
            PdfContentByte overContent = pdfStamper.getOverContent(acroFields.getFieldPositions("image").get(0).page);
            // 获取模板中图片域的大小
            Rectangle signRect = acroFields.getFieldPositions("image").get(0).position;
            float x = signRect.getLeft();
            float y = signRect.getBottom();
            // 图片等比缩放
            image.scaleAbsolute(signRect.getWidth(), signRect.getHeight());
            // 图片位置
            image.setAbsolutePosition(x, y);
            // 在该页加入图片
            overContent.addImage(image);

            // 如果为false那么生成的PDF文件还能编辑,一定要设为true
            pdfStamper.setFormFlattening(true);
            pdfStamper.close();
            Document doc = new Document();
            PdfCopy copy= new PdfCopy(doc, out);
            doc.open();
            PdfImportedPage importedPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
            copy.addPage(importedPage);
            doc.close();
        } catch (IOException | DocumentException e) {
            e.printStackTrace();
        }
    }
}

这里贴出来查询出来的准考证数据

{
“idCard”:“110101199003075939”,
“examEndTime”:“2021-01-01 09:00:00”,
“examBeginTime”:“2021-01-01 01:00:00”,
“examination”:“清华大学”,
“id”:“1428543333891039233”,
“activityName”:“物理竞赛”,
“admissionNumber”:“20210102”,
“studentName”:“学生姓名”,
“url”:“http://localhost/image/20210818/89fca5330db5bd2c6141d9b69973f062.png”
}

  • 1
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值