Skip to content

创建数字签名

创建数字签名分为两个步骤:

  1. 创建签名域
  2. 在签名域填写签名

通过这两个步骤,您可以自签文件,或邀请其他人在您创建的签名域进行签名。

创建签名域

ComPDFKit 支持自定义签名域表单样式,以及通过文字,图片,手绘来自定义签名外观。

以下是创建签名域的关键代码:

C#
// 创建签名域。
// 
// Page Index: 0
// Rect: CRect(28, 420, 150, 370)
// Border RGB:{ 0, 0, 0 }  
// Widget Background RGB: { 150, 180, 210 }
// 
CPDFDocument document = new CPDFDocument();
document.open(FileUtils.getAssetsTempFile("CommonFivePage.pdf"));
// 插入一个表单签名 Widget (unsigned)
CPDFPage cpdfPage = document.pageAtIndex(0);
RectF signatureRect = new RectF(28, 420, 150, 370);
CPDFSignatureWidget signatureWidget = (CPDFSignatureWidget) cpdfPage.addFormWidget(CPDFWidget.WidgetType.Widget_SignatureFields,document);
signatureWidget.setFieldName("Signature1");
signatureWidget.setFillColor(0xFF96B4D2);
signatureWidget.setRect(signatureRect);
signatureWidget.updateAp();

在签名域中填写签名

在签名域中填写签名的步骤如下:

  1. 持有一个 PKCS12 标准的证书(PFX 或 P12 格式),并确保知道它的密码,您可以通过 ComPDFKit SDK 内置的方法创建符合标准的数字证书。
  2. 通过 ComPDFKit 的接口设定数字签名的外观。
  3. 将数据写入签名域并保存。

在签名域中填写签名的示例代码如下:

java
// 在签名域签名。
//
// Text: Grantor Name
// Content:
// Name: get grantor name from certificate
// Date: now(yyyy.mm.dd)
// Reason: I am the owner of the document.
// DN: Subject
// IsContentAlginLeft: false
// IsDrawLogo: True
// LogoBitmap: logo.png
// text color RGB: { 0, 0, 0 }
// 输出的文件名: document.FileName + "_Signed.pdf"
//
String fileName = new File(document.getFilePath()).getName();
File file = new File(rootDir + "/digitalSignature/" + fileName);
file.getParentFile().mkdirs();
String password = "ComPDFKit";

String certPath = rootDir+"/certificate/Certificate.pfx";
CPDFX509 cpdfx509 = CPDFSignature.getX509ByPKCS12Cert(certPath, password);
String location = cpdfx509.getCertInfo().getSubject().getCountry();
String reason = "I am the owner of the document.";
BufferedImage image = ImageIO.read(new File(rootDir + "/TestFiles/ComPDFKit.png"));
Bitmap bitmap = new Bitmap();
int width = image.getWidth();
int height = image.getHeight();
int[] pixels = new int[width * height];
bitmap.setWidth(width);
bitmap.setHeight(height);
bitmap.setPixels(image.getRGB(0, 0, width, height, pixels, 0, width));

// Describe signature appearance information.
CPDFDigitalSigConfig sigConfig = new CPDFDigitalSigConfig();
sigConfig.setText(cpdfx509.getCertInfo().getSubject().getCommonName());
sigConfig.setTextColor(0xFF000000);
sigConfig.setContentColor(0xFF000000);
sigConfig.setLogo(bitmap);
String builder = "Name: " + cpdfx509.getCertInfo().getSubject().getCommonName() + "\n" +
    "Date: " + "2024.04.16 18:20:30" + "\n" +
    "Reason: " + reason + "\n" +
    "Location: " + location + "\n" +
    "DN: " + cpdfx509.getCertInfo().getSubject();
sigConfig.setContent(builder);
sigConfig.setContentAlginLeft(false);
sigConfig.setDrawLogo(true);
System.out.println("updateApWithDigitalSigConfig.");
boolean updateSignAp = signatureWidget.updateApWithDigitalSigConfig(sigConfig);
if (updateSignAp){
    boolean writeSignResult = document.writeSignature(
        signatureWidget,
        file.getAbsolutePath(),
        certPath,
        password,
        location,
        reason,
        CPDFDocument.PDFDocMdpP.PDFDocMdpPForbidAllModify
    );
    System.out.println("signWithinTheSignatureField result: " + writeSignResult);
}