PDF文档电子公章的初试

点击上方蓝字关注我们!

PART.1

大家在日常生活中经常会接触到电子公章,比如电子发票上一般会包含电子公章信息,比如下图发票中就带有两个电子公章,顶部的公章是普通的图形公章,右下角的电子公章不仅包含图形公章还包含了时间戳电子签名信息,图形公章用于显示直观信息,其发票的合法性由电子签名保证,其电子签名符合中华人民共和国电子签名法,因此其具有法律效力。

PART.2

在本文给大家展示在Java程序中如何给Pdf文档加盖图形公章的同时增加网络时间戳电子签名的,签名最终效果图如下所示,在开展工作前需要准备一个.pfx格式的电子签名文件,和图形公章.png格式文件。文中使用spire框架完成PDF文件的签章工作。

PdfDocument pdf = new PdfDocument();
String filename="~/Tmp/Window.pdf";
System.out.println(new File(filename).exists());
pdf.loadFromFile(filename);

2. 加载签名文件到PdfCertificate,并初始化电子签名对象PdfSignature

String caFile="/Users/walker/Tmp/certifation2/server.pfx";
PdfCertificate cert = new PdfCertificate(caFile,"likuo.dev");
PdfSignature signature = new PdfSignature(pdf, pdf.getPages().get(1), cert, "电子数据签名");

3. 指定电子签名放在当前页的哪个位置

PdfSignature signature = new PdfSignature(pdf, pdf.getPages().get(1), cert, "电子数据签名");
Rectangle2D rect = new Rectangle2D.Float();
//指定横坐标位置
float x= (float) (pdf.getPages().get(0).getActualSize().getWidth() - 340);
//指定纵坐标位置
float y=(float) (pdf.getPages().get(0).getActualSize().getHeight() - 230);
//指定大小面积
Dimension dimension=new Dimension(300, 150);
  int width
Point2D point2D=new Point2D.Float(x, y);
rect.setFrame(point2D, dimension);
signature.setBounds(rect);

4. 配置签名的可信时间

//沃通时间戳(https://www.wosign.com/basic/timestamp.htm)
//使用第三方存证公司公开的时间戳服务:
String timestampeServerUrl = "http://timestamp.digicert.com";
signature.configureTimestamp(timestampeServerUrl);

5. 设置签名信息

//设置签名模式为图片和详情,
//Sign_Image_And_Sign_Detail:会在签名区域展示指定的公章和签名信息
//Sign_Image_Only:只在签名区域展示图章
//Sign_Detail:只在签名区域展示签名信息
signature.setGraphicMode(GraphicMode.Sign_Image_And_Sign_Detail);
signature.setNameLabel("名称:");
signature.setName("李xxx");
signature.setDateLabel("日期:");
signature.setDate(new java.util.Date());
signature.setLocationInfoLabel("地点:");
signature.setLocationInfo("北京市-北京市");
signature.setReasonLabel("原由:");
signature.setReason("电子xxx合同");
signature.setDistinguishedNameLabel("DN: ");
signature.setDistinguishedName(signature.getCertificate().get_IssuerName().getName());
signature.setDistinguishedNameLabel("序列:");
signature.setDistinguishedName("20210813第【李】23次");
//指定签章图片
signature.setSignImageSource(PdfImage.fromFile("~.png"));

6. 设置签名字体和权限

//设置签名的字体
signature.setSignDetailsFont(new PdfTrueTypeFont(new Font("Arial Unicode MS", Font.PLAIN, 9)));
//设置文档权限为禁止更改
signature.setDocumentPermissions(PdfCertificationFlags.Forbid_Changes);
signature.setCertificated(true);

7. 保存签名后的文档到当前工作目录

File file=new File(filename);
String fileName=file.getName();
if(fileName.contains(".")){
    pdf.saveToFile(fileName.substring(0,fileName.indexOf("."))+"_Sign.pdf");
}else {
    pdf.saveToFile(fileName+"_Sign.pdf");
}
//保存文档
pdf.close();