2017-02-16 98 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