2016-04-14 3 views
0

memorystreamで作成したPDFに署名してPDFに書き込む関数を開発しました。今では機能を拡張し、物理的に署名されたPDFを作成するのではなく、署名されたPDFをメモリに作成して電子メールに添付することができます。MakeSignature.SignDetached()はすべてのストリームを閉じます - memorystreamで符号付き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("[email protected]", "EFFFFactuurFEB", "NL", "docname", myVars, myFileStream) 
      End Using 
     End Using 
    End Using 

私が直面してる問題は、私は私の「SendHTMLMailPackStream」メソッド「myfilestream」を呼んでいるとき、すでに閉じていることです。

誰もがこれに対する答えを知っていますか?

EDIT:

私は毎回MakeSignature.SignDetached()メソッドがヒットし、それはすべて私のストリームをクローズしていることが分かりました。しかし、私はそれをどのようにキャンセルするのか考えていません。

+0

を;'私の答えを削除しました。たぶん、これはiTextのサポートによって検討されるべき問題です。サポート契約はありますか? –

+0

@BrunoLowagieいいえ、私はしません。 – Niels

答えて

0

シグネチャを作成するときに再生中のライタークラスをチェックしました。このクラスはPdfSignatureAppearanceと呼ばれます。そのClose()メソッドは実際に元のストリームを開いたままにすることはできません。たぶんその理由があります。余分なバイトを追加して、署名されたPDFを危険にさらしたくない。

あなたのコードを見ると、私はなぜそれを維持する必要があるのか​​分かりませんMemoryStream

SendHTMLMailPackStream方法はあなた自身で書いてありますか?私はどのようなパラメータが想定されているのかわかりませんが、既に完全なPDF(と完全なPDFのみ)を含むMemoryStreamを受け入れることは非常に面倒です。マルチパートデータとして追加できるbyte[]、またはメールメッセージとマルチパートデータが書き込まれるMemoryStreamがあると予想されます。

PDFを含むMemoryStreamを渡す使用例はありません。そのPDFの%%EOFの後にどのバイトを追加しますか?

本当に正しくやっていますか?ちなみに:Olivierが私にメールを送ってくれました。問題が解決されない場合、iText Softwareと連絡を取り合うことを提案しました。

+0

このストリームが使用されるのは、電子メールへの添付ファイルを作成することだけです。 Dim att As新しい添付ファイル(ストリーム、 "filename.pdf") – Niels

+0

私は.NET開発者ではありませんが、.NET (それは)Javaに、 'stream'は' OutputStream'ではなく 'InputStream'であると仮定します。 'MemoryStream'に格納された' byte [] 'を使って' InputStream'を作りませんか? –

+0

私が知る限り、私はMakeSignatureを打つ必要があります。SignDetached()メソッドを最初に使用してください。それ以外の場合は、ストリーム/バイト[]内の内容に関係しません.PDFは署名されません。署名されていてもディスクに保存されていないPDFを作成し、メールですぐに送信することを目的としています。 – Niels

0

閉じたMemoryStreamからByte []を作成する必要がありました。使用して外

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

byteArray = myFileStream.ToArray() 

:そのバイトで

[]私が署名したPDFを作成するための新しいMemoryStreamを作成することができましたmyPdfStamper.Writer.CloseStream =偽 `として

Dim EndFileStream As New MemoryStream(byteArray) 
clsMail.SendHTMLMailPackStream("[email protected]", "EFFFFactuurFEB", "NL", "docname", myVars, EndFileStream) 
関連する問題