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:一键生成文件,插入文字、选项、签名及公章

相关推荐
SpaceAIGlobal1 天前
AI PPT生成工具哪些支持PDF文档导入?
人工智能·ai·pdf·powerpoint·办公
Xxtaoaooo1 天前
极空间部署Stirling PDF:搭建自托管PDF工具箱并实现远程访问
pdf·cpolar·stirling pdf
SamChan901 天前
对比 4 种主流 PDF 文档解析方案:PyMuPDF vs pdfplumber vs Apache PDFBox vs 大模型 OCR
python·ai·pdf·ocr·apache·机器翻译
AI刀刀2 天前
Kimi 文档导出格式错乱、排版丢失、导出报错?AI 导出鸭一键智能适配,稳定输出规范 Word、PDF,高效解决各类导出难题
人工智能·pdf·word·ai导出鸭
Ai-_Man2 天前
豆包智能体把对话批量导出为Word或PDF的正确顺序
人工智能·ai·小程序·pdf·word
SamChan902 天前
FastAPI+Celery+Redis搭建企业级PDF翻译异步任务系统
redis·后端·python·pdf·wpf·fastapi
SamChan903 天前
用Playwright端到端测试PDF翻译功能:Web自动化测试实战
前端·python·ai·pdf·wpf
AI英德西牛仔3 天前
千问导出 pdf 颜色不一样怎么办,选用 AI 导出鸭优化格式转换,多维度剖析千问内容 PDF 变色各类成因
人工智能·ai·chatgpt·pdf·deepseek·ai导出鸭
赵广陆4 天前
企业实战:主体识别
langchain·pdf·langgraph
AI英德西牛仔4 天前
豆包导出 pdf 颜色不一样怎么办,选用 AI 导出鸭优化文档导出,结合行业白皮书数据解析色彩失真成因
人工智能·ai·chatgpt·pdf·deepseek·ai导出鸭