java - iText Java 签名 PDF DocumentException : Not enough space

标签 java exception pdf itext sign

我正在使用 iText 5.5.5 for Java,我想创建带有外部签名的签名 PDF,如下所示:

获取需要签名的 PDF 文档并创建带有空签名的 PDF,并提供要由外部签名机制签名的 BASE64 编码字节:

PdfReader reader = new PdfReader(src);
FileOutputStream os = new FileOutputStream(dest);
PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');
PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
appearance.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "test");
appearance.setCertificate(chain[1]);
ExternalSignatureContainer external = new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED);
MakeSignature.signExternalContainer(appearance, external, 8192);

InputStream is = appearance.getRangeStream();
byte[] toSign = getBytes(is);
this.b64String = new String(Base64.encode(toSign));

使用外部签名机制对 b64String 进行签名,提供 BASE64 中 PKCS#7 签名数据的签名。

创建 ExternalSignatureContainer 以仅包含来自外部签名机制的 PKCS#7 签名数据:

public class MyExternalSignatureContainer implements ExternalSignatureContainer {
    protected byte[] sig;

    public MyExternalSignatureContainer(byte[] sig) {
        this.sig = sig;
    }

    @Override
    public void modifySigningDictionary(PdfDictionary arg0) {
    }

    @Override
    public byte[] sign(InputStream arg0) throws GeneralSecurityException {
        return sig;
    }
}

使用 MyExternalSignatureContainer 创建签名的 PDF 文档:

PdfReader reader = new PdfReader(dest);
FileOutputStream os = new FileOutputStream(signedpdf);
ExternalSignatureContainer external = new MyExternalSignatureContainer(signedData);
MakeSignature.signDeferred(reader, "test", os, external);

但是我在最后一行 MakeSignature.signDeferred(reader, "test", os, external); 出现以下异常:

com.itextpdf.text.DocumentException: Not enough space

问题出在哪里,如何解决?

最佳答案

您已估计签名将适合 8192 字节。然而,签名byte[]的字节数超过8192,因此出现空间不足异常。例如:您的外部签名容器返回一个大小为 10000 字节的签名。 iText 告诉您 10000 大于 8192,并且您正在问一些不可能的问题。

如何解决此问题:在使用空签名创建 PDF 时进行更好的估计。

关于java - iText Java 签名 PDF DocumentException : Not enough space,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29344953/

相关文章:

java - 生产者 - 消费;消费者如何停止?

java - 如果方法不适合当前对象,则抛出哪个异常

c++ - 尝试重写 jmp 时出现访问冲突异常

java - 阿拉伯文本在 itext 的 PDF 中显示 شناية الÙ

java - 错误 : class, 接口(interface),或预期枚举 - Android Studio

java - 如何从 Java 中的字符串中精确获取 16 个字节

javascript - 访问 JAX-RS RESTful API

c# - 从 AppDomain.AssemblyLoad 事件中抛出异常

pdf - 如何从 ember 提供 pdf 文件

node.js - 使用 html-pdf npm 包生成 pdf,作为 GET api 在 AWS 上部署