java 代码实现电子签章(表格+签章)简单版本 注:使用的是springcloud项目

导入依赖 注:导入依赖不只有pdf的还有其他依赖

 <dependencies><!--eureka 注册中心的客户端--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!--加入ribbon的配置--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency><dependency><groupId>com.zhenzikj</groupId><artifactId>zhenzisms</artifactId><version>2.0.2</version></dependency><!--hystrix 依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency><!--加入openfegin依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--监控程序依赖--><dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-client</artifactId><version>2.2.4</version></dependency><!--加入配置中心的依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><!--springboot web程序--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--mybatis-plus依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><!--mybatis-plus-generator 代码生成器--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.1</version></dependency><!--mysql的驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.19</version></dependency><!--redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--引入支付sdk--><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.31.72.ALL</version></dependency><!--xxl-job 分布式任务调度依赖--><dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.3.0</version></dependency><!--alibaba easyexcel--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version></dependency><!--bootstrap 通过配置中心更改微服务配置--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>3.1.1</version></dependency><!--发送邮件--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><!--kafka的配置--><dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId></dependency><!-- 字体 --><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency><!-- 设置pdf文件密码 --><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.54</version></dependency><!-- pdf 转 图片 --><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.12</version></dependency><!-- pdf --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-image-generator</artifactId><version>7.0.0.Beta2</version></dependency><!--svg转png--><dependency><groupId>org.apache.xmlgraphics</groupId><artifactId>batik-transcoder</artifactId><version>1.13</version></dependency><dependency><groupId>batik</groupId><artifactId>batik-util</artifactId><version>1.6-1</version></dependency><dependency><groupId>org.apache.xmlgraphics</groupId><artifactId>batik-codec</artifactId><version>1.7</version></dependency><!--引入email--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency><dependency><groupId>io.swagger</groupId><artifactId>swagger-core</artifactId><version>1.5.22</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.9</version></dependency></dependencies>

加入配置yml文件 注:application.yml没有pdf配置,配置直接写在controller类中

server:port: 80
#pdf:
#  enable: true
#  domain: http://localhost:${server.port}/
#  pdf-ks: D:\keystore\server.keystore
#  pdf-ks-pass: 123456
#  x: 400
#  y: 400
#  width: 200
#  height: 200
#  sign-pic-name: sign.png
#  path: D:\pic\
#  font: D:\fonts\simsun.ttc
spring:application:name: leavepdfdatasource:url: jdbc:mysql://localhost:3306/xxx?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=trueusername: xxxpassword: xxxtype: com.alibaba.druid.pool.DruidDataSource
//日志 注:类别info
logging:level:root: info

整体代码 注:别导错包

