2011-04-21 222 views
1

我创建了一个pdf文件并通过电子邮件发送。电子邮件发送得很好,但打开PDF文件,我不断收到以下错误:“打开此文档时出错,文件已损坏,无法修复”。这是代码。我不知道我做错了......创建pdf错误信息(...文件已损坏,无法修复)

 Document myDoc = new Document(PageSize.LETTER, 20f, 20f, 18f, 20f); 

     using (MemoryStream ms = new MemoryStream()) 
     { 
      PdfWriter pWriter = PdfWriter.GetInstance(myDoc, ms); 

      myDoc.Open(); 

      PdfPTable table = new PdfPTable(2); 
      table.WidthPercentage = 100; 
      table.SpacingAfter = 10; 

      float[] widths = new float[] { 1f, 2f }; 
      table.SetWidths(widths); 
      table.HorizontalAlignment = 0; 
      table.SpacingBefore = 20f; 
      table.SpacingAfter = 30f; 

      Font regularFont = new Font(iTextSharp.text.Font.FontFamily.HELVETICA, 12); 
      Font boldFont = new Font(iTextSharp.text.Font.FontFamily.HELVETICA, 14, 1); 
      Font headerFont = new Font(iTextSharp.text.Font.FontFamily.HELVETICA, 18, 1); 

      PdfPCell cell = new PdfPCell(); 
      cell.BorderWidth = 1; 

      cell = new PdfPCell(new Phrase("HEADER", headerFont)); 
      cell.Colspan = 2; 
      cell.HorizontalAlignment = 1; 
      table.AddCell(cell); 

      cell.Colspan = 1; 
      cell.HorizontalAlignment = 0; 

      cell.Phrase = new Phrase("CONTENT:", boldFont); 
      table.AddCell(cell); 
      cell.Phrase = new Phrase("content", regularFont); 
      table.AddCell(cell); 
      myDoc.Add(table); 

      MailMessage msg = new MailMessage(); 

      msg.From = new MailAddress("[email protected]", "CONTENT Report"); 
      msg.To.Add(new MailAddress("[email protected]")); 

      msg.Subject += "Content Report"; 
      msg.Body += "Message.<br> :)"; 
      msg.IsBodyHtml = true; 

      ms.Position = 0; 
      msg.Attachments.Add(new Attachment(ms, "test.pdf", "application/x-pdf")); 
      SmtpClient client = new SmtpClient("10.1.1.15"); 
      client.Send(msg); 
+0

生成的文件大小有多大?它可能不会将内容清理到流中。除此之外,我建议检查“PdfWriter”的文档并详细检查示例。您也可以尝试在本地编写文件以进行调试。 – 2011-04-21 18:04:18

+0

@NickLarsen - pdf是一个测试文件,只是8B – MrM 2011-04-21 18:12:44

+0

@ user54197:你可以在本地打开它吗? 8B听起来很小。就像我这么小,它不可能存储你列出的所有信息。 – 2011-04-21 18:14:51

回答

5

你忘记一些重要的事情:

myDoc.Close(); 

坚持在正确的你让你到myDoc最后一次更改后。

+0

我刚才知道你也可以在一个嵌套的using语句中包装'myDoc'。然后,当您从'myDoc'的'使用'范围传出时,它会自动为您关闭()'文档。这可能是一个更好的设计模式,可用于实现IDisposable的对象。 – MikeTeeVee 2016-07-26 15:51:55