无法在单元格内左对齐嵌套表格

时间:2014-10-29 08:11:55

标签: itextsharp itext

以下代码确实生成了表和嵌套表。 但是,嵌套表始终在中间对齐。 我不知道如何正确地实现水平对齐。

以下方法只是循环遍历列表。 当它是一个简单的问题时,我将添加一个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;
    }

我缺少什么来将嵌套表完全对齐到单元格内的左侧?

1 个答案:

答案 0 :(得分:7)

请查看名为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定义了对齐。改变这一点,你的问题就会得到解决。