最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java操作PDF文件實現(xiàn)簽訂電子合同詳細教程

 更新時間:2025年01月18日 11:16:52   作者:鏟子Zzz  
這篇文章主要介紹了如何在PDF中加入電子簽章與電子簽名的過程,包括編寫Word文件、生成PDF、為PDF格式做表單、為表單賦值、生成文檔以及上傳到OBS中的步驟,需要的朋友可以參考下

前言:

前兩天領導提出需求要在pdf中加入電子簽章與電子簽名,然后自己查找了一些資料完成了,今天有時間正好分享一下,希望可以幫助到大家

先看效果:

1.編寫word文件

1.1先將模板編寫出來(可以根據(jù)自己的需求編寫)我這里是測試demo

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

1.3我這里是將文件保存到本地后上傳到華為云的OBS中,在本地也可以操作,我只是為了方便保存到數(shù)據(jù)庫中,可以根據(jù)自己的業(yè)務邏輯處理,效果雷同

注:這里上傳是在第二步完成后在操作

2.為PDF格式做表單

2.1然后將剛剛生成的pdf用PDF編輯器打開

注:我這里使用的是(萬興PDF)可以去找免費的使用

打開后找到表單:

文字部分:

點擊文本字段,然后和截圖一樣吧自己需要添加文字的地方圈出來

然后在屬性中設置名稱(后面代碼操作會用到)

2.2圖片表單

然后在添加圖片表單,操作和文字一樣,吧需要放圖片的地方圈出來命名

這里需要注意的就是(外觀設置無顏色,不然后面生成出來會有邊框,特別丑)

然后在選項中選為僅標簽(這樣公章就可以變的透明,可以根據(jù)自己的業(yè)務邏輯調(diào)整)

操作完成后保存

3.為表單賦值

public class PdfTest {

    public static void main(String[] args) {
        String fileName = "電子合同";
        // 獲取當前時間
        Date currentDate = new Date();
        // 創(chuàng)建一個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);
        //測試執(zhí)行
        FillTemplate(
                "剛剛添加表單保存的pdf文件的路徑",
                "保存生成的pdf文件的路徑",
                "XXX有限公司",
                "張三豐",
                "浙江寧波海曙區(qū)紅星大廈1706號",
                "李四",
                "18888888888",
                "dawdawd@163.com",
                formattedDate+"至"+formattedDate2,
                formattedDate,
                "簽名圖片的路徑",
                "蓋章的路徑"
        );
    }
// 下面的參數(shù)就是表單中的名稱,需要對應上不然找不到(需要注意大小寫)
    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
    ){

        //設置參數(shù)
        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);
        // 填充創(chuàng)建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.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{
                    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);
            // 根據(jù)域的大小縮放圖片
            image.scaleToFit(signRect.getWidth(), signRect.getHeight());
            // 添加圖片
            image.setAbsolutePosition(x, y);
            under.addImage(image);
        }catch (Exception e){
            return false;
        }
        return true;
    }
}

4.生成文檔

然后執(zhí)行后在保存生成的pdf文件的路徑中找到文件:

點擊查看:

效果圖:

5.上傳到OBS中

需要保存到數(shù)據(jù)庫中的上傳到OSS和OBS中都可以。。。

總結

到此這篇關于Java操作PDF文件實現(xiàn)簽訂電子合同的文章就介紹到這了,更多相關Java實現(xiàn)簽訂電子合同內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java利用DelayQueue實現(xiàn)延遲任務代碼實例

    Java利用DelayQueue實現(xiàn)延遲任務代碼實例

    這篇文章主要介紹了Java利用DelayQueue實現(xiàn)延遲任務代碼實例,DelayQueue?是一個支持延時獲取元素的阻塞隊列,?內(nèi)部采用優(yōu)先隊列?PriorityQueue?存儲元素,同時元素必須實現(xiàn)?Delayed?接口,需要的朋友可以參考下
    2023-12-12
  • SpringBoot3.x中spring.factories?SPI?服務發(fā)現(xiàn)機制的改變問題小結

    SpringBoot3.x中spring.factories?SPI?服務發(fā)現(xiàn)機制的改變問題小結

    spring.factories其實是SpringBoot提供的SPI機制,底層實現(xiàn)是基于SpringFactoriesLoader檢索ClassLoader中所有jar引入的META-INF/spring.factories文件,這篇文章主要介紹了SpringBoot3.x中spring.factories?SPI?服務發(fā)現(xiàn)機制的改變,需要的朋友可以參考下
    2023-05-05
  • Idea中SpringBoot多模塊項目的建立實現(xiàn)

    Idea中SpringBoot多模塊項目的建立實現(xiàn)

    這篇文章主要介紹了Idea中SpringBoot多模塊項目的建立實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • Java 實戰(zhàn)項目之疫情防控管理系統(tǒng)詳解

    Java 實戰(zhàn)項目之疫情防控管理系統(tǒng)詳解

    讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實現(xiàn)一個疫情防控管理系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2021-11-11
  • Java編程中使用throw關鍵字拋出異常的用法簡介

    Java編程中使用throw關鍵字拋出異常的用法簡介

    這篇文章主要介紹了Java編程中使用throw關鍵字拋出異常的用法,是Java入門學習中的基礎知識,需要的朋友可以參考下
    2015-11-11
  • java開發(fā)RocketMQ生產(chǎn)者高可用示例詳解

    java開發(fā)RocketMQ生產(chǎn)者高可用示例詳解

    這篇文章主要為大家介紹了java開發(fā)RocketMQ生產(chǎn)者高可用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Java泛型實現(xiàn)類型安全的通用類型轉換器

    Java泛型實現(xiàn)類型安全的通用類型轉換器

    在開發(fā)中,我們常常需要在不同類型之間進行轉換,為了提高代碼的可讀性與安全性,Java的泛型機制提供了強大的類型檢查能力,下面我們就來看看如何通過泛型實現(xiàn)類型安全的通用轉換器
    2024-11-11
  • SpringBoot 數(shù)據(jù)存儲實戰(zhàn)指南

    SpringBoot 數(shù)據(jù)存儲實戰(zhàn)指南

    Elasticsearch是一個基于Apache Lucene開發(fā)的的搜索服務,提供了一個分布式多用戶能力的全文搜索引擎,本文介紹如何在SpringBoot項目中整合ElasticSearch來完成數(shù)據(jù)的存儲,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • java開發(fā)Dubbo負載均衡與集群容錯示例詳解

    java開發(fā)Dubbo負載均衡與集群容錯示例詳解

    這篇文章主要為大家介紹了java開發(fā)Dubbo負載均衡與集群容錯示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • java?io文件操作從文件讀取數(shù)據(jù)的六種方法

    java?io文件操作從文件讀取數(shù)據(jù)的六種方法

    這篇文章主要為大家介紹了java?io操作總結從文件讀取數(shù)據(jù)的六種方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-03-03

最新評論

万全县| 峨边| 敖汉旗| 施甸县| 民勤县| 南通市| 石泉县| 开阳县| 长宁区| 屏山县| 宁国市| 锦州市| 新密市| 察雅县| 定南县| 张掖市| 北京市| 清水县| 库尔勒市| 喜德县| 通辽市| 永年县| 油尖旺区| 和顺县| 繁昌县| 同心县| 化隆| 本溪市| 石嘴山市| 舟曲县| 乌鲁木齐市| 宜良县| 洛浦县| 大丰市| 确山县| 台湾省| 安新县| 黎平县| 陆丰市| 江西省| 新宾|