13

SharpPDFライブラリを使用してPDFメモリストリームを生成し、それを電子メールで直接送信したいと思います。しかし、ms.Seek(....という行はObjectDisposedExceptionを与えます。

閉じたストリームにアクセスできません。

pdf.CreatePDFメソッドは、(出力)fileName文字列または(out)Streamのいずれかを取ります。しかし、私はそれもストリームを閉じると思いますか?私はストリームをあまり扱うことに慣れていないので、どのように行うべきかアドバイスしていただけますか?

CreatePDFメソッドのsharpPDFソースコードは次の場所にあります。

http://www.java2s.com/Open-Source/CSharp/PDF/SharpPDF/sharpPDF/pdfDocument.cs.htm

Public Sub SendPDF()
   Dim pdf As New sharpPDF.pdfDocument("Title", "Author")

   '....Generate pdf content

   Dim ms As New IO.MemoryStream
   pdf.CreatePDF(ms)

   Dim email As New EmailService
   email.Send(ms)

End Sub

Public Class EmailService
   Public Sub Send(Byval ms as Stream)
        ms.Seek(0, IO.SeekOrigin.Begin)

        Dim atc As New Attachment(ms, "Report.pdf")
        mail.Attachments.Add(atc)

        '....set other email parameters

        client.SendAsync(mail, mail.Subject)
  End Sub 
End Class
4

1 に答える 1

38

簡単な方法の1つは、閉じたMemoryStreamからバイト配列を取り出して別の配列を作成することです。

pdf.CreatePDF(ms)
ms = new MemoryStream(ms.ToArray())

Dim email As New EmailService
email.Send(ms)

MemoryStream.ToArrayの閉じた/破棄されたインスタンスを呼び出すのは問題ないことに注意してくださいMemoryStream。それも文書化されています:


このメソッドは、MemoryStreamが閉じているときに機能します。

于 2011-11-11T22:18:03.210 に答える