2017-02-16 11 views
0

私はdatatableからpdfを入手し、それをCRMのエンティティに添付しようとしています。その目的のために私はこのコードを使用します。残念なことに、作成されたpdfが壊れています。私はそれを開くことができません。何か案は?itextSharp datatable to pdf base64 string - 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を取得しました。 – mkl