【开源了】撸了一个电子文件签字+合同系统,爽!

大家好,我是编程君


一、前言

今天公司领导提出一个功能,说实现一个文件的签字+盖章功能,然后自己进行了简单的学习,对文档进行数字签名与签署纸质文档的原因大致相同,数字签名通过使用计算机加密来验证 (身份验证:验证人员和产品所声明的身份是否属实的过程。例如,通过验证用于签名代码的数字签名来确认软件发行商的代码来源和完整性。)数字信息,如文档、电子邮件和宏。数字签名有助于确保:真实性,完整性,不可否认性。目前市面上的电子签章产品也是多样化,但是不管是哪个厂家的产品,在线签章简单易用,同时也能保证签章的有效性,防篡改,防伪造,稳定,可靠就是好产品。

此次开源的系统模拟演示了文件在OA系统中的流转,主要为办公系统跨平台在线处理Office文档提供了完美的解决方案。Word文档在线处理的核心环节,包括:起草文档、领导审批、核稿、领导盖章、正式发文。PageOffice产品支持PC端Word文档在线处理的所有环节;MobOffice产品支持了移动端领导审批和领导盖章的功能。支持PC端和移动端对文档审批和盖章的互认。然后此次博客中使用的卓正软件的电子签章采用自主知识产权的核心智能识别验证技术,确保文档安全可靠。采用 COM、ActiveX嵌入式技术开发,确保软件能够支持多种应用。遵循《中华人民共和国电子签名法》关于电子签名的规范,同时支持国际通用的 RSA算法,符合国家安全标准。

PageOffice和MobOffice产品结合使用为跨平台处理Office文件提供了完美的解决方案,主要功能有word在线编辑保存和留痕,word和pdf文件在线盖章(电子印章)。

二、项目

该签字+盖章流程系统使用了SpringBoot+thymeleaf实现的,然后jar包依赖使用了maven

ddd0dc0e4928055b38f62629d6ed5796.jpeg
  • 控制层

