2016-04-22 62 views
1

你好,这是我的C#代码:未能在C#中加载PDF文档

Byte[] bytes; 

int orderID = Convert.ToInt32(e.CommandArgument); 

var templateData = ordersBL.GetTemplateDetails(orderID); 

using (MemoryStream ms = new MemoryStream()) 
{ 

using (Document document = new Document(PageSize.A4, 10, 10, 10, 10)) 
{ 
PdfWriter writer = PdfWriter.GetInstance(document, ms); 
foreach (var temp in templateData.ToList()) 
{ 

string message = temp.Message; 
string tempimage = Convert.ToBase64String(temp.logo); 
string base64 = tempimage; 
byte[] imageBytes = Convert.FromBase64String(base64); 
iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(imageBytes); 
if (image.Height > image.Width) 
{ 
float percentage = 0.0f; 
percentage = 700/image.Height; 
image.ScalePercent(percentage * 100); 
} 
else 

{ 

float percentage = 0.0f; 
percentage = 140/image.Width; 
image.ScalePercent(percentage * 100); 
} 

if (!document.IsOpen()) 
{ 

document.Open(); 
} 
document.Add(image); 
using (var htmlWorker = new HTMLWorker(document)) 
{ 

using (var sr = new StringReader(message)) 
{ 


htmlWorker.Parse(sr); 
} 
} 
Paragraph paragraph = new Paragraph(); 
paragraph.SpacingBefore = 10; 
paragraph.SpacingAfter = 10; 
paragraph.Alignment = Element.ALIGN_LEFT; 
// paragraph.Font = FontFactory.GetFont(FontFactory.HELVETICA, 12f, BaseColor.GREEN); 

document.Add(paragraph); 
document.NewPage(); 
} 
bytes = ms.ToArray(); 
document.Close(); 

} 
} 
Response.ContentType = "application/pdf"; 
string pdfName = "User"; 
Response.AddHeader("Content-Disposition", "attachment; filename=" + pdfName + ".pdf"); 
Response.Buffer = true; 
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache); 
Response.BinaryWrite(bytes); 
Response.End(); 
Response.Close(); 
Response.Flush(); 
} 

全文下载,但它显示未能加载PDF文档。

无法加载PDF文档中的C#

我没有找到,我在代码中的错误。

请给我正确的代码

谢谢。

+0

你''End''Close'代码Flush'会不喜欢这样的工作。请阅读:https://blogs.msdn.microsoft.com/aspnetue/2010/05/25/response-end-response-close-and-how-customer-feedback-helps-us-improve-msdn-documentation/ 和 http://stackoverflow.com/questions/2816194/use-of-response-flush-before-response-end – Alexander

回答

2

您并未创建完整的PDF文件。请看看我的问题的答案Trying to get a memory stream from a pdfstamper into a pdfreader but getting: "PDF startxref not found"

,当你关闭一个PDF文件定稿:

document.Close(); 

的PDF是不完整的,你这样做之前

但是,你问的是MemoryStream关闭文档前:

bytes = ms.ToArray(); 
document.Close(); 

这意味着bytes不包含完整的PDF。

此外,您正在使用HTMLWorker。该课程已于多年前被放弃,请阅读documentation about XML Worker的介绍。

有可能HTMLWorker隐含关闭document对象(我不记得,因为我说:HTMLWorker不再使用)。在这种情况下,将paragraph对象添加到文档的代码将引发异常,说明文档已关闭,并且您不能再添加任何额外的内容。

2

@shivakumar,请尝试像这个样本,并更改​​您的数据。

Byte[] bytes = ImageToByteArray(System.Drawing.Image.FromFile(@"D:\Test\Sample1.png")); 
     //Converted Image to byte[] 

     using (MemoryStream ms = new MemoryStream()) 
     { 
      Document document = new Document(PageSize.A4, 10f, 10f, 10f, 0f); 
      PdfWriter.GetInstance(document, Response.OutputStream); 
      document.Open();  
      byte[] imageBytes = bytes; 
      ms.Write(bytes, 0, bytes.Length); 
      iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(imageBytes); 
      if (image.Height > image.Width) 
      { 
       float percentage = 0.0f; 
       percentage = 700/image.Height; 
       image.ScalePercent(percentage * 100); 
      } 
      else 
      { 

       float percentage = 0.0f; 
       percentage = 140/image.Width; 
       image.ScalePercent(percentage * 100); 
      } 

      if (!document.IsOpen()) 
      { 

       document.Open(); 
      } 
      document.Add(image); 
      var htmlWorker = new HTMLWorker(document); 
      string message="hi"; 
      using (var sr = new StringReader(message)) 
      { 


       htmlWorker.Parse(sr); 
      } 

      bytes = ms.ToArray(); 
      document.Close(); 
     } 
     Response.ContentType = "application/pdf"; 
     string pdfName = "User"; 
     Response.AddHeader("Content-Disposition", "attachment; filename=" + pdfName + ".pdf"); 
     Response.Buffer = true; 
     Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache); 
     Response.BinaryWrite(bytes); 
     Response.End(); 
     Response.Close(); 
     Response.Flush(); 
1

如果你有一个包含PDF一个有效的流,而你得到“无法加载PDF文件”从Chrome中,这肯定会导致一个问题:

Response.AddHeader("Content-Disposition", "attachment; filename=" + pdfName + ".pdf"); 

“附件”专告诉浏览器不是在浏览器中显示此文档,而是直接发送文件。我花了几个小时了解到Chrome的PDF阅读器在这种情况下窒息,可能是通过设计!

试试这个:

Response.AddHeader("Content-Disposition", "inline; filename=" + pdfName + ".pdf"); 

更多:Content-Disposition:What are the differences between "inline" and "attachment"?