【问题标题】:Attaching a PDF in a MemoryStream to a mail makes that PDF corrupt将 MemoryStream 中的 PDF 附加到邮件会使该 PDF 损坏
【发布时间】:2017-07-17 12:36:52
【问题描述】:

itext sharp 在使用 c# asp.net 通过电子邮件发送时创建损坏的 PDF,但在本地服务器上下载时在 localhost 上工作。

using (MemoryStream ms = new MemoryStream())
        {
            try
            {
                Document document = new Document(PageSize.A4, 25, 25, 30, 30);
                PdfWriter writer = PdfWriter.GetInstance(document, ms);
                writer.CloseStream = false;
                document.Open();
                Font fnt = FontFactory.GetFont("Times New Roman", 12);
                PdfPTable PdfTable = new PdfPTable(1);

                var path = Server.MapPath(@"~/image.png");
                iTextSharp.text.Image logopng = 
                iTextSharp.text.Image.GetInstance(path);
                document.Add(logopng);
                logopng.ScaleAbsolute(120f, 155.25f);
                logopng.SpacingBefore = 10f;
                logopng.SpacingAfter = 1f;
                logopng.Alignment = Element.ALIGN_LEFT;

                string dtt = todaydate.Text;
                PdfPCell dtt1 = new PdfPCell(new Phrase(new Chunk(dat + dtt)));
                PdfTable.AddCell(dtt1);

                string buy;
                buy = "Hello World";

                string frst = first_name.Text;
             PdfPCell frst1 = new PdfPCell(new Phrase(new Chunk(buy + frst)));
                PdfTable.AddCell(frst1);
                string city = city_add.Text;
                PdfPCell city1 = new PdfPCell(new Phrase(new Chunk(city)));
                PdfTable.AddCell(city1);

                document.Add(PdfTable);
                document.Close();
                writer.Close();

                sendmail(ms);
 Response.ContentType = "application/pdf";
                Response.AddHeader("content-disposition", "attachment; filename=payment agreement.pdf");
                Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length);

catch
{
 ScriptManager.RegisterStartupScript(this, GetType(), "showalert", "alert('Mail not sent');", true);
            }
        }
    }

 private void sendmail(Stream ms)
    {
        string FromMail = "info@curtistec.com";
        string ToMail = email_id.Text;
        string Subject = "Payment Agreement";
        string Body = "Dear Customer ";
        using (Attachment att = new Attachment(ms, "payment agreement.pdf", MediaTypeNames.Application.Pdf))
        {
            using (MailMessage mm = new MailMessage(
              FromMail, ToMail, Subject, Body))
            {
                mm.Attachments.Add(att);
                SmtpClient smtp = new SmtpClient();
                smtp.Host = "server name";
                smtp.Port = 25;
                smtp.Send(mm);
            }
        }
    }

【问题讨论】:

    标签: c# asp.net email pdf itext


    【解决方案1】:

    删除以下行:

    sendmail(ms);
    

    改用这一行:

    sendmail(new MemoryStream(ms.ToArray()));
    

    附加说明:我看到您在代码中使用了ms.GetBuffer()。请在Microsoft's Developer Network阅读以下备注:

    请注意,缓冲区包含可能未使用的已分配字节。 例如,如果将字符串“test”写入 MemoryStream 对象,从GetBuffer返回的缓冲区长度是256,不是 4,有 252 个字节未使用。要仅获取缓冲区中的数据,请使用 ToArray 方法;但是,ToArray 在 记忆。

    当您在 PDF 上使用 GetBuffer 时,可能会导致 PDF 末尾有额外字节。这可能会出现问题,因为 PDF 查看器会在文件末尾开始阅读 PDF(可以在此处找到交叉引用表)。如果 PDF 不以 %%EOF 结尾,但有一些随机的额外字节以获得 256 的倍数,您的 PDF 查看器可能会认为您的 PDF 已损坏。

    【讨论】:

    • 谢谢你,它正在工作,一定会记住以后的帖子,
    • 习惯上接受解决问题的答案。可以通过单击左侧分数旁边的复选标记来完成接受。通过接受答案,您还可以向其他人表明该问题已正确回答。
    【解决方案2】:

    我认为您需要将流的位置移到开头。现在它在最后,将附加一个“空”文件。 所以在发送之前,请将位置设置为 0。

    ms.Position = 0;
    sendmail(ms);
    

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      • 2017-09-17
      • 2016-08-20
      • 1970-01-01
      相关资源
      最近更新 更多