@Controller
@RequestMapping("/mobile")
public class MobileOfficeController {@Value("${docpath}")private  String docPath;@Value("${moblicpath}")private  String moblicpath;@AutowiredDocService m_docService;/*** 添加MobOffice的服务器端授权程序Servlet(必须)**/@RequestMapping("/opendoc")public void opendoc(HttpServletRequest request, HttpServletResponse response, HttpSession session,String type,String userName)throws  Exception {String fileName = "";userName= URLDecoder.decode(userName,"utf-8");Doc doc=m_docService.getDocById(1);if(type.equals("word")){fileName = doc.getDocName();}else{fileName = doc.getPdfName();}OpenModeType openModeType = OpenModeType.docNormalEdit;if (fileName.endsWith(".doc")) {openModeType = OpenModeType.docNormalEdit;} else if (fileName.endsWith(".pdf")) {String mode = request.getParameter("mode");if (mode.equals("normal")) {openModeType = OpenModeType.pdfNormal;} else {openModeType = OpenModeType.pdfReadOnly;}}MobOfficeCtrl mobCtrl = new MobOfficeCtrl(request,response);mobCtrl.setSysPath(moblicpath);mobCtrl.setServerPage("/mobserver.zz");//mobCtrl.setZoomSealServer("http://xxx.xxx.xxx.xxx:8080/ZoomSealEnt/enserver.zz");mobCtrl.setSaveFilePage("/mobile/savedoc?testid="+Math.random());mobCtrl.webOpen("file://"+docPath+fileName,  openModeType , userName);}@RequestMapping("/savedoc")public  void  savedoc(HttpServletRequest request,  HttpServletResponse response){FileSaver fs = new FileSaver(request, response);fs.saveToFile(docPath+fs.getFileName());fs.close();}
}
  • 项目业务层源码

@Service
public class DocServiceImpl implements DocService {@AutowiredDocMapper docMapper;@Overridepublic Doc getDocById(int id) throws Exception {Doc  doc=docMapper.getDocById(id);//如果doc为null的话,页面所有doc.属性都报错if(doc==null) {doc=new Doc();}return doc;}@Overridepublic Integer addDoc(Doc doc) throws Exception {int id=docMapper.addDoc(doc);return id;}@Overridepublic Integer updateStatusForDocById(Doc doc) throws Exception {int id=docMapper.updateStatusForDocById(doc);return id;}@Overridepublic Integer updateDocNameForDocById(Doc doc) throws Exception {int id=docMapper.updateDocNameForDocById(doc);return id;}@Overridepublic Integer updatePdfNameForDocById(Doc doc) throws Exception {int id=docMapper.updatePdfNameForDocById(doc);return id;}
}
  • 拷贝文件

public class CopyFileUtil {//拷贝文件public static boolean copyFile(String oldPath, String newPath) throws Exception {boolean copyStatus=false;int bytesum = 0;int byteread = 0;File oldfile = new File(oldPath);if (oldfile.exists()) { //文件存在时InputStream inStream = new FileInputStream(oldPath); //读入原文件FileOutputStream fs = new FileOutputStream(newPath);byte[] buffer = new byte[1444];int length;while ((byteread = inStream.read(buffer)) != -1) {bytesum += byteread; //字节数 文件大小//System.out.println(bytesum);fs.write(buffer, 0, byteread);}fs.close();inStream.close();copyStatus=true;}else{copyStatus=false;}return copyStatus;}
}
  • 二维码源码

public class QRCodeUtil {private String codeText;//二维码内容private BarcodeFormat barcodeFormat;//二维码类型private int width;//图片宽度private int height;//图片高度private String imageformat;//图片格式private int backColorRGB;//背景色,颜色RGB的数值既可以用十进制表示,也可以用十六进制表示private int codeColorRGB;//二维码颜色private ErrorCorrectionLevel errorCorrectionLevel;//二维码纠错能力private String encodeType;public QRCodeUtil() {codeText = "www.zhuozhengsoft.com";barcodeFormat = BarcodeFormat.PDF_417;width = 400;height = 400;imageformat = "png";backColorRGB = 0xFFFFFFFF;codeColorRGB = 0xFF000000;errorCorrectionLevel = ErrorCorrectionLevel.H;encodeType = "UTF-8";}public QRCodeUtil(String text) {codeText = text;barcodeFormat = BarcodeFormat.PDF_417;width = 400;height = 400;imageformat = "png";backColorRGB = 0xFFFFFFFF;codeColorRGB = 0xFF000000;errorCorrectionLevel = ErrorCorrectionLevel.H;encodeType = "UTF-8";}public String getCodeText() {return codeText;}public void setCodeText(String codeText) {this.codeText = codeText;}public BarcodeFormat getBarcodeFormat() {return barcodeFormat;}public void setBarcodeFormat(BarcodeFormat barcodeFormat) {this.barcodeFormat = barcodeFormat;}public int getWidth() {return width;}public void setWidth(int width) {this.width = width;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public String getImageformat() {return imageformat;}public void setImageformat(String imageformat) {this.imageformat = imageformat;}public int getBackColorRGB() {return backColorRGB;}public void setBackColorRGB(int backColorRGB) {this.backColorRGB = backColorRGB;}public int getCodeColorRGB() {return codeColorRGB;}public void setCodeColorRGB(int codeColorRGB) {this.codeColorRGB = codeColorRGB;}public ErrorCorrectionLevel getErrorCorrectionLevel() {return errorCorrectionLevel;}public void setErrorCorrectionLevel(ErrorCorrectionLevel errorCorrectionLevel) {this.errorCorrectionLevel = errorCorrectionLevel;}private BufferedImage toBufferedImage(BitMatrix bitMatrix) {int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {image.setRGB(x, y, bitMatrix.get(x, y) ? this.codeColorRGB: this.backColorRGB);}}return image;}private byte[] writeToBytes(BitMatrix bitMatrix)throws IOException {try {BufferedImage bufferedimage = toBufferedImage(bitMatrix);//将图片保存到临时路径中File file = java.io.File.createTempFile("~pic","."+ this.imageformat);//System.out.println("临时图片路径:"+file.getPath());ImageIO.write(bufferedimage,this.imageformat,file);//获取图片转换成的二进制数组FileInputStream fis = new FileInputStream(file);int fileSize = fis.available();byte[] imageBytes = new byte[fileSize];fis.read(imageBytes);fis.close();//删除临时文件if (file.exists()) {file.delete();}return imageBytes;} catch (Exception e) {System.out.println(" Image err :" + e.getMessage());return null;}}//获取二维码图片的字节数组public byte[] getQRCodeBytes()throws IOException {try {MultiFormatWriter multiFormatWriter = new MultiFormatWriter();//设置二维码参数Map hints = new HashMap();if (this.errorCorrectionLevel != null) {//设置二维码的纠错级别hints.put(EncodeHintType.ERROR_CORRECTION, this.errorCorrectionLevel);}if (this.encodeType!=null && this.encodeType.trim().length() > 0) {//设置编码方式hints.put(EncodeHintType.CHARACTER_SET, this.encodeType);}BitMatrix bitMatrix = multiFormatWriter.encode(this.codeText, BarcodeFormat.QR_CODE, this.width, this.height, hints);byte[] bytes = writeToBytes(bitMatrix);return bytes;} catch (Exception e) {e.printStackTrace();return null;}}
}

2、项目下载及部署

