MakeSignature.SignDetached()关闭所有流 - 在内存流中创建签名PDF

时间:2016-04-14 08:04:55

标签: vb.net pdf itext digital-signature

我开发了一个函数来签署在memorystream中创建的PDF并将其写入PDF。现在我正在寻求扩展功能,而不是创建一个物理签名的PDF,我想在内存中创建签名的PDF,所以我可以将它附加到电子邮件。

这就是我所拥有的:

    Using myPdfReader As New PdfReader(sourcePDFStream)
        Using myFileStream As New MemoryStream()
            Using myPdfStamper As PdfStamper = PdfStamper.CreateSignature(myPdfReader, myFileStream, "0"c)

                Dim myPdfSignatureAppearance As PdfSignatureAppearance = myPdfStamper.SignatureAppearance
                myPdfSignatureAppearance.SetVisibleSignature(New iTextSharp.text.Rectangle(100, 100, 250, 150), myPdfReader.NumberOfPages, "Digital Signature")

                Dim myExternalSignature As IExternalSignature = New PrivateKeySignature(pk, "SHA-256")
                MakeSignature.SignDetached(myPdfSignatureAppearance, myExternalSignature, chain, Nothing, Nothing, Nothing, 0, CryptoStandard.CMS)

                clsMail.SendHTMLMailPackStream("niels@email.be", "EFFFFactuurFEB", "NL", "docname", myVars, myFileStream)
            End Using
        End Using
    End Using

我遇到的问题是,当我调用'SendHTMLMailPackStream'方法时,'myfilestream'已经关闭。

有谁知道答案吗?

修改

我发现每次点击MakeSignature.SignDetached()方法时,它都会关闭我的所有流。但我不知道如何取消..

2 个答案:

答案 0 :(得分:0)

我在创建签名时检查了正在播放的编写器类。该类称为PdfSignatureAppearance。它的Close()方法确实不允许您保持原始流打开。这可能是有原因的。您不希望通过添加额外的字节来危害已签名的PDF。

查看您的代码,我不明白为什么有必要让MemoryStream保持打开状态。

您是否自己编写了SendHTMLMailPackStream方法?我不知道参数应该是什么,但是它接受已经包含完整PDF的MemoryStream非常尴尬(除了完整的PDF之外)。可以预期,它要么可以添加byte[]作为多部分数据,要么预期MemoryStream写入邮件消息和多部分数据。

我没有看到您传递包含PDF的MemoryStream的任何用例。在PDF的%%EOF之后添加哪些字节?

你确定你做得对吗?顺便说一句:Olivier邮寄给我,我建议他与iText软件取得联系,以防问题仍然无法解决。

答案 1 :(得分:0)

我需要从已关闭的MemoryStream中创建一个Byte []。

通过Byte [],我能够创建一个新的MemoryStream来创建签名的PDF:

Dim myExternalSignature As IExternalSignature = New PrivateKeySignature(pk, "SHA-256")
MakeSignature.SignDetached(myPdfSignatureAppearance, myExternalSignature, chain, Nothing, Nothing, Nothing, 0, CryptoStandard.CMS)

byteArray = myFileStream.ToArray()

外部使用:

Dim EndFileStream As New MemoryStream(byteArray)
clsMail.SendHTMLMailPackStream("niels@email.be", "EFFFFactuurFEB", "NL", "docname", myVars, EndFileStream)