2016-04-14 34 views
0

Memorystream'de oluşturulan bir PDF'yi imzalamak ve bir PDF'ye yazmak için bir işlev geliştirdim. Şimdi işlevi genişletmek için arıyorum ve fiziksel olarak imzalanmış bir PDF oluşturmak yerine, imzalı PDF'yi bellekte oluşturmak istiyorum, böylece bir e-postaya ekleyebilirim.MakeSignature.SignDetached() tüm akışları kapatır - memorystream'de imzalı PDF oluştur

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 

karşılaştığım sorun benim 'SendHTMLMailPackStream' yöntemini çağırarak işim bittiğinde 'myfilestream' zaten kapalı olduğunu geçerli:

Bu aldığım şeydir.

Buna bir cevap bilen var mı?

DÜZENLEME: Ben MakeSignature.SignDetached() yöntemi isabet olduğunu her şey bulduk

, hepsi benim akışları kapatır. Ama nasıl iptal edeceğimi bilmiyorum ..

+0

'gibi myPdfStamper.Writer.CloseStream = false;' çalışmıyor, cevabımı sildim. Belki de bu iText desteği ile bakılması gereken bir konudur. Destek sözleşmeniz var mı? –

+0

@BrunoLowagie Hayır yok. – Niels

cevap

0

İmza oluştururken oyundaki yazar sınıfını kontrol ettim. Bu sınıf PdfSignatureAppearance olarak adlandırılır. Onun Close() yöntemi aslında orijinal akışı açık tutmanıza izin vermez. Bunun için muhtemelen bir sebebi var. İmzalı PDF'yi ekstra bayt ekleyerek tehlikeye atmak istemezsiniz.

Kodunuza bakarak, neden bu MemoryStream açık tutmak için gerekli olduğunu anlamıyorum.

SendHTMLMailPackStream yöntemini kendiniz yazdınız mı? Parametrelerin ne olması gerektiğini bilmiyorum, ancak zaten tam bir PDF (ve tam bir PDF'den başka bir şey içermeyen) içeren bir MemoryStream kabul edeceği çok garip. Biri, çok parçalı bir veri olarak eklenebilir bir byte[] veya bir posta iletisi ve çok parçalı bir verisinin yazıldığı bir MemoryStream bekler.

PDF içeren bir MemoryStream geçirdiğiniz bir durum göremiyorum. Bu PDF'nin %%EOF'dan sonra hangi baytları eklerdiniz?

Doğru yaptığınızdan emin misiniz? Bu arada: Olivier bana mesaj gönderdi ve sorunun çözülmediği durumlarda iText Yazılımı ile bağlantı kurmasını önerdim.

+0

sadece bu akım bir e-posta eki oluşturmak için kullanılacak: Dim att Yeni Ek olarak (stream, "filename.pdf") – Niels

+0

Ben bir .NET geliştirici değilim, ancak .NET benzer Java (ki bu), 'stream' 'OutputStream' değil,' InputStream' olmalıdır. Neden 'MemoryStream' içinde saklanan byte []' yi kullanarak bir 'InputStream' yaratmıyorsunuz? –

+0

Bildiğim kadarıyla, MakeSignature'a vurmam gerek.SignDetached() yöntemi ilk olarak, aksi halde akışta ne olduğu önemli değil [], PDF imzalanmayacak. Amaç, disk üzerinde imzalanmış ancak kaydedilmemiş bir PDF'ye sahip olmak ve hemen postayla göndermek. – Niels

0

Kapalı MemoryStream'den bir Byte [] oluşturmam gerekiyordu. Ile

o Byte [] Ben imzalı PDF oluşturmak için yeni MemoryStream oluşturmak başardı: kullanarak Dışında

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("[email protected]", "EFFFFactuurFEB", "NL", "docname", myVars, EndFileStream)