Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to left-align nested tables inside a cell

Tags:

itext

the following code does produce the table and the nested table. However, the nested table is always aligned in the middle. I have no clue how to achieve horizontal alignment properly.

The following method is simply looping through a list. when it's a simple question, I will add an TextField. if it's a question containing multiple answers, i will inject a nested table with the checkboxes and the values.

   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;
    }

This is the nested table I want to insert into the cell above.

    /// <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;
    }

What am I missing to align the nested tables totally to the left inside the cell?

like image 460
Mafti Avatar asked Mar 19 '23 01:03

Mafti


1 Answers

Please take a look at the PDF document named nested_tables_aligned.pdf:

enter image description here

The outer table in this example has three columns and one row. Each cell in this outer table contains an inner table. The first inner table is left aligned, the second one is center aligned, the third one is right aligned.

This PDF was created with the Java example named NestedTablesAligned:

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);

}

As you can see, I define the alignment of the table at the level of the table, not at the level of the cell. The sample principle applies to iTextSharp. In you C# example, you define the aligned for the PdfPCell instead of for the PdfPTable. Change this and your problem will be solved.

like image 98
Bruno Lowagie Avatar answered Mar 26 '23 22:03

Bruno Lowagie