当前位置: 首页 > 知识库问答 >
问题:

iText Java签名PDF文档异常:空间不足

公羊学义
2023-03-14

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

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);
com.itextpdf.text.DocumentException: Not enough space

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

共有1个答案

山高峰
2023-03-14

您估计签名可以容纳8192个字节。但是,签名byte[]的字节数超过8192,因此出现空间不足的例外情况。例如:外部签名容器返回一个度量为10000字节的签名。iText告诉你10000比8192大,你问的是不可能的事情。

如何解决这个问题:在创建带有空签名的PDF文件时做一个更好的估计。

 类似资料:
  • 我必须创建一个PDF文件,其中我使用PDFmake来实现这一点。但PDFmake不具备在文档中添加签名字段的功能。 因此,我打开了一个带有签名字段的示例PDF,并复制了包含签名字段名称的对象:

  • 我有一个问题与数字签名PDF文件已标记为PDF/A-3A兼容。使用PDFBox(最新版本,2.0.24)最终在Adobe Acrobat中获得无效签名,而使用iText7(最新版本)获得有效签名。目标是获得符合PAdES LTV的签名。 我的流程如下(使用PDFBox和iText7): 打开PDF,创建用于签名的散列(要签名的数据) 我呼叫第三方服务以取回数字签名 在服务响应中,我还获得了OCSP

  • 我的要求是:在网站上,用户可以点击[我们的]平台上的签名按钮,直接弹出要签名的文档并在文档上签名 目前,根据DocuSign嵌入式发送和签名文档,我们使用JWT admin授权方法获取访问权\uu用户可以通过文档“envelopeviews:create recipient”打开并签署文档URL, 问题: 如果我们直接复制DocuSign URL并在浏览器中打开它,页面将正确显示要签名的文档页面。

  • 我正在尝试向现有的数字签名pdf(认证签名)中添加一个空签名字段。 我有一个工作流,其中许多用户将签署该文档(批准签名),该文档创建时带有“n”个空签名字段,每个用户一个,我们的应用程序首先应用一个不可见的认证签名,然后每个用户可以在各自的字段中签署该文档,但由于工作流中意外的更改,其他用户可能希望签名,因此,我们希望添加相应的空签名字段,然后应用签名。 我试图将空字段(带有单元格事件的表)添加到

  • 我使用PDFBox在JAVA中实现了签名功能。 我的代码的签名部分是: 如果我使用用keytool命令生成的测试自动签名证书,一切都会正常工作。 问题是,当我用一个真正经过认证的现有证书尝试这段代码时,我得到了一个例外: 我不知道为什么这行不通... 任何帮助都将不胜感激!=)

  • 我想生成一个pdf与itext7,但一些错误发生在我们身上: 我的生成代码: itext7中我唯一的样式代码: 将在服务构造函数中调用init: 我试过将字体设置为静态,但不起作用。 这是地方抛异常: 这意味着我有两个不同的文件,但我不知道我什么时候创建了另一个文件。提前感谢您的建议。