J'ai posé quelques questions ici, mais j'ai toujours des problèmes. J'apprécierais si vous pouviez me dire ce que je fais mal dans mon code. J'exécute le code ci-dessus à partir d'une page ASP.Net et j'obtiens "Cannot Access a Closed Stream".
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
Merci!!!
ÉDITER:
Juste pour aider quelqu'un qui cherche la réponse à cette question, le code pour envoyer un fichier pdf joint à un email sans avoir à créer physiquement le fichier est ci-dessous (merci à Ichiban et 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);
c#
email
pdf
itextsharp
Gus Cavalcanti
la source
la source
position=0
. m'a sauvé!Réponses:
As-tu essayé:
Si ma mémoire est bonne, cela a résolu un problème similaire dans un projet précédent.
Voir http://forums.asp.net/t/1093198.aspx
la source
writer.Flush()
alors?J'ai essayé le code posté par brianng et cela a fonctionné. Changez simplement le haut du code comme suit:
la source
Pouvez-vous vider le document ou le flux de mémoire, puis le fermer après l'avoir joint?
la source
Appelant probablement doc.Close () Supprime le flux sous-jacent. Essayez de supprimer doc.Close () et au lieu de cette ligne, définissez memoryStream.Position = 0;
Vous pouvez également utiliser un fichier temporaire:
la source
J'ai eu le même problème et j'ai utilisé ce post pour le résoudre.Dans le code écrit par brianng
Je pense au lieu d'écrire
Créez simplement un nouveau flux
puis appelez
Les deux fonctionnent mais je pense qu'il vaut mieux créer le nouveau flux
la source