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. 练习2-14 求奇数分之一序列前N项和 (15 分)
  2. plt.figure()各参数使用
  3. 【编程】二叉搜索树的定义
  4. python数据库自动对接_如何使用Python连接MySQL建立自动化监控报表
  5. linux getit文件乱码,winzipaes文件名乱码解决方案
  6. java基础 (六)面向对象(一)
  7. 内网漫游之SOCKS代理大结局
  8. 睡眠分期--深度学习算法
  9. Pascal到c++,求大佬翻译!
  10. 什么是a站、b站、c站、d站、e站、f站、g站、h站、i站、j站、k站、l站、m站、n站…z站?...
  11. Python中使用seek方法来移动文件指针的位置
  12. Lake Shore—224 型温度监测器
  13. html设计带图形的边框,css怎么设置图片的边框?
  14. (轉貼) 千頭萬緒 : 學習多執行緒程式設計的好書 (.NET) (Java)
  15. 软件工程领域 相关概念
  16. 如何将链接生成二维码
  17. 青岛新媒体运营教程:短视频没脚本怎么行,镜头脚本模板直接套用
  18. Direct3D 12——纹理——三角形插值:重心坐标
  19. 一套有趣的期权套利题目
  20. 单片机c语言实现小灯循环亮1 8个,实现单片机信号灯1-8依次循环点亮的程序怎么写...

热门文章

  1. golang注释的用法
  2. 盘点考研英语高分替换词,作文镀金必杀技!
  3. usdt充值btc网络(非节点钱包地址)
  4. js循环appendChild与jq循环append方法遇到的问题
  5. The Global Fertility Gap
  6. Python复数类型
  7. c语言 算术平均滤波法_c语言滤波算法
  8. 开源 LLM (大语言模型)整理(一)
  9. 【C练习之“猴子吃香蕉”】
  10. JavaScript----什么是纯函数