  • 项目源码:https://download.csdn.net/download/weixin_44385486/86427996

  • 下载项目源码后,使用idea导入slndemo项目并运行

8253f903324d947563eb85a31193f0f9.jpeg

  • 将项目slndemo下的slndemodata.zip压缩包拷贝到本地D盘根目录下并解压

820141840466bacdc9c63c96f3853cd3.png

  • 点击启动项目

25445bec83c9d962a365ba7f0a6898e3.jpeg

三、功能展示

1、项目启动后登录首页

  • 项目地址:http://localhost:8888/pc/login

  • 账户:张三 密码:123456

d28bae984f03cdac864ce09d93ac870f.png

2、系统首页功能简介

这是一个简单的Demo项目,模拟Word文件在办公系统中的主要流转环节,并不意味着PageOffice产品只能支持这样的文档处理流程。PageOffice产品只提供文档在线处理的功能,包括:打开、编辑、保存、动态填充、文档合并、套红、留痕、盖章等上百项功能(详细请参考PageOffice产品开发包中的示例),不提供流程控制功能,所以不管开发什么样的Web系统,只要是需要在线处理Office文档,都可以根据自己的项目需要,调用PageOffice产品相应的功能即可。「注意:为了简化代码逻辑,此演示程序只能创建一个文档进行流转。」

35d9fb4f7317d6574932baab51efb9c7.jpeg

3、点击起草文档

  • 点击起草文档,点击提交

ee5855af0df64de59b1abd3ff862c1c3.png

  • 点击代办文档,然后点击编辑,当你点击编辑时你没有下载PageOffice,他会提醒你安装,你点击安装之后,关闭浏览器,重新打开浏览器就能编辑了!

9448ab05ee580e7f3d521f795dfc03aa.png

  • 我们使用了PageOffice企业版,必须要注册序列化

  • 版 本:PageOffice企业版5(试用)

  • 序列号:35N8V-2YUC-LY77-W14XL

e336385f251319499389f4f6d9ff80c3.png

  • 当我们注册成功以后,就可以编辑发布的文件或者公告了

    1f835881e264f898fa2c51dc8adcd167.png


  • 编辑好以后点击保存

104c2e6b94b7aba0f317332657e49fb4.png

  • 点击审批

5ecffc8270e5e781b085f1334cbbd661.png

4、审批

  • 登录李总审批

c656cb0fe7414cd9649583ad9a91cde9.png

  • 退出系统,然后输入李总

043f20665741a8e7b8359ebd5f410a06.png

  • 然后点击批阅,下一步

dada4e9e5e1c24e8f6f0c9df818e5a54.png

  • 登录赵六进行审核稿子

a20cfe1c9658172d05e02de2effe45ca.png

5、审稿

  • 审稿

a3097590d041df2ad5a0581034b20ce1.jpeg
  • 审核然后到盖章环节

6ac15701758d2987aee8e29bbe9d72dc.png

  • 使用王总登录进行盖章

d092f95c07754fcbd2b349fef9be3c7b.png

6、盖章和签字的实现

  • 王总登录

e1c1b9168b1e1728e3a6ff27b9c2d99a.png

  • 点击盖章

d915decd1396d3837f26217907bc88cb.png

  • 点击加盖印章

4ef62dd3b83751382b1783537f315ace.png

  • 我们盖章前需要输入姓名+密码,需要输入错误报错

4d09b489898b1913bc9850a3a3b1eb87.png

  • 正确的账户密码是:

  • 账户:王五

  • 密码:123456

789717f225bc936d5cc39fc87ccec38b.png

  • 登录成功后有选择王五的个人章进行签字

eb32e878117847688867eee4e8776c08.png