package com.bw.controller;import java.io.*;
import java.net.URLEncoder;
import java.security.*;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.util.List;
import java.util.UUID;import cn.hutool.core.util.IdUtil;
import com.bw.domain.Leave;
import com.bw.domain.User;
import com.bw.service.LeaveService;
import com.bw.service.UserService;
import com.itextpdf.kernel.font.PdfSimpleFont;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import com.itextpdf.text.pdf.security.BouncyCastleDigest;
import com.itextpdf.text.pdf.security.DigestAlgorithms;
import com.itextpdf.text.pdf.security.ExternalDigest;
import com.itextpdf.text.pdf.security.ExternalSignature;
import com.itextpdf.text.pdf.security.MakeSignature;
import com.itextpdf.text.pdf.security.MakeSignature.CryptoStandard;
import com.itextpdf.text.pdf.security.PrivateKeySignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.print.Doc;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;import static com.bw.controller.Hello.*;@RequestMapping("pdf")
@RestController
public class pdfController {public static final String KEYSTORE="ks/whj.p12";public static final char[] PASSWORD="123456".toCharArray();@AutowiredUserService userService;@RequestMapping("pdflist")public String pdflist(HttpServletResponse response) throws DocumentException, GeneralSecurityException, IOException {List<User> list = userService.list();//生成唯一的文件名String filename = IdUtil.getSnowflakeNextIdStr()+".pdf";//必要响应代码,必须写response.setContentType("application/pdf");//加上这行代码就是下载,不加就是预览
//        response.addHeader("Content-Disposition","attachment;filename="+filename);//开启pdfDocument document = new Document();PdfWriter instance = PdfWriter.getInstance(document, new FileOutputStream(filename));document.open();//更改pdf的字体问题,防止因为字体出现乱码//解决乱码问题BaseFont baseFont = null;baseFont=BaseFont.createFont("D:/fonts/SIMLI.TTF",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);Font font = new Font();font.setColor(BaseColor.BLUE);font.setSize(12);//开始进行pdf的表格的设置 注:参数为数据库有几个字段就写几PdfPTable pdfPTable = new PdfPTable(3);pdfPTable.addCell(new Paragraph("id",font));pdfPTable.addCell(new Paragraph("name",font));pdfPTable.addCell(new Paragraph("password",font));//循环列表将pdf存入for (User user:list){pdfPTable.addCell(new Paragraph(user.getId()+"",font));pdfPTable.addCell(new Paragraph(user.getName()+"",font));pdfPTable.addCell(new Paragraph(user.getPassword()+"",font));}document.add(pdfPTable);document.close();//https://kb.itextpdf.com/home/it5kb/examples/digital-signatures-chapter-2#Digitalsignatureschapter2-c2_07_signatureappearances//c2_07_signatureappearances第二段代码BouncyCastleProvider provider = new BouncyCastleProvider();Security.addProvider(provider);KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());ks.load(new FileInputStream(KEYSTORE), PASSWORD);String alias = (String)ks.aliases().nextElement();PrivateKey pk = (PrivateKey) ks.getKey(alias, PASSWORD);Certificate[] chain = ks.getCertificateChain(alias);//需要更改的图片路径Image image = Image.getInstance("D:/pic/36693-111jpg/sign.png");//https://kb.itextpdf.com/home/it5kb/examples/digital-signatures-chapter-2#Digitalsignatureschapter2-c2_07_signatureappearances//c2_07_signatureappearances第一段代码//加入文件的名称PdfReader reader = new PdfReader(filename);//本行注释,文件的流在下面设置
//        FileOutputStream os = new FileOutputStream(dest);//输出流 通过响应创建一个ServletOutputStream outputStream = response.getOutputStream();PdfStamper stamper = PdfStamper.createSignature(reader,outputStream, '\0');PdfSignatureAppearance appearance = stamper.getSignatureAppearance();//更改reason和location内容为String类型即可,可随意appearance.setReason("原因");appearance.setLocation("位置");//签章的位置,参数尽量固定appearance.setVisibleSignature(new Rectangle(400,100,100,780),1,"sig");//这行可以注释,没有作用
//        appearance.setLayer2Text("Signed on " + new Date().toString());//粘贴后加入的新数据(两行),尽量固定appearance.setCertificationLevel(PdfSignatureAppearance.CERTIFIED_FORM_FILLING_AND_ANNOTATIONS);appearance.setRenderingMode(PdfSignatureAppearance.RenderingMode.GRAPHIC);appearance.setSignatureGraphic(image);// Creating the signature下面一行无用注释
//        PrivateKeySignature pks = new PrivateKeySignature(pk, digestAlgorithm, provider);ExternalDigest digest =  new BouncyCastleDigest();//新加入的字段PrivateKeySignature signature = new PrivateKeySignature(pk, DigestAlgorithms.SHA256, provider.getName());//三个参数MakeSignature.signDetached(appearance, digest, signature, chain, null, null, null, 0, MakeSignature.CryptoStandard.CMS);outputStream.close();return "111111111";}}

电子签章(SpringCloud写一个简单签章)相关推荐

  1. 用java做一个简单记事本_用记事本写一个简单的java程序

