Skip to content
Demo示例FAQ

PDF 生成模板编辑器

开源可视化 PDF 生成引擎,支持自定义模板,并提供面向开发者的 API,灵活构建文档生成流程。

查看 GitHub

长期验证(LTV)与 PAdES ​

SDK 使用前提及通用导入请参见数字签名概览。

长期验证通过保留证书和吊销证据,支持在以后验证签名。Java SDK 提供 PAdES 创建、LTV 延长、材料评估和完整验证报告。

级别内容输出
B包含签名证书引用的基线签名已签 PDF
TB 加内嵌 RFC 3161 签名时间戳已签 PDF
LTT 加 DSS/VRI 中的证书和吊销证据LTV PDF
LTALT 加保护验证材料的归档文档时间戳LTA PDF

调用前初始化 SDK。签名、证据收集和 TSA 请求同步执行,应在工作线程中运行。先保存文档修改,执行期间保持输入文件不变。

各阶段输出必须是不同的新路径,父目录须已存在。高级入口不接受 PDF 打开密码;PKCS#12 密码用于证书容器,不是 PDF 密码。

创建 PAdES-LT 签名

下面创建不可见的 PAdES-LT 签名。请替换证书、信任根、TSA 地址和 CRL 地址,使其与实际签名身份及服务一致。

java
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。

java
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 级别验证通过。

java
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 结论时启用吊销检查,并显式配置信任根。

java
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。