Java操作PDF文件實現(xiàn)簽訂電子合同詳細教程
前言:
前兩天領導提出需求要在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)延遲任務代碼實例,DelayQueue?是一個支持延時獲取元素的阻塞隊列,?內(nèi)部采用優(yōu)先隊列?PriorityQueue?存儲元素,同時元素必須實現(xiàn)?Delayed?接口,需要的朋友可以參考下2023-12-12
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),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06
Java 實戰(zhàn)項目之疫情防控管理系統(tǒng)詳解
讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實現(xiàn)一個疫情防控管理系統(tǒng),大家可以在過程中查缺補漏,提升水平2021-11-11
java開發(fā)RocketMQ生產(chǎn)者高可用示例詳解
這篇文章主要為大家介紹了java開發(fā)RocketMQ生產(chǎn)者高可用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08
SpringBoot 數(shù)據(jù)存儲實戰(zhàn)指南
Elasticsearch是一個基于Apache Lucene開發(fā)的的搜索服務,提供了一個分布式多用戶能力的全文搜索引擎,本文介紹如何在SpringBoot項目中整合ElasticSearch來完成數(shù)據(jù)的存儲,感興趣的朋友跟隨小編一起看看吧2026-03-03
java?io文件操作從文件讀取數(shù)據(jù)的六種方法
這篇文章主要為大家介紹了java?io操作總結從文件讀取數(shù)據(jù)的六種方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2022-03-03

