PDF 生成模板编辑器
开源可视化 PDF 生成引擎,支持自定义模板,并提供面向开发者的 API,灵活构建文档生成流程。
SDK 使用前提及通用导入请参见数字签名概览。
长期验证通过保留证书和吊销证据,支持在以后验证签名。Java SDK 提供 PAdES 创建、LTV 延长、材料评估和完整验证报告。
| 级别 | 内容 | 输出 |
|---|---|---|
| B | 包含签名证书引用的基线签名 | 已签 PDF |
| T | B 加内嵌 RFC 3161 签名时间戳 | 已签 PDF |
| LT | T 加 DSS/VRI 中的证书和吊销证据 | LTV PDF |
| LTA | LT 加保护验证材料的归档文档时间戳 | LTA PDF |
调用前初始化 SDK。签名、证据收集和 TSA 请求同步执行,应在工作线程中运行。先保存文档修改,执行期间保持输入文件不变。
各阶段输出必须是不同的新路径,父目录须已存在。高级入口不接受 PDF 打开密码;PKCS#12 密码用于证书容器,不是 PDF 密码。
创建 PAdES-LT 签名
下面创建不可见的 PAdES-LT 签名。请替换证书、信任根、TSA 地址和 CRL 地址,使其与实际签名身份及服务一致。
Files.createDirectories(Paths.get("output"));
CPDFSignatureValidationOptions validation = new CPDFSignatureValidationOptions()
.setTrustedCertPath("certs/trusted-roots.pem")
.setCheckRevocation(true);
CPDFPadesOptions options = new CPDFPadesOptions()
.setProfile(CPDFPadesOptions.Profile.LT)
.setCertificate("certs/signer.p12", "YOUR_PKCS12_PASSWORD")
.setFieldName("PadesSignature")
.setVisible(false)
.setTsaUrl("https://tsa.example.com/timestamp")
.setTsaTransport(20, 0, "")
.setTrustedCertPath("certs/trusted-roots.pem")
.setRevocationUrls(null, new String[] {"https://ca.example.com/issuer.crl"})
.setValidationOptions(validation);
CPDFPadesResult result = CPDFPadesSigner.sign(
"input.pdf",
"output/pades-signed.pdf",
"output/pades-lt.pdf",
null,
options);
System.out.println("Process success: " + result.isSuccess());
System.out.println("Target profile satisfied: " + result.isTargetProfileSatisfied());
System.out.println("Final completed output: " + result.getFinalPath());
System.out.println(Arrays.toString(result.getErrors()));
System.out.println(result.getValidationResult());创建 LTA 时选择 Profile.LTA,并为 sign() 第四个参数提供新的 LTA 输出路径。归档 TSA 与签名 TSA 不同时,通过 setLtaTsaUrl() 配置。
信任根文件应覆盖签名者和 TSA 证书链。证书被嵌入 PDF 或 CMS 不代表它自动可信。
延长已有签名的 LTV
prolongLtv() 为已有签名收集或更新证据,不新建审批签名,也不需要新的 PKCS#12 身份。已有签名须适合目标级别;追加证据不会重建原签名的 signed attributes。
Files.createDirectories(Paths.get("output"));
CPDFPadesOptions options = new CPDFPadesOptions()
.setTrustedCertPath("certs/trusted-roots.pem")
.setRevocationUrls(null, new String[] {"https://ca.example.com/issuer.crl"})
.setTsaUrl("https://tsa.example.com/timestamp")
.setTsaTransport(20, 0, "")
.setAppendDocumentTimestamp(true);
CPDFPadesResult result = CPDFPadesSigner.prolongLtv(
"existing-pades-t.pdf",
"output/prolonged-lt.pdf",
"output/prolonged-lta.pdf",
options);
System.out.println("Process success: " + result.isSuccess());
System.out.println("Target profile satisfied: " + result.isTargetProfileSatisfied());
System.out.println(result.getValidationResult());仅延长 LT 时,将 appendDocumentTimestamp 设为 false,并省略 LTA 输出路径。如果后续阶段失败,前面成功的输出可能仍保留;应检查错误及实际完成路径,而不是把所有配置路径视为已生成文件。
评估嵌入材料
CPDFLtvService.assessReadiness() 检查材料可用性,不证明证书可信、吊销证据有效或 PAdES 级别验证通过。
CPDFDocument document = new CPDFDocument();
try {
document.open("output/pades-lt.pdf");
CPDFLtvReadinessResult result = CPDFLtvService.assessReadiness(document);
if (result != null && result.isSuccess()) {
System.out.println("LTV materials ready: "
+ result.getReadinessInfo().isLtvReady());
}
} finally {
document.close();
}读取完整验证报告
CPDFSignatureValidator 验证保存文件的精确字节。它读取已嵌入证据,不收集新的 OCSP/CRL 材料。取得 LTV 结论时启用吊销检查,并显式配置信任根。
CPDFSignatureValidationOptions options = new CPDFSignatureValidationOptions()
.setTrustedCertPath("certs/trusted-roots.pem")
.setCheckRevocation(true);
CPDFSignatureValidationResult result = CPDFSignatureValidator.validate(
"output/pades-lt.pdf", options);
System.out.println("Overall status: " + result.getOverallStatus());
for (CPDFSignatureValidationReport report : result.getReports()) {
System.out.println("Field: " + report.getFieldName());
System.out.println("SubFilter: " + report.getSubFilter());
System.out.println("Status: " + report.getOverallStatus());
System.out.println("LTV enabled: " + report.isLtvEnabled());
for (CPDFValidationReportItem item : report.getItems()) {
System.out.println(item);
}
}流程成功、材料就绪、目标级别满足和完整验证通过是不同结论。isTargetProfileSatisfied() 是级别检查辅助方法;LTA 验收还须查看文档时间戳报告。严格验收应要求目标证据存在,并确认所有相关签名及时间戳报告有效。
INVALID、INDETERMINATE 和 NOT_CHECKED 分别表示无效、不确定和未检查。密码学完整性可通过,而缺少 LTV 等材料使其他检查不确定;SDK 不会将该状态改为 VALID。
完整 LT 创建与延长流程见 SignatureLtvKmsTest。