Java操作PDF文件实现签订电子合同详细教程

2025-01-19 04:50

本文主要是介绍Java操作PDF文件实现签订电子合同详细教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Java操作PDF文件实现签订电子合同详细教程》:本文主要介绍如何在PDF中加入电子签章与电子签名的过程,包括编写Word文件、生成PDF、为PDF格式做表单、为表单赋值、生成文档以及上传到OB...

前言:

前两天领导提出需求要在pdf中加入电子签章与电子签名,然后自己查找了一些资料完成了,今天有时间正好分享一下,希望可以帮助到大家

先看效果:

Java操作PDF文件实现签订电子合同详细教程

1.编写word文件

1.1先将模板编写出来(可以根据自己的需求编写)我这里是测试demo

Java操作PDF文件实现签订电子合同详细教程

1.2然后生成PDF格式进行保存

Java操作PDF文件实现签订电子合同详细教程

1.3我这里是将文件保存到本地后上传到华为云的OBS中,在本地也可以操作,我只是为了方便保存到数据库中,可以根据自己的业务逻辑处理,效果雷同

注:这里上传是在第二步完成后在操作

Java操作PDF文件实现签订电子合同详细教程

Java操作PDF文件实现签订电子合同详细教程

2.为PDF格式做表单

2.1然后将刚刚生成的pdf用PDF编辑器打开

注:我这里使用的是(万兴PDF)可以去找免费的使用

打开后找到表单:

Java操作PDF文件实现签订电子合同详细教程

文字部分:

点击文本字段,然后和截图一样吧自己需要添加文字的地方圈出来

Java操作PDF文件实现签订电子合同详细教程

然后在属性中设置名称(后面代码操作会用到)

Java操作PDF文件实现签订电子合同详细教程

2.2图片表单

然后在添加图片表单,操作和文字一样,吧需要放图片的地方圈出来命名

Java操作PDF文件实现签订电子合同详细教程

这里需要注意的就是(外观设置无颜色,不然后面生成出来会有边框,特别丑)

Java操作PDF文件实现签订电子合同详细教程

然后在选项中选为仅标签(这样公章就可以变的透明,可以根据自己的业务逻辑调整)

Java操作PDF文件实现签订电子合同详细教程

操作完成后保存

3.为表单赋值

public class PdfTest {

    public static void main(String[] args) {
        String fileName = "电子合同";
        // 获取当前时间
        Date currentDate = new Date();
        // 创建一个SimpleDateFormat对象,指定日期格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        // 格式化当前时间
        String formattedDate = sdf.format(currentDate);
        //获取当前日期一年后的日期
        String formattedDate2 = sdf.format(new Date(currentDate.getTime() + 365L * 24 * 60 * 60 * 1000));
        System.err.println(formattedDate+"-"+formattedDate2);
        //测试执行
        FillTemplate(
                "刚刚添加表单保存的pdf文件的路径",
                "保存生成的pdf文件的路径",
                "XXX有限公司",
                "张三丰",
                "浙江宁波海曙区红星大厦1706号",
                "李四",
                "18888888888",
                "dawdawd@163.com",
                formattedDate+"至"+formattedDate2,
                formattedDate,
                "签名图片的路径",
                "盖章的路径"
        );
    }
// 下面的参数就是表单中的名称,需要对应上不然找不到(需要注意大小写)
    public static void FillTemplate(
            String sourcesPath,
            String targetPath,
            String name,
            String fr,
            String address,
            String phoneName,
            String phone,
            String wx,
            String data,
            String newData,
            String signPath,
            String gongzhangPath
    ){

        //设置参数
        jsONObject jsonObject = new JSONObject();
        jsonObject.put("name",name);
        jsonObject.put("fr",fr);
        jsonObject.put("address",address);
        jsonObject.put("phoneName",phoneName);
        jsonObject.put("phone",phone);
        jsonObject.put("wx",wx);
        jsonObject.put("data",data);
        jsonObject.put("newData",newData);
        // 填充创建pdf
        PdfReader reader = null;
        PdfStamper stamp = null;
        ByteArrayOutputStream baos =www.chinasem.cnnull;
        try {
            reader = new PdfReader( sourcesPath);
            File deskFile = new File(targetPath);
            stamp = new PdfStamper(reader, new FileOutputStream(deskFile));
            // 取出报表模板中的所有字段
            AcroFields form = stamp.getAcroFields();
            System.err.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{
                    readChina编程er.close()android;
                }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);
            phpunder.addImage(image);
        }catch (Exception e){
            return false;
        }
        return true;
    }
}

4.生成文档

然后执行后在保存生成的pdf文件的路径中找到文件:

Java操作PDF文件实现签订电子合同详细教程

点击查看:

效果图:

Java操作PDF文件实现签订电子合同详细教程

5.上传到OBS中

需要保存到数据库中的上传到OSS和OBS中都可以。。。

总结

到此这篇关于Java操作PDF文件实现签订电子合同的文章就介绍到这了,更多相关Java实现签订电子合同内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Java操作PDF文件实现签订电子合同详细教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153126

相关文章

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

python中各种常见文件的读写操作与类型转换详细指南

《python中各种常见文件的读写操作与类型转换详细指南》这篇文章主要为大家详细介绍了python中各种常见文件(txt,xls,csv,sql,二进制文件)的读写操作与类型转换,感兴趣的小伙伴可以跟... 目录1.文件txt读写标准用法1.1写入文件1.2读取文件2. 二进制文件读取3. 大文件读取3.1

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

基于Python实现读取嵌套压缩包下文件的方法

《基于Python实现读取嵌套压缩包下文件的方法》工作中遇到的问题,需要用Python实现嵌套压缩包下文件读取,本文给大家介绍了详细的解决方法,并有相关的代码示例供大家参考,需要的朋友可以参考下... 目录思路完整代码代码优化思路打开外层zip压缩包并遍历文件:使用with zipfile.ZipFil

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

SpringBoot中配置Redis连接池的完整指南

《SpringBoot中配置Redis连接池的完整指南》这篇文章主要为大家详细介绍了SpringBoot中配置Redis连接池的完整指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以... 目录一、添加依赖二、配置 Redis 连接池三、测试 Redis 操作四、完整示例代码(一)pom.

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思