[c#] iTextSharp-이메일 첨부 파일로 메모리 내 PDF 보내기

여기서 몇 가지 질문을했지만 여전히 문제가 있습니다. 내 코드에서 내가 뭘 잘못하고 있는지 말해 주시면 감사하겠습니다. ASP.Net 페이지에서 위의 코드를 실행하면 “닫힌 스트림에 액세스 할 수 없습니다”라는 메시지가 나타납니다.

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("username@gmail.com", "username@gmail.com")
{
    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("username@gmail.com", "my_password")
};

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

감사!!!

편집하다:

이 질문에 대한 답을 찾는 사람을 돕기 위해 파일을 물리적으로 만들지 않고도 이메일에 첨부 된 pdf 파일을 보내는 코드는 다음과 같습니다 (Ichiban 및 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("username@gmail.com", "username@gmail.com")
{
    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("username@gmail.com", "password")

};

smtp.Send(mm);



답변

시도해 보셨습니까?

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"));

내 기억이 제대로 작동한다면 이전 프로젝트에서 비슷한 문제가 해결되었습니다.

http://forums.asp.net/t/1093198.aspx 참조


답변

나는 brianng이 게시 한 코드를 시도해 보았고 작동했습니다. 코드 상단을 다음과 같이 변경하십시오.

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*/


답변

당신은 할 수 플러시 문서 또는 메모리 스트림을 당신이 그것을 연결 한 후 닫습니다?


답변

아마도 doc.Close ()를 호출 할 것입니다. 기본 스트림을 삭제합니다. doc.Close ()를 제거하고 해당 줄 대신 memoryStream.Position = 0을 설정하십시오.

또는 임시 파일을 사용할 수 있습니다.

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("username@gmail.com", "username@gmail.com")
    {
        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("username@gmail.com", "my_password")
    };

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


답변

나는 똑같은 문제가 있었고이 게시물을 사용하여 그것을 해결했습니다.

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"));

글을 쓰는 대신 생각 해요

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

새 스트림 만들기

MemoryStream m = new MemoryStream(memoryStream);

그리고 전화

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

둘 다 작동하지만 새 스트림을 만드는 것이 더 낫다고 생각합니다.


답변