前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >根据 PDF 模板产生各种电子订单

根据 PDF 模板产生各种电子订单

作者头像
BUG弄潮儿
发布2021-12-01 20:38:27
7970
发布2021-12-01 20:38:27
举报
文章被收录于专栏:JAVA乐园

在网上找了份委托申请书的 word 文档,首先将其转成 pdf

然后使用 Adobe Acrobat 软件打开,然后创建一个表单,打开 acrobat, 点击工具,点击准备表单

然后选择刚准备好的 pdf 文档

点击下面的图标添加文本框表单,并给这个输入框写上一个变量名

把需要填上内容的地方一 一的都放上表单,弄好之后。如下图

最后保存,这样就产生了一个 PDF 模板文件。

引入依赖

代码语言:javascript
复制
<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>

工具类

代码语言:javascript
复制
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

public class PDFUtil {

    /**
     * @param templatePath pdf模板文件地址
     * @param targetPath   生成的pdf文件地址
     * @param formMap      pdf中要插入的内容
     * @param imagePathMap pdf中要插入的图片地址
     */
    public static void generatorPdf(String templatePath, String targetPath, Map<String, String> formMap, Map<String, String> imagePathMap) {
        try (InputStream input = new FileInputStream(templatePath)) {
            PdfReader reader = new PdfReader(input);
            PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(targetPath));
            stamper.setFormFlattening(true); // 让pdf不可在编辑
            // 提取pdf中的表单
            AcroFields form = stamper.getAcroFields();
            for (String key : formMap.keySet()) {
                form.setField(key, formMap.get(key));
            }

            for (String key : imagePathMap.keySet()) {
                // 通过域名获取所在页和坐标,左下角为起点
                List<AcroFields.FieldPosition> imageFieldPositions = form.getFieldPositions(key);
                int pageNo = imageFieldPositions.get(0).page;
                Rectangle rect = imageFieldPositions.get(0).position;
                // 读图片
                Image image = Image.getInstance(imagePathMap.get(key));
                // 根据域的大小缩放图片
                image.scaleToFit(rect.getWidth(), rect.getHeight());
                image.setAbsolutePosition(rect.getLeft(), rect.getBottom());
                // 获取操作的页面
                PdfContentByte canvas = stamper.getOverContent(pageNo);
                canvas.addImage(image);
            }

            stamper.close();
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

验证

代码语言:javascript
复制
public static void main(String[] args) {
    Map<String, String> formMap = new HashMap<>();
    formMap.put("name", "张三");
    formMap.put("name2", "李四");
    formMap.put("id_card", "987654321987654321");
    formMap.put("id_card2", "123456789123456789");
    formMap.put("year", "2021");
    formMap.put("month", "02");
    formMap.put("day", "25");
    Map<String, String> imagePathMap = new HashMap<>();
    imagePathMap.put("image", "D:\\sign.jpg");
    PDFUtil.generatorPdf(
        "d:\\test_template.pdf",
        "d:\\new.pdf",
        formMap,
        imagePathMap
    );
}

准备一张手写的签名图片

运行程序

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 BUG弄潮儿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档