    用记事本写一个简单的java程序 第一步: 安装好jdk,并设置好环境变量. 桌面-计算机(右键)-属性-高级系统设置-环境变量-path-在变量值后加上:和jdk安装路径加上(路径即为C:\Prog ...

  2. 如何搭建python框架_从零开始:写一个简单的Python框架

    原标题:从零开始:写一个简单的Python框架 Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 你为什么想搭建一个Web框架?我想有下面几个原因: 有一个 ...

  3. ipad php mysql_如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1

    原文:http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app 作为一个i ...

  4. python123程序设计题说句心里话_用c++写一个简单的计算器程序

    // 050305.cpp : 定义控制台应用程序的入口点. // // 050304.cpp : 定义控制台应用程序的入口点. // //四则运算 #include "stdafx.h&q ...

  5. 用java写一个简单的区块链(下)

    用java写一个简单的区块链(下) 2018年03月29日 21:44:35 java派大星 阅读数:725 标签: 区块链java 更多 个人分类: 区块链 版权声明:本文为博主原创文章,转载请标明 ...

  6. 怎样用java写一个简单的文件复制程序

    怎样用java写一个简单的文件复制程序 代码来源:https://jingyan.baidu.com/article/c35dbcb0d6f1398916fcbc07.html package Num ...

  7. 给 asp.net core 写一个简单的健康检查

    给 asp.net core 写一个简单的健康检查 Intro 健康检查可以帮助我们知道应用的当前状态是不是处于良好状态,现在无论是 docker 还是 k8s 还是现在大多数的服务注册发现大多都提供 ...

  8. linux下Qt编写串口调试助手,如何在linux下用QT写一个简单的串口调试助手

    如何在linux下用QT写一个简单的串口调试助手 QT5串口类 在QT5以前,编写串口一般使用的是qextserialport类,但在QT5之后有了QT自带的串口类SerialPort(串口基础类)和 ...

  9. 如何写一个简单的node.js C 扩展

    node 是由 c 编写的,核心的 node 模块也都是由 c 代码来实现,所以同样 node 也开放了让使用者编写 c 扩展来实现一些操作的窗口. 如果大家对于 require 函数的描述还有印象的 ...

最新文章

  1. matlab 图像中用text文字标注
  2. cocos2dx build_native.sh clean 命令报错的解决
  3. spring shell_Spring Shell项目发布
  4. 深入浅出学java_《深入浅出学JAVA开发初级》
  5. mysql 主机不存在_MySQL 当记录不存在时插入,当记录存在时更新
  6. ETDM:基于显式时间差分建模的视频超分辨率(CVPR 2022)
  7. FusionCharts 技术文档-Jsp画图例子
  8. 我究竟为什么要每天埋头写代码?
  9. introduction of servlet filter
  10. vim 快捷键_VIM学习笔记 自动补全详解(Auto-Completion Detail)
  11. python绘图——图片大小设置figsize
  12. Maven安装与Maven HelloWorld入门实例
  13. 李白的诗-按时间顺序的创作
  14. SSL安全证书过期的原因及解决方法
  15. 区块链+数字经济,我们看到了什么
  16. 2021高考综合单科成绩查询,2021高考各科分数满分多少
  17. 计算机特点及应用领域阐述,计算机图像识别技术的应用及细节问题阐述与分析...
  18. 根据电机控制应用需求选择合适的 MOSFET 驱动器(Microchip应用笔记)
  19. 语音直播源码的发展,语音聊天室APP源码
  20. python对投标_有关招标投标签订合同的说法,正确的是(      ) 。

热门文章

  1. OPPOR8207_官方线刷包_救砖包_解账户锁
  2. C语言实现位置式pid与增量式pid
  3. ISE中开发XPS microblaze软核与BootLoader功能的实现
  4. 棉花--第一个中国拥有定价权的大宗商品 郑商所完胜纽交所【转载】
  5. 输入血型,根据血型判断性格
  6. 重要参考:互联网金融MySQL优化参数标准
  7. 【JVM】G1垃圾收集器知多少
  8. 土壤DNA提取解决方案 | Fast土壤DNA提取试剂盒
  9. 蚂蚁Ant Design组件库的免费在线资源
  10. 使用Excel批量给数据添加单引号和逗号