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