  • 签字成功

e7bfd4a7c62e1be0dbc3c3cc706e6cbd.png

  • 公司盖章,重复以上步骤

75d2e54b0c0324427b65896c3cdd9845.png

  • 签字盖章成功

43d7b83043fff4cd730252da91351635.png

7、完整签字盖章文件

  • 保存之后发布文件

42e9c111c3c60bea79de07d4cfebf8cb.jpeg

  • 公司文件展示

d0e57add09135c4e8706691a7609d9da.jpeg

  • 盖章签字后的文件

ce236fe0ecd234a92e3b793681819e75.png

项目源码 :https://download.csdn.net/download/itcodexy/86823126

来源:wanghj.blog.csdn.net

如果不会下载的话,加我微信,我直接帮您下载,备注:合同系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/17142.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot+thymeleaf实现公司文件的签字+盖章系统

&#x1f345;程序员小王的博客&#xff1a;程序员小王的博客 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 如有编辑错误联系作者&#xff0c;如果有比较好的文章欢迎分享给我&#xff0c;我会取其精华去其糟粕 &#x1f345;java自学的学习…

java毕业设计——基于java+Java Applet+access的OA流程可视化系统设计与实现(毕业论文+程序源码)——OA流程可视化系统

基于javaJava Appletaccess的OA流程可视化系统设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于javaJava Appletaccess的OA流程可视化系统设计与实现&#xff0c;文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PP…

寒冬已过,2023抓住IT复苏新机会

随着疫情防控进入新的阶段&#xff0c;2023年经济将逐渐回暖&#xff0c;许多行业也将迎来IT需求复苏的新机会。本期&#xff0c;我们就以互联网&#xff0c;金融和房地产这3个支柱行业近期的实际案例&#xff0c;来说明在在线文档领域的新机会。 案例1:某互联网集团A公司&…

OA系统解决方案

一、OA系统解决方案介绍 OA系统&#xff0c;即办公自动化系统&#xff08;Office Assistant简称OA&#xff09;&#xff0c;它是一个集成了企业信息发布、公文与信息管理、公文处理、知识管理、内部通讯、协同办公等办公与管理应用功能一体的协同 办公系统。OA系统解决方案则是…

【电子发文】在OA发布电子公文的过程与细节

发布电子公文的过程与细节 1 发文稿纸2 公文正文工具套红模板1.样式2.权限3.便捷设置 3审批流程插件1&#xff09;文号2)更新标题3&#xff09;清单链接4&#xff09;归档和发布 4其它的细节 电子发文流程一般包括发文稿纸&#xff0c;公文正文&#xff0c;审批流程三部分 1 发…

黑马】产品经理项目-内容产品项目规划

一&#xff0c;项目背景 二&#xff0c;用户端核心功能 把用户端的核心功能画出原型图 首先分析核心功能&#xff1a;主要有登录注册&#xff0c;内容列表&#xff0c;内容详情&#xff0c;个人中心&#xff0c;内容搜索&#xff0c;内容推荐 先有需求池&#xff0c;然后又需求…

机器学习算法介绍-拔草ChatGPT

最近ChatGPT&#xff08;https://chat.openai.com&#xff09;特别火&#xff0c;笔者也借此机会尝鲜了一波。ChatGPT是一个一个大型语言模型&#xff0c;它的功能是回答用户提出的问题。它可以回答很多种类的问题&#xff0c;包括历史、科学、技术、文化和其他话题的问题。它还…

使用国内外的各种人工智能chatgpt等计算房贷

使用国内外的各种人工智能chatgpt等计算房贷 闲来无事想测试一下各个‘人工智能’计算房贷的表现&#xff0c;测试时间是2023年5月30日&#xff0c;可能你测试的结果不一样&#xff0c;以你的为准。 题目 总价&#xff1a;400万人民币&#xff0c; 首付 200万人民币&#xf…

【腾讯云 Cloud Studio 实战训练营】使用Cloud Studio制作蛋仔派对兑换码工具

目录 &#x1f373;前言&#x1f373;实验介绍&#x1f373;产品介绍&#x1f373;抓包分析&#x1f603;登录分析&#x1f603;&#x1f603;第一步&#xff0c;获取验证码&#x1f603;&#x1f603;第二步&#xff0c;保存验证码&#x1f603;&#x1f603;第三步&#xff0…

如何把自有数据接入GPT大模型?

ChatGPT引发了AI革命&#xff0c;大家都想探究如何让它发挥更大价值。 以它为代表的大模型并未完全掌握所有专业知识&#xff0c;这也正是我们创业的契机。 我们应该思考如何让AI在专业领域中释放更大的价值潜能。 就像开发者挖掘出某个鲜为人知的资源一样&#xff0c;我们可以…

5.Eclipse集成开发环境

5.Eclipse集成开发环境 Eclipse集成开发环境不仅可以编译裸机工程&#xff0c;还可以调试整个裸机工程&#xff0c;这样当程序异常的时候&#xff0c;可以更加有效的进行修改。接下来就是搭建整个eclipse集成环境&#xff1a;这个调试环境的框架如下图1-1&#xff1a; 图1-1 从…

[ChatGPT 勘误] 关于 CL_WB_PGEDITOR 的用途

ChatGPT 对于 SAP ABAP 里 CL_WB_PGEDITOR 这个工具类用途的回答&#xff1a; 在 ABAP 中&#xff0c;CL_WB_PGEDITOR 是一个用于管理 SAP Web Dynpro ABAP 页签编辑器&#xff08;Page Editor&#xff09;的类。 Page Editor 是一个用于设计和维护 Web Dynpro ABAP 应用程序页…

我的周刊(第070期)

我的信息周刊&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 streamlit[1] 用 Python 快速构建数据应用&#x…

ChatGPT应用模板:英文视频转文章

正文共 800字&#xff0c;阅读大约需要 3 分钟 视频翻译、内容制作人群必备技巧&#xff0c;您将在3分钟后获得以下超能力&#xff1a; 1.高效英文字幕翻译校对 Beezy评级 &#xff1a;B级 * 经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | 互联网…

chatgpt赋能python:Python调取摄像头:如何使用Python编程语言进行视频采集和分析?

Python调取摄像头&#xff1a;如何使用Python编程语言进行视频采集和分析&#xff1f; Python是一种广泛使用的编程语言&#xff0c;特别是在数据科学和人工智能方面。但是&#xff0c;很少有人知道Python也可以与摄像头通信&#xff0c;以便进行视频分析和处理。 在本文中&a…

AIGC+实时云渲染:开启3D内容生态的黄金时代

AIGC技术革命下&#xff0c;我们的3D内容生态将会迎来怎样的变化格局&#xff1f; 实时云渲染 / Cloud XR技术将在AIGC大潮中扮演什么样的角色&#xff1f; 作为云基础设施厂商&#xff0c;我们有哪些机会可以抓住&#xff1f; 这些问题已在XR产业、3D内容行业以及软件行业内…

用chatgpt设计调用chatgpt的api进行内容交互

chatgpt真是极大提高了开发的效率&#xff0c;现在完全离不开了&#xff0c;只要提出你要的需求&#xff0c;很快就生成你想要的代码&#xff0c;几乎不用修改。 比如提出“设你是python开发工程师&#xff0c;通过chapgpt的api实现在一个页面里输入内容并返回结果”&#xff…

前苹果工程师吐槽:“Siri” 代码过时且复杂,不可能变得像 ChatGPT 一样强大...

【CSDN 编者按】在将生成式人工智能引入 Siri 上&#xff0c;苹果的前工程师约翰伯基并不看好&#xff0c;他认为 Siri 不可能像 ChatGPT 一样强大。 原文链接&#xff1a;How Siri, Alexa and Google Assistant Lost the AI Race - The New York Times (nytimes.com) 未经授权…

【ChatGPT】《介绍和对比ChatGPT的两种扮演法指令模式》- 知识点目录

《介绍和对比ChatGPT的两种扮演法指令模式》 【扮演法】的两种常用指令模式 1\ 4A (网上常见): Actor (角色) – Aim (目标) – Ask (提要求) – Addition (补充) 2\ 4W (Up主提出): What (我的情况是) – Will(我想)-Who(你是谁) – Want(我要你) 测试两种句式 4A-hard…

不必依赖ChatGPT,这几款AI工具同样好用

近期&#xff0c;随着人工智能&#xff08;AI&#xff09;技术的普及和应用&#xff0c;在各个行业中AI的应用也越来越广泛。这一局面显然类似军备竞赛&#xff0c;各家企业纷纷入场&#xff0c;准备展现其AI技术的强大。然而&#xff0c;我们所看到的只是企业对外发布的结果&a…