我正在尝试执行以下操作:
我可以从网页中检索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,我可以在没有问题的情况下从磁盘打开文件。
为了使附件可读,我缺少什么?
答案 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标记之后的额外字符很可能是导致该消息的原因: