2016-02-22 2 views
0

Я использую версию iTextSharp 5.4.5.0.Назначение динамической ширины PdfPCell для динамически генерируемого PdfPCell

Я пытаюсь распечатать PdfPTable с несколькими PdfPCell. Число PdfPCell будет динамичным. Итак, как я могу назначить ширину динамически генерируемому PdfPCell?

Я знаю, как назначить ширину для статического и фиксированного числа ячеек. Но для динамической ячейки, как я могу назначить ширину каждой из динамически генерируемых ячеек? Количество PdfPCell не фиксировано.

Просьба помочь мне?

Спасибо.

+0

По * динамическому количеству ячеек * Вы имеете в виду, что некоторые ячейки строки могут быть объединены как * colspan *? Или вы имеете в виду, что отдельные ряды вашей таблицы структурно не имеют ничего общего? – mkl

+0

Я имею в виду, что число столбцов не фиксировано заранее. Ячейка будет генерироваться динамически на основе данных из базы данных. Если у меня есть 5 записей из db, тогда 5 столбцов и 15 записей, а затем 15 столбцов (PdfpCells). Итак, как я могу назначить ширину каждой из ячеек динамически. Для каждой строки ячейка будет такой же. Но общее количество ячеек не фиксируется заранее. Надеюсь, теперь ты понимаешь. Спасибо – Herin

+0

Но как только вы создали ячейки для первой строки, вы знаете, не так ли? Таким образом, вы можете также добавить эти ячейки в 'List' вместо' PdfPTable'. Как только ячейки для первой строки будут завершены, вы знаете количество столбцов вашей таблицы, можете создать «PdfPTable» с таким количеством столбцов и добавить ячейки из списка в таблицу. Следующие строки могут быть добавлены как обычно. – mkl

ответ

2

Даже после того, как какой-то вперед и назад в комментариях к первоначальному вопросу, я не совсем уверен, что понял вопрос правильно, но давайте попробуем:

Итак, давайте предположим, что вы не знаете, количество столбцов но нужно забрать ячейки первой строки, чтобы узнать количество столбцов и их ширину. В этом случае вы можете просто сделать что-то вроде этого:

public void CreatePdfWithDynamicTable() 
{ 
    using (FileStream output = new FileStream(@"test-results\content\dynamicTable.pdf", FileMode.Create, FileAccess.Write)) 
    using (Document document = new Document(PageSize.A4)) 
    { 
     PdfWriter writer = PdfWriter.GetInstance(document, output); 
     document.Open(); 

     PdfPTable table = null; 
     List<PdfPCell> cells = new List<PdfPCell>(); 
     List<float> widths = new List<float>(); 
     for (int row = 1; row < 10; row++) 
     { 
      // retrieve the cells of the next row and put them into the list "cells" 
      ... 
      // if this is the first row, determine the widths of these cells and put them into the list "widths" 
      ... 
      // Now create the table (if it is not yet created) 
      if (table == null) 
      { 
       table = new PdfPTable(widths.Count); 
       table.SetWidths(widths.ToArray()); 
      } 
      // Fill the table row 
      foreach (PdfPCell cell in cells) 
       table.AddCell(cell); 
      cells.Clear(); 
     } 

     document.Add(table); 
    } 
} 
+0

Привет, Извините, что вернусь к вам поздно. Можно ли явно назначить ширину только определенной ячейке? Значит, если я хочу назначить ширину только 2-й ячейке, а остальные ячейки автоматически получат ширину. Как я могу это сделать ? Спасибо. – Herin

+0

Я не знаю такого автоматизма для 'PdfPTable'. Если вы хотите установить ширину одного столбца, вы должны установить все из них. Помните, что все методы установки ширины столбцов (кроме 'SetTotalWidth (float [])') рассматривают ширину как * относительные ширины *, поэтому установка только одной ширины с этими методами не имеет смысла. И 'SetTotalWidth (float [])' также нуждается в ширине всех столбцов, потому что этот метод добавляет эти значения ширины до получения желаемой общей ширины. – mkl

Смежные вопросы