iTextSharp - 将Colspan与PdfPRow一起使用

时间:2013-11-08 16:32:07

标签: pdf-generation itextsharp rows pdfptable

如果它们包含相同数量的列,我可以创建多个行:

table = new PdfPTable(3);

var firstRowCell1 = new PdfPCell( new Phrase ("Row 1 - Column 1"));
var firstRowCell2 = new PdfPCell( new Phrase ("Row 2 - Column 2"));
var firstRowCell3 = new PdfPCell( new Phrase ("Row 3 - Column 3"));
PdfPCell[] row1Cells = { firstRowCell1, firstLineRow2, firstRowCell3 };
var row1 = new PdfPRow(row1Cells);
table.Rows.Add(row1);

var nextRowCell1 = new PdfPCell( new Phrase ("Row 2 - Column 1"));
var nextRowCell2 = new PdfPCell( new Phrase ("Row 2 - Column 2"));
var nextRowCell3 = new PdfPCell( new Phrase ("Row 2 - Column 3"));
PdfPCell[] row2Cells = { nextRowCell1, nextRowCell2, nextRowCell3 };
var row2 = new PdfPRow(row2Cells);
table.Rows.Add(row2);

这样可以很好地给我两行,每行有三列。

enter image description here

但是,如果我希望第一行只使用一个使用Colspan的长列,它就会消失:

var table = new PdfPTable(3);  

var firstRowCell1 = new PdfPCell(new Phrase("Row 1 - Column 1"));
firstRowCell1.Colspan = 3;
PdfPCell[] row1Cells = { firstRowCell1 };
var row1 = new PdfPRow(row1Cells);
deptHeaderTable.Rows.Add(row1);

var nextRowCell1 = new PdfPCell(new Phrase("Row 2 - Column 1"));
var nextRowCell2 = new PdfPCell(new Phrase("Row 2 - Column 2"));
var nextRowCell3 = new PdfPCell(new Phrase("Row 2 - Column 3"));
PdfPCell[] row2Cells = { nextRowCell1, nextRowCell2, nextRowCell3 };
var row2 = new PdfPRow(row2Cells);
deptHeaderTable.Rows.Add(row2);

enter image description here

没有错误,因为它只是不呈现。

此外,我知道table.AddCell在达到当前行的表列限制时自动启动新行。但是,如果可能的话,我想使用PdfPRow。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:15)

好像你已经阅读了原始iText开发人员(不是我)认可的文档。我可以问你找到那份文件的URL,以便我可以要求停止和停止吗?

关于您的问题的答案:请查看the official documentation,您会找到MyFirstTable示例。基于此示例,您可以按如下方式调整自己的代码:

var table = new PdfPTable(3);
var cell = new PdfPCell(new Phrase("Cell with colspan 3"));
cell.Colspan = 3;
table.AddCell(cell);
table.AddCell("row 2; cell 1");
table.AddCell("row 2; cell 2");
table.AddCell("row 2; cell 3");

如您所见,没有理由使用PdfPRow类。 iText在内部使用PdfPRow类,但正如我的书中所述,使用iText的开发人员不应在其代码中使用该类。

答案 1 :(得分:1)

虽然我建议按照原作者上面推荐的官方文档使用代码(谢谢先生!!!),有办法解决这个问题:

    public static void TestFunction()
    {
        string[] cells = new string[] { "C1", "C2", "C3", "C6" };
        float[] columnWidths = new float[] { 25f, 25f, 25f, 25f, 25f, 25f };
        int[] colSpans = new int[] { 1, 1, 3, 1 };

        PdfPTable pdfPTable = new PdfPTable(columnWidths);

        var row = CreatePdfRow(cells, colSpans);
        pdfPTable.Rows.Add(row);
    }

    public static PdfPRow CreatePdfRow(string[] cells, int[] colSpans = null)
    {
        // parameter values passed for cells and colSpans:
        // string[] cells = new string[]{ "C1", "C2", "C3", "C6"};
        // int[] colSpans = new int[] { 1,1,3,1};

        if (cells == null || cells.Length <= 0)
            return new PdfPRow(new PdfPCell[] { new PdfPCell(new Phrase("")) });

        List<PdfPCell> Cells = new List<PdfPCell>();

        for (var i = 0; i < cells.Length; i++)
        {
            var pdfPCell = new PdfPCell(new Phrase(cells[i] ?? ""));

            if (colSpans != null && colSpans.Length > i)
                pdfPCell.Colspan = colSpans[i];

            Cells.Add(pdfPCell);

            // For cells with ColSpan > 1, add null cells to fill up the empty spots
            if (colSpans != null && colSpans.Length > i && colSpans[i] > 1)
            {
                for (var j = 1; j < colSpans[i]; j++)
                {
                    Cells.Add(null);
                }
            }
        }

        PdfPRow row = new PdfPRow(Cells.ToArray());
        return row;
    }