PDFBOX:COSStream 已关闭,无法阅读。也许它封闭的 PDDocument 已经关闭?

PDFBOX: COSStream has been closed and cannot be read. Perhaps its enclosing PDDocument has been closed?

提问人:Tanmay Sharma 提问时间:4/29/2023 最后编辑:Tanmay Sharma 更新时间:4/30/2023 访问量:108

问:

我正在尝试使用pdfbox执行签名。在调用 saveIncrementalForExternalSigning 方法之前,我正在添加验证信息。

    public ByteArrayOutputStream addSignature(PDDocument document, PDSignature signature, InputStream inputStream,
                                              SealCSCCredentialOptions cscCredentialOptions, Certificate[] certificateChain, String signatureFormat)
            throws Exception {


        

        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ExternalSigningSupport externalSigningSupport = null;
        try {
            externalSigningSupport = document.saveIncrementalForExternalSigning(outputStream);
        } catch (IOException e)
        {
            e.printStackTrace();
            LOG.error("Request ID: {} Error occurred: " + e.getMessage(), LoggerUtils.getFromThreadContext("requestId"));
            throw e;
        }

        CMSSignedData signedData = generateCMSSignedData(certificateChain, externalSigningSupport, inputStream,
                cscCredentialOptions, signatureFormat);

        byte[] cmsSignature = signedData.getEncoded();
        externalSigningSupport.setSignature(cmsSignature);
        
        return outputStream;
    }

但是我在调用 COSStream 时出现间歇性错误,已关闭且无法读取。也许它封闭的 PDDocument 已经关闭?externalSigningSupport = document.saveIncrementalForExternalSigning(outputStream);

我间歇性地收到此错误。有时它会产生这种错误。在某些情况下,我得到了成功的回应。

有人可以帮忙弄清楚我做错了什么以及为什么我间歇性地收到这个错误吗?

Java 证书 pdfbox 数字签名

评论

0赞 Tilman Hausherr 4/29/2023
在保存之前,您可能会关闭文档或 COSStream。如果在保存时发生这种情况,请在 NOTEPAD++ 中打开不完整的结果 PDF 并查看末尾。这就是造成问题的 COSStream。
0赞 Tanmay Sharma 4/29/2023
@TilmanHausherr如代码中所述,我不会关闭文档或 COSStream。此外,该错误是间歇性的。如果我可能关闭了文档或 COSStream,那么每次都应该出现该错误。可能是 gc 关闭文档。有什么办法可以处理吗?
0赞 mkl 4/30/2023
我们没有看到您在通话之前做了什么。您是否向其中添加了来自另一个对象的对象?PDDocumentaddSignaturePDDocument
0赞 Tilman Hausherr 4/30/2023
另一种可能的解释是,java 以某种方式丢失了文档引用,或者认为它丢失了。确保您已安装最新版本。JDK8 的版本为 1.8.0_371。
1赞 Tanmay Sharma 5/1/2023
问题是由于 java 中的垃圾回收造成的。我正在一种方法中创建签名选项的本地对象,并将其添加到文档中。由于签名选项是本地对象,因此由于垃圾回收而自动关闭。我在根方法中创建了签名选项,并在所有执行完成后关闭它

答: 暂无答案