You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否存在方法:输入无签名PDF,输出对应签名提取后的目标PDF?

问题描述

我目前有三个PDF文件:

  • 无任何签名的纯PDF
  • 使用Adobe Acrobat DC对第一个PDF进行数字签名后的文件
  • 通过以下iText代码处理第二个PDF,提取其签名相关字节并转为Base64编码后生成的PDF

处理签名PDF的代码如下:

com.itextpdf.kernel.pdf.PdfReader pdfReader = new com.itextpdf.kernel.pdf.PdfReader(new 
FileInputStream("C:\\Users\\Dell\\Desktop\\test2.pdf"));
com.itextpdf.kernel.pdf.PdfDocument pdfDocument = new com.itextpdf.kernel.pdf.PdfDocument(pdfReader);
SignatureUtil signatureUtil = new SignatureUtil((pdfDocument));
for(String name: signatureUtil.getSignatureNames()){
    System.out.println(name);
    PdfSignature signature = signatureUtil.getSignature(name);
    PdfArray b = signature.getByteRange();
    long[] longs = b.asLongArray();
    RandomAccessFileOrArray rf = pdfReader.getSafeFile();
    try (InputStream rg = new RASInputStream(new RandomAccessSourceFactory().createRanged(rf.createSourceView(),longs));
         ByteArrayOutputStream byteArrayOutputStream = new com.itextpdf.io.source.ByteArrayOutputStream();) {
        byte[] buf = new byte[8192];
        int rd;
        while ((rd = rg.read(buf, 0, buf.length)) > 0) {
            byteArrayOutputStream.write(buf, 0, rd);
        }
        byte[] bytes1 = byteArrayOutputStream.toByteArray();

        String s2 = DatatypeConverter.printBase64Binary(bytes1);
    }
}

我的问题是:是否存在一种方法,以第一个无签名PDF为输入参数,输出第三个PDF文件?


回答

不行,核心原因如下:

  • 第三个PDF的核心内容是第二个签名PDF中数字签名字节范围数据的Base64编码,这部分数据包含两个关键信息:原PDF内容的哈希值,以及你用签名私钥对该哈希值生成的签名结果。
  • 数字签名的签名结果必须由签名时使用的私钥生成,仅靠无签名的第一个PDF,没有对应的私钥就无法生成合法的签名数据。
  • 即使你能复刻Adobe Acrobat DC的签名文件格式,缺少私钥也无法生成匹配的字节范围数据,自然无法得到对应Base64编码内容,也就无法输出第三个PDF。

如果需要得到类似第三个PDF的文件,必须先使用相同的私钥对第一个PDF进行数字签名生成第二个PDF,再通过代码提取签名字节并转为Base64后生成目标文件。

内容的提问来源于stack exchange,提问作者fuyun shenma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 05:54:23