本页内容
创建数字签名
创建数字签名分为两个步骤:
- 创建签名域
- 在签名域填写签名
通过这两个步骤,您可以自签文件,或邀请其他人在您创建的签名域进行签名。
创建签名域
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();
在签名域中填写签名
在签名域中填写签名的步骤如下:
- 持有一个 PKCS12 标准的证书(PFX 或 P12 格式),并确保知道它的密码,您可以通过 ComPDFKit SDK 内置的方法创建符合标准的数字证书。
- 通过 ComPDFKit 的接口设定数字签名的外观。
- 将数据写入签名域并保存。
在签名域中填写签名的示例代码如下:
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);
}