Java操作PDF:一键生成文件,插入文字、选项、签名及公章

使用word,制作一个模板

使用pdf编辑器,生成pdf模板。

我这里使用福昕pdf编辑器,其他pdf编辑器(如Adobe Acrobat)也可以用但是大多要钱。

1.从做好的word导入来创建pdf

2.插入文字域

右键文字域,填入字段与属性

3.插入选项域

导出值不要忘记填写,与代码对应上。

4.插入图片域,预插入签名和公章

注意:外观这里的边框和填充都选无色,否则图片会被填充色盖住;

注意:选项这里我们选择只显示标签。

5.模板做好了,我们进行保存。

java 实现

引入依赖
复制代码
<!-- pdf -->
<dependency>
 <groupId>com.itextpdf</groupId>
 <artifactId>itextpdf</artifactId>
 <version>5.5.13.2</version>
</dependency>
<!--中文字体-->
<dependency>
 <groupId>com.itextpdf</groupId>
 <artifactId>itext-asian</artifactId>
 <version>5.2.0</version>
</dependency>
<!--html xml 转为pdf-->
<dependency>
 <groupId>com.itextpdf.tool</groupId>
 <artifactId>xmlworker</artifactId>
 <version>5.5.11</version>
</dependency>
代码实现
复制代码
package com.tencent.qcloud.roomservice.webrtc.utils;

import com.alibaba.fastjson.JSONObject;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Map;

/**
 * @author dume
 * @ClassName PdfTest
 * @description: pdf模板操作
 * @date 2024年07月26日
 * @version: 1.0
 */
public class PdfTest {

    public static void main(String[] args) {
        //测试执行
        FillTemplate(
                "C:\\test\\申请表.pdf",
                "C:\\test\\新申请表.pdf",
                "杜小七",
                "辽宁大连",
                "跑步",
                "Yes",
                "Yes",
                "Yes",
                "C:\\test\\电子签名.png",
                "C:\\test\\公章.png"
        );
    }

    /**
     * 根据模板生成pdf
     * @param sourcesPath 原文件路径
     * @param targetPath  生成文件路径
     * @param name     参数
     * @param address  参数
     * @param hobby    参数
     * @param select_1  选项
     * @param select_2  选项
     * @param select_3  选项
     * @param signPath  签名图片路径
     * @param gongzhangPath  公章图片路径
     */
    public static void FillTemplate(
            String sourcesPath,
            String targetPath,
            String name,
            String address,
            String hobby,
            String select_1,
            String select_2,
            String select_3,
            String signPath,
            String gongzhangPath
            ){

        //设置参数
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("name",name);
        jsonObject.put("address",address);
        jsonObject.put("hobby",hobby);
        jsonObject.put("select_1",select_1);
        jsonObject.put("select_2",select_2);
        jsonObject.put("select_3",select_3);
        // 填充创建pdf
        PdfReader reader = null;
        PdfStamper stamp = null;
        ByteArrayOutputStream baos =null;
        try {
            reader = new PdfReader( sourcesPath);
            File deskFile = new File(targetPath);
            stamp = new PdfStamper(reader, new FileOutputStream(deskFile));
            // 取出报表模板中的所有字段
            AcroFields form = stamp.getAcroFields();
            System.out.println(form.getFields().keySet());


            //设置宋体
            BaseFont song =BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            if (jsonObject != null) {
                for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
                    String key = entry.getKey();
                    String value = entry.getValue().toString();
                    //保存选项
                    if (key.startsWith("select")) {
                        form.setField(key, value, true);
                    //保存文字
                    }else {
                        form.setFieldProperty(key, "textfont", song, null);
                        form.setField(key, value);
                    }
                }
            }

            //插入签名
            insertImage(form,stamp,"sign",signPath);
            //插入公章
            insertImage(form,stamp,"gongzhang",gongzhangPath);
            //保存修改
            stamp.setFormFlattening(true);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (stamp != null) {
                try{
                    stamp.close();
                }catch (Exception e){
                    e.printStackTrace();
                }

            }
            if (reader != null) {
                try{
                    reader.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
            if (baos != null) {
                try{
                    baos.close();
                }catch (Exception e){
                    e.printStackTrace();
                }

            }
        }

    }

    /**
     * pdf模板插入图片
     * @param form
     * @param stamper
     * @param filedName
     * @param url
     * @return
     */
    public  static boolean insertImage(AcroFields form, PdfStamper stamper, String filedName, String url) {
        try {
            int pageNo = form.getFieldPositions(filedName).get(0).page;
            Rectangle signRect = form.getFieldPositions(filedName).get(0).position;
            float x = signRect.getLeft();
            float y = signRect.getBottom();

            Image image = Image.getInstance(url);
            // 获取操作的页面
            PdfContentByte under = stamper.getOverContent(pageNo);
            // 根据域的大小缩放图片
            image.scaleToFit(signRect.getWidth(), signRect.getHeight());
            // 添加图片
            image.setAbsolutePosition(x, y);
            under.addImage(image);
        }catch (Exception e){
            return false;
        }
        return true;
    }
}

执行测试

作者:小七蒙恩

来源:https://blog.csdn.net/qq_38105536

详解Java操作PDF:一键生成文件,插入文字、选项、签名及公章

相关推荐
阿幸软件杂货间1 分钟前
免费万能电子书格式转换器!Neat Converter支持 ePub、Azw3、Mobi、Doc、PDF、TXT 文件的相互转换。
pdf·格式转换
星马梦缘9 小时前
CSDN转PDF【无水印且免费!!!】
pdf·免费·pandoc·转pdf·无水印·csdn转pdf·wkhtmlpdf
画月的亮9 小时前
前端处理导出PDF。Vue导出pdf
前端·vue.js·pdf
伊织code1 天前
pdfminer.six
python·pdf·图片·提取·文本·pdfminer·pdfminer.six
HAPPY酷1 天前
给纯小白的Python操作 PDF 笔记
开发语言·python·pdf
代码AI弗森2 天前
PDF OCR + 大模型:让文档理解不止停留在识字
pdf·ocr
小周同学:3 天前
在 Vue2 中使用 pdf.js + pdf-lib 实现 PDF 预览、手写签名、文字批注与高保真导出
开发语言·前端·javascript·vue.js·pdf
Kyln.Wu3 天前
【python实用小脚本-187】Python一键批量改PDF文字:拖进来秒出新文件——再也不用Acrobat来回导
python·pdf·c#
迪尔~5 天前
Apache POI中通过WorkBook写入图片后出现导出PDF文件时在不同页重复写入该图片问题,如何在通过sheet获取绘图对象清除该图片
java·pdf·excel
忆~遂愿5 天前
Python实战教程:PDF文档自动化编辑与图表绘制全攻略
python·pdf·自动化