webentwicklung-frage-antwort-db.com.de

iTextSharp - Senden von In-Memory-PDFs in einem E-Mail-Anhang

Ich habe hier ein paar Fragen gestellt, habe aber immer noch Probleme. Ich würde mich freuen, wenn Sie mir sagen könnten, was ich in meinem Code falsch mache. Ich führe den obigen Code von einer ASP.Net-Seite aus und erhalte die Meldung "Kann nicht auf einen geschlossenen Stream zugreifen".

var doc = new Document();

MemoryStream memoryStream = new MemoryStream();

PdfWriter.GetInstance(doc, memoryStream);
doc.Open();
doc.Add(new Paragraph("First Paragraph"));
doc.Add(new Paragraph("Second Paragraph"));

doc.Close(); //if I remove this line the email attachment is sent but with 0 bytes 

MailMessage mm = new MailMessage("[email protected]", "[email protected]")
{
    Subject = "subject",
    IsBodyHtml = true,
    Body = "body"
};

mm.Attachments.Add(new Attachment(memoryStream, "test.pdf"));
SmtpClient smtp = new SmtpClient
{
    Host = "smtp.gmail.com",
    Port = 587,
    EnableSsl = true,
    Credentials = new NetworkCredential("[email protected]", "my_password")
};

smtp.Send(mm); //the "Cannot Access a Closed Stream" error is thrown here

Vielen Dank!!!

BEARBEITEN:

Um jemanden bei der Suche nach der Antwort auf diese Frage zu unterstützen, finden Sie nachfolgend den Code zum Senden einer an eine E-Mail angehängten PDF-Datei, ohne die Datei physisch erstellen zu müssen (danke an Ichiban und Brianng):

var doc = new Document();
MemoryStream memoryStream = new MemoryStream();
PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream);

doc.Open();
doc.Add(new Paragraph("First Paragraph"));
doc.Add(new Paragraph("Second Paragraph"));

writer.CloseStream = false;
doc.Close();
memoryStream.Position = 0;

MailMessage mm = new MailMessage("[email protected]", "[email protected]")
{
    Subject = "subject",
    IsBodyHtml = true,
    Body = "body"
};

mm.Attachments.Add(new Attachment(memoryStream, "filename.pdf"));
SmtpClient smtp = new SmtpClient
{
    Host = "smtp.gmail.com",
    Port = 587,
    EnableSsl = true,
    Credentials = new NetworkCredential("[email protected]", "password")

};

smtp.Send(mm);
97
Gus Cavalcanti

Hast du es versucht:

PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream);

// Build pdf code...

writer.CloseStream = false;
doc.Close();

// Build email

memoryStream.Position = 0;
mm.Attachments.Add(new Attachment(memoryStream, "test.pdf"));

Wenn mein Gedächtnis mir richtig dient, löste dies ein ähnliches Problem in einem früheren Projekt.

Siehe http://forums.asp.net/t/1093198.aspx

79
brianng

Ich habe versucht, den Code von brianng und es hat funktioniert. Ändern Sie einfach den oberen Rand des Codes wie folgt:

var doc = new Document();
MemoryStream memoryStream = new MemoryStream();
PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream); //capture the object
doc.Open();
doc.Add(new Paragraph("First Paragraph"));
doc.Add(new Paragraph("Second Paragraph"));
writer.CloseStream = false; //set the closestream property
doc.close(); //close the document without closing the underlying stream
memoryStream.Position = 0;

/* remainder of your code stays the same*/
18
ichiban

Ruft wahrscheinlich doc.Close () auf. Entsorgt den zugrunde liegenden Stream. Versuchen Sie, doc.Close () zu entfernen, und setzen Sie anstelle dieser Zeile memoryStream.Position = 0;

Alternativ können Sie eine temporäre Datei verwenden:

var tempFilePath = Path.GetTempFileName();

try 
{           
    var doc = new Document();

    PdfWriter.GetInstance(doc, File.OpenWrite(tempFilePath));
    doc.Open();
    doc.Add(new Paragraph("First Paragraph"));
    doc.Add(new Paragraph("Second Paragraph"));

    doc.Close();

    MailMessage mm = new MailMessage("[email protected]", "[email protected]")
    {
        Subject = "subject",
        IsBodyHtml = true,
        Body = "body"
    };

    mm.Attachments.Add(new Attachment(tempFilePath, "test.pdf"));
    SmtpClient smtp = new SmtpClient
    {
        Host = "smtp.gmail.com",
        Port = 587,
        EnableSsl = true,
        Credentials = new NetworkCredential("[email protected]", "my_password")
    };

    smtp.Send(mm);
}
finally
{
    File.Delete(tempFilePath);
}
3
huseyint

Können Sie das Dokument oder den Speicher-Stream bereinigen und schließen Sie es, nachdem Sie es angehängt haben?

3

Ich hatte das gleiche Problem und habe diesen Beitrag benutzt, um es zu lösen. In dem Code, der von brianng geschrieben wurde

PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream);

// Build pdf code...

writer.CloseStream = false;
doc.Close();

// Build email

memoryStream.Position = 0;
mm.Attachments.Add(new Attachment(memoryStream, "test.pdf"));

Ich denke anstatt zu schreiben

writer.CloseStream = false and memoryStream.Position = 0;

Erstelle einfach einen neuen Stream

MemoryStream m = new MemoryStream(memoryStream);

und dann anrufen

mm.Attachments.Add(new Attachment(memoryStream, "test.pdf"));

Beide funktionieren, aber ich denke, es ist besser, den neuen Stream zu erstellen

1
Zein Sleiman