2014-10-29 46 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