2017-02-16 70 views
0

我想从数据表中获取pdf并将其附加到CRM中的实体。为此我使用这个代码。不幸的是,创建的pdf已损坏,我无法打开它。有任何想法吗?itextSharp datatable到pdf base64字符串 - pdf损坏

 var bytes = memoryStream.ToArray(); 
     var encodedPDF = Convert.ToBase64String(bytes); 

     document.Close(); 

移动ToArray的调用之前的千钧一发:

private static string ExportToBase64Pdf(DataTable dt, string entityName) 
    { 
     using (MemoryStream memoryStream = new MemoryStream()) 
     { 
      Document document = new Document(PageSize.A4); 
      PdfWriter writer = PdfWriter.GetInstance(document, memoryStream); 
      document.Open(); 
      Font font5 = FontFactory.GetFont(FontFactory.HELVETICA, 5); 

      PdfPTable table = new PdfPTable(dt.Columns.Count); 
      float[] widths = new float[dt.Columns.Count]; 

      for (int i =0; i<dt.Columns.Count; i++) { widths[i] = 4f; } 
      table.SetWidths(widths); 
      table.WidthPercentage = 100; 

      PdfPCell cell = new PdfPCell(new Phrase(entityName)); 

      cell.Colspan = dt.Columns.Count; 

      foreach (DataColumn c in dt.Columns) 
      { 
       table.AddCell(new Phrase(c.ColumnName, font5)); 
      } 

      foreach (DataRow r in dt.Rows) 
      { 
       for (int i = 0; i < dt.Columns.Count; i++) 
       { 
        table.AddCell(new Phrase(r[i].ToString(), font5)); 
       } 
      } 
      document.Add(table); 

      var bytes = memoryStream.ToArray(); 
      var encodedPDF = Convert.ToBase64String(bytes); 

      document.Close(); 
      return encodedPDF; 
     } 
    } 

回答

1

该文件是由闭合完成之前,您检索文档字节。

+0

非常感谢!你能否详细说明一下为什么会造成如此大的差异? :)) – cAMPy

+0

当调用'Document.Close'时,'PdfWriter'完成pdf,尤其是它写入pdf对象交叉引用和文件尾部,这两个部分在关闭之前无法写入。因此,您的原始代码检索到不完整的pdf。 – mkl