损坏的PDF附件

时间:2011-08-16 21:59:59

标签: .net asp.net-mvc pdf itextsharp system.net.mail

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

  1. 从网页中检索生成的pdf
  2. 创建电子邮件
  3. 将pdf附加到消息
  4. 发送消息
  5. 我可以从网页中检索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();
        }
    }
    

    控制器方法在这里

    public ActionResult EnrollmentExpectationsPDF()
    {
        //skip a bunch a database stuff
        ...
        return new EnrollmentExpectationsPdfResult(adminList);
    }
    

    以下是问题核心的代码......

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

    Viola,我可以在没有问题的情况下从磁盘打开文件。

    为了使附件可读,我缺少什么?

2 个答案:

答案 0 :(得分:2)

感谢@ rlb.usa

向用户说明

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

答案 1 :(得分:2)

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

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

我在这里找到了答案http://forums.asp.net/t/1083910.aspx

  

我认为您的代码中没有错误下载文档。我认为错误正在发生,因为文档最初存储在数据库中。将文件写入数据库时​​,请确保未使用GetBuffer()方法。请尝试使用ToArray(),它不会在文件流的末尾附加额外的字符。这是一个链接,为您提供更多详细信息:http://msdn.microsoft.com/en-us/library/system.io.memorystream.getbuffer.aspx

     

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