.net 损坏的PDF附件

.net 损坏的PDF附件,.net,asp.net-mvc,pdf,itextsharp,system.net.mail,.net,Asp.net Mvc,Pdf,Itextsharp,System.net.mail,我正在尝试执行以下操作: 从网页检索生成的pdf 创建电子邮件 将pdf附加到邮件中 发送消息 我能够从网页中检索pdf并将其作为附件发送消息。然而,当我试图打开附件时,我收到了可怕的“Adobe Reader无法打开'filename.pdf',因为它不是受支持的文件类型,或者因为文件已损坏”消息 pdf由MVC3页面生成,使用自定义ActionResult返回pdf。看起来像这样 public class EnrollmentExpectationsPdfResult : FileResul

我正在尝试执行以下操作:

  • 从网页检索生成的pdf
  • 创建电子邮件
  • 将pdf附加到邮件中
  • 发送消息
  • 我能够从网页中检索pdf并将其作为附件发送消息。然而,当我试图打开附件时,我收到了可怕的“Adobe Reader无法打开'filename.pdf',因为它不是受支持的文件类型,或者因为文件已损坏”消息

    pdf由MVC3页面生成,使用自定义ActionResult返回pdf。看起来像这样

    public class EnrollmentExpectationsPdfResult : FileResult
    {
        IList<AdminRepEnrollmentExpectationViewModel> adminreps;
    
        public EnrollmentExpectationsPdfResult(IList<AdminRepEnrollmentExpectationViewModel> adminrep)
            : this("application/pdf", adminrep)
        { }
    
        public EnrollmentExpectationsPdfResult(string contentType, IList<AdminRepEnrollmentExpectationViewModel> adminrep)
            : base(contentType)
        {
            adminreps = adminrep;
    
        }
    
        protected override void WriteFile(HttpResponseBase response)
        {
            var cd = new ContentDisposition
            {
                Inline = true,
                FileName = "MyPDF.pdf"
            };
            response.AppendHeader("Content-Disposition", cd.ToString());
    
            //Skip a bunch of boring font stuff
            ...
    
            var writer = PdfWriter.GetInstance(doc, response.OutputStream);
            writer.PageEvent = new EnrollmentExpectationPDFPageEvent();            
            doc.Open();
    
            //Skip the doc writing stuff
            ...
    
            doc.Close();
        }
    }
    
    下面是问题的核心代码

    //Get PDF
    CredentialCache cc = new CredentialCache();
    cc.Add(
           new Uri("http://myserver/mypdfgeneratingpage"),
           "NTLM",
           new NetworkCredential("myusername", "mypassword"));
    
    var webRequestObject = (HttpWebRequest)WebRequest.Create("http://iapps.national.edu/erp/Reports/EnrollmentExpectationsPDF");
    webRequestObject.Credentials = cc;
    var response = webRequestObject.GetResponse();
    var webStream = response.GetResponseStream();
    
    //Create Mail
    System.Net.Mail.MailMessage eMail = ...
    
    //Skipping to attachment stuff
    ContentType ct = new ContentType()
    {
         MediaType = MediaTypeNames.Application.Pdf,
         Name = "EnrollmentExpecations_2.pdf"
    };
    
    Attachment a = new Attachment(webStream, ct);
    eMail.Attachments.Add(a);
    
    //Send Message
    ....
    
    作为一个实验,我尝试将下载的文件写入磁盘

    MemoryStream ms = new MemoryStream();
    var fileStream = File.Create("C:\\MyPDF.pdf");
    webStream.CopyTo(fileStream);
    
    维奥拉,我可以毫无问题地从磁盘打开文件


    为了让附件可读,我遗漏了什么?

    为了让用户清楚,感谢@rlb.usa


    “确保在发送对象后关闭并刷新流”

    只是为了让用户清楚,感谢@rlb.usa


    “确保在发送对象后关闭并刷新流”

    对于我们来说,答案是不同的

    问题是在写入数据库时,我们使用的是GetBuffer()而不是ToArray()。因此,如果缓冲区是256,那么剩余的数量将作为空字符追加到数据库中的文档中

    我在这里找到了答案

    我认为你下载文档的代码中没有错误。我相信发生错误是因为文档最初是如何存储在数据库中的。确保在将文件写入数据库时未使用GetBuffer()方法。尝试改用ToArray(),它将不会在文件流的末尾追加额外字符。这里有一个链接可以为您提供更多详细信息:

    PDF文档末尾%%EOF标记后的额外字符很可能是导致此消息的原因:


    对我们来说,答案是不同的

    问题是在写入数据库时,我们使用的是GetBuffer()而不是ToArray()。因此,如果缓冲区是256,那么剩余的数量将作为空字符追加到数据库中的文档中

    我在这里找到了答案

    我认为你下载文档的代码中没有错误。我相信发生错误是因为文档最初是如何存储在数据库中的。确保在将文件写入数据库时未使用GetBuffer()方法。尝试改用ToArray(),它将不会在文件流的末尾追加额外字符。这里有一个链接可以为您提供更多详细信息:

    PDF文档末尾%%EOF标记后的额外字符很可能是导致此消息的原因:


    啊…好吧,我在想也许它对电子邮件来说太大了。现在我必须仔细阅读代码hahaMake确保在发送消息后关闭并刷新流object@rlb.usa,成功了。。。如果你把它作为回答而不是评论,我会“检查”它。谢谢啊…好吧,我在想也许它对电子邮件来说太大了。现在我必须仔细阅读代码hahaMake确保在发送消息后关闭并刷新流object@rlb.usa,成功了。。。如果你把它作为回答而不是评论,我会“检查”它。谢谢正如我上面提到的,如果@rlb.usa将在回答中提到这一点,我很乐意接受。如果我可以问,您如何“在发送对象后关闭并刷新您的流”?我们讨论的是PDF创建过程还是电子邮件发送过程?正如我前面提到的,如果@rlb.usa将其作为答案,我很乐意接受。如果我可以问,您如何“在发送对象后关闭并刷新流”?我们谈论的是PDF创建过程还是电子邮件发送过程?
    MemoryStream ms = new MemoryStream();
    var fileStream = File.Create("C:\\MyPDF.pdf");
    webStream.CopyTo(fileStream);