6

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

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

这很好,给我两行,每行三列。

在此处输入图像描述

但是,如果我希望第一行只有一个使用 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);

在此处输入图像描述

没有错误,因为它根本不渲染。

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

任何帮助将不胜感激。

4

2 回答 2

19

似乎您已经阅读了原始 iText 开发人员(即我)不认可的文档。我可以要求您提供您在其中找到该文档的 URL,以便我可以请求停止和终止吗?

至于您的问题的答案:请查看官方文档,您会找到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该类。该类PdfPRow由 iText 在内部使用,但正如我的书中所述,使用 iText 的开发人员不应在其代码中使用该类。

于 2013-11-09T10:39:52.190 回答
2

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

    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;
    }
于 2018-05-22T19:57:02.470 回答