2017-03-14 1 views
1

iTextSharp를 사용하여 DataGridView 데이터를 PDF로 내 보냈습니다. 열 너비가 모두 정확히 동일하며 일부 열 머리글 단어가 잘못 나뉩니다. 내가하려고하는 것은 각 헤더 텍스트 길이에 맞게 헤더 열 폭을 자동 맞춤 (autofit)하는 것입니다.iTextSharp 및 C#을 사용하여 AutoFit 테이블 열 너비

여기 내 코드입니다 :

PdfPTable table = new PdfPTable(dgv.Columns.Count); 
     for (int j = 0; j < dgv.Columns.Count; j++) 
     { 
      Font font = new Font(Font.FontFamily.COURIER, 14, Font.ITALIC); 
      font.Color = BaseColor.BLUE; 

      if (j == 0) 
      { 
       Phrase p1 = new Phrase(dgv.Columns[j].HeaderText, font); 
       table.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER; 
       table.WidthPercentage = 100; 
       table.AddCell(p1); 
      } 

      else 
      { 
       string header = dgv.Columns[j].HeaderText; 
       header = Regex.Replace(dgv.Columns[j].HeaderText, "[A-Z]", " $0").Trim(); 
       Phrase p = new Phrase(header, font); 
       table.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER; 
       table.WidthPercentage = 100; 
       table.AddCell(p); 
      } 
     } 
     table.HeaderRows = 1; 

     for (int i = 0; i < dgv.Rows.Count; i++) 
      for (int k = 0; k < dgv.Columns.Count; k++) 
       if (dgv[k, i].Value != null) 
       { 
        Phrase p = new Phrase(dgv[k, i].Value.ToString()); 
        table.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER; 
        table.AddCell(p); 
       } 


     doc.Add(table); 

그리고 이것은 PDF 출력입니다 :

자동 맞춤 열 크기로 enter image description here

답변

2

, 당신은 헤더 문자열 자신의 폭을 계산해야합니다, 그런 다음 테이블 열 너비를 설정하십시오.

우선 문자열의 임의의 컬렉션에서 컬럼 폭을 얻을 수있는 간단한 헬퍼 방법

string[] headers = new string[] 
{ 
    "Order Id", "Customer Id", "Customer Name", "Product Id", 
    "Product Description", "Quantity", "Product Received" 
}; 
Font font = new Font(Font.FontFamily.COURIER, 14, Font.ITALIC); 
font.Color = BaseColor.BLUE; 
var table = new PdfPTable(headers.Length) { WidthPercentage = 100 }; 
table.SetWidths(GetHeaderWidths(font, headers)); 

using (var stream = new MemoryStream()) 
{ 
    using (var document = new Document(PageSize.A4.Rotate())) 
    { 
     PdfWriter.GetInstance(document, stream); 
     document.Open(); 
     for (int i = 0; i < headers.Length; ++i) 
     { 
      table.AddCell(new PdfPCell(new Phrase(headers[i], font))); 
     } 
     document.Add(table); 
    } 
    File.WriteAllBytes(OUT_FILE, stream.ToArray()); 
} 

출력 :

enter image description here

public float[] GetHeaderWidths(Font font, params string[] headers) 
{ 
    var total = 0; 
    var columns = headers.Length; 
    var widths = new int[columns]; 
    for (var i = 0; i < columns; ++i) 
    { 
     var w = font.GetCalculatedBaseFont(true).GetWidth(headers[i]); 
     total += w; 
     widths[i] = w; 
    } 
    var result = new float[columns]; 
    for (var i = 0; i < columns; ++i) 
    { 
     result[i] = (float)widths[i]/total * 100; 
    } 
    return result; 
} 

그 다음 테이블 컬럼 폭을 설정할

+0

괜찮 았어. 고맙다. 하지만 나는 모른다. 내 방법으로 사용하는 방법. 내 메소드 코드입니다. http://image.prntscr.com/image/abc8526743c345cbaf2246d591bc7c20.png – Kfir