首页 > 基础资料 博客日记
Java操作PDF文件,实现签订电子合同(详细教程)
2025-01-14 03:00:09基础资料围观153次
文章Java操作PDF文件,实现签订电子合同(详细教程)分享给大家,欢迎收藏Java资料网,专注分享技术知识
前言:前两天领导提出需求要在pdf中加入电子签章与电子签名,然后自己查找了一些资料完成了,今天有时间正好分享一下,希望可以帮助到大家
先看效果:
1.编写word文件
1.1先将模板编写出来(可以根据自己的需求编写)我这里是测试demo

1.2然后生成PDF格式进行保存
1.3我这里是将文件保存到本地后上传到华为云的OBS中,在本地也可以操作,我只是为了方便保存到数据库中,可以根据自己的业务逻辑处理,效果雷同
注:这里上传是在第二步完成后在操作
2.为PDF格式做表单
2.1然后将刚刚生成的pdf用PDF编辑器打开
注:我这里使用的是(万兴PDF)可以去找免费的使用
打开后找到表单:
文字部分:
点击文本字段,然后和截图一样吧自己需要添加文字的地方圈出来
然后在属性中设置名称(后面代码操作会用到)
2.2图片表单
然后在添加图片表单,操作和文字一样,吧需要放图片的地方圈出来命名
这里需要注意的就是(外观设置无颜色,不然后面生成出来会有边框,特别丑)
然后在选项中选为仅标签(这样公章就可以变的透明,可以根据自己的业务逻辑调整)
操作完成后保存
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 =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);
// 根据域的大小缩放图片
image.scaleToFit(signRect.getWidth(), signRect.getHeight());
// 添加图片
image.setAbsolutePosition(x, y);
under.addImage(image);
}catch (Exception e){
return false;
}
return true;
}
}
4.生成文档
然后执行后在保存生成的pdf文件的路径中找到文件:
点击查看:
效果图:
5.上传到OBS中
需要保存到数据库中的上传到OSS和OBS中都可以。。。。
本文到此结束,希望可以帮助到大家,有不懂的地方可以私信或评论问我,看到会及时回复(下期更新Java对接电子发票在APP中)
文章来源:https://blog.csdn.net/WXY888888888/article/details/142827258
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: