2014-10-29 98 views
3

以下代碼確實會生成表格和嵌套表格。 但是,嵌套表總是在中間對齊。 我不知道如何正確實現水平對齊。無法在單元格內左對齊嵌套表格

以下方法只是循環遍歷一個列表。 當它是一個簡單的問題時,我將添加一個TextField。 如果它是一個包含多個答案的問題,我將使用複選框和值注入一個嵌套表。

private PdfPTable CreateQuestionTable(RLQuestionRecordList questions) 
    { 
     PdfPCell cell; 
     PdfPTable table = new PdfPTable(2); 
     //table.SetWidths(new int[]{ 50, 50 }); 
     table.WidthPercentage = 100; 
     table.SpacingBefore = 20; 
     table.SpacingAfter = 20; 
     table.DefaultCell.HorizontalAlignment = Element.ALIGN_LEFT; 
     foreach (RCQuestionRecord q in questions) 
     { 
      //add question to the table 
      cell = new PdfPCell(new Phrase(q.ssSTQuestion.ssName, _Normal)); 
      cell.Border = Rectangle.NO_BORDER; 
      cell.Padding = 5.0f; 
      table.AddCell(cell); 

      //add answer to the table. 
      //add generate time we don;t know where the table will be, 
      //hence textfields will be generated after the pdf has been generated.. 

      if (q.ssSTQuestion.ssListOfAnswers.Length > 0) 
      { 
       // we have radiobuttons, so we add a table inside the cell 
       cell = new PdfPCell(); 
       cell.Border = Rectangle.NO_BORDER; 
       cell.Padding = 5.0f; 
       //we cannot align the table to the left in the cell for some weird reason... 
       cell.HorizontalAlignment = Element.ALIGN_LEFT; 
       cell.AddElement(CreateCheckboxTable(q)); 
       table.AddCell(cell); 
      } 
      else 
      { 
       // we have simple textfield, so add that to the cell 
       cell = new PdfPCell(); 
       cell.Border = Rectangle.NO_BORDER; 
       cell.Padding = 5.0f; 
       cell.HorizontalAlignment = Element.ALIGN_LEFT; 
       //simple textfield 
       cell.CellEvent = new OOMTextField(string.Format("question_{0}", q.ssSTQuestion.ssQuestionId), q.ssSTQuestion.ssLength, q.ssSTQuestion.ssValue, bf); 
       table.AddCell(cell); 
      } 
     } 
     return table; 
    } 

這是我想插入到上面的單元格中的嵌套表。

/// <summary> 
    /// 
    /// </summary> 
    /// <param name="question"></param> 
    /// <returns></returns> 
    private PdfPTable CreateCheckboxTable(RCQuestionRecord question) 
    { 
     PdfPCell cell; 
     int numCells = question.ssSTQuestion.ssListOfAnswers.Length; 

     PdfPTable table = new PdfPTable(numCells); 
     float[] widths = new float[numCells]; 

     int currentColumn = 0; 
     //table.SetWidths(new int[]{ 50, 50 }); 
     foreach (RCAnswerRecord a in question.ssSTQuestion.ssListOfAnswers) { 
      //checkbox 
      cell = new PdfPCell(new Phrase(a.ssSTAnswer.ssLabel, _Normal)); 
      cell.Border = Rectangle.NO_BORDER; 
      cell.Padding = 0.0f; 
      cell.PaddingLeft = 20.0f; 
      cell.HorizontalAlignment = Element.ALIGN_LEFT; 
      cell.VerticalAlignment = Element.ALIGN_CENTER; 
      cell.CellEvent = new OOMCheckBox(string.Format("question_{0}", question.ssSTQuestion.ssQuestionId), a.ssSTAnswer.ssIsSelected, a.ssSTAnswer.ssLabel, bf); 
      //checkbox 
      table.AddCell(cell); 
      widths[currentColumn++] = 20.0f + bf.GetWidthPoint(a.ssSTAnswer.ssLabel, 11); 
     } 

     table.SetTotalWidth(widths); 
     table.LockedWidth = true; 
     table.SpacingBefore = 0; 
     return table; 
    } 

我錯過了將嵌套表完全對齊到單元格左側的內容?

回答

6

請看一看名爲nested_tables_aligned.pdf PDF文檔:

enter image description here

在這個例子中的外部表有三列和一行。此外表中的每個單元格都包含一個內表。第一個內表是左對齊的,第二個是中心對齊的,第三個是右對齊的。

本PDF與命名NestedTablesAligned Java示例創建:

public void createPdf(String dest) throws IOException, DocumentException { 
    Document document = new Document(PageSize.A4.rotate()); 
    PdfWriter.getInstance(document, new FileOutputStream(dest)); 
    document.open(); 
    float[] columnWidths = {200f, 200f, 200f}; 
    PdfPTable table = new PdfPTable(columnWidths); 
    table.setTotalWidth(600f); 
    table.setLockedWidth(true); 
    buildNestedTables(table); 
    document.add(table); 
    document.close(); 
} 

private void buildNestedTables(PdfPTable outerTable) { 
    PdfPTable innerTable1 = new PdfPTable(1); 
    innerTable1.setTotalWidth(100f); 
    innerTable1.setLockedWidth(true); 
    innerTable1.setHorizontalAlignment(Element.ALIGN_LEFT); 
    innerTable1.addCell("Cell 1"); 
    innerTable1.addCell("Cell 2"); 
    outerTable.addCell(innerTable1); 
    PdfPTable innerTable2 = new PdfPTable(2); 
    innerTable2.setTotalWidth(100f); 
    innerTable2.setLockedWidth(true); 
    innerTable2.setHorizontalAlignment(Element.ALIGN_CENTER); 
    innerTable2.addCell("Cell 3"); 
    innerTable2.addCell("Cell 4"); 
    outerTable.addCell(innerTable2); 
    PdfPTable innerTable3 = new PdfPTable(2); 
    innerTable3.setTotalWidth(100f); 
    innerTable3.setLockedWidth(true); 
    innerTable3.setHorizontalAlignment(Element.ALIGN_RIGHT); 
    innerTable3.addCell("Cell 5"); 
    innerTable3.addCell("Cell 6"); 
    outerTable.addCell(innerTable3); 

}正如你所看到的,我定義表的排列在餐桌上的水平,而不是在水平的細胞。示例原則適用於iTextSharp。在你的C#示例中,你定義了PdfPCell而不是PdfPTable的對齊方式。改變這一點,你的問題將得到解決。

+0

太棒了,謝謝! – Mafti 2014-10-31 07:07:18