【问题标题】:PdfpTable nested in PdfpTable cell has white space on both sides嵌套在 PdfpTable 单元格中的 PdfpTable 两边都有空格
【发布时间】:2016-05-31 14:12:46
【问题描述】:

我有一个主 PdfpTable,其中有一列用作父表。然后,我将使用动态列数创建的表添加到父表中。

所以每个表都是父表中的一行。 我得到了我想要的,除了几件事:

1) 表格在左右两边都添加了重要的空白;我希望子表填充行空间。

2) 列宽不成立。每个新表的第一列会根据其总列数更改宽度。

3) 主表宽度似乎不受 .TotalWidth 设置的影响

 PdfPTable mainTable = new PdfPTable(1);
    mainTable.TotalWidth = 1000f;

        //Iterating through some data, get the count then create tables.
        PdfPTable subTable = new PdfPTable(colCount);

//I tried setting the widths to fix issue 2
    float[] colWidths = new float[colCount];
                        colWidths[0] = 50f;
                        for (int i = 1; i < colCount; i++)
                        {
                            colWidths[i] = 50f;
                        }
                        subTable.SetWidths(colWidths);

        PdfPCell cell = new PdfPCell();
                                cell.AddElement("test");
                                subTable.AddCell(cell);

         PdfPCell tblCell = new PdfPCell();
                            //tblCell.Padding = 0f;
                            //tblCell.PaddingLeft = 0f;
                            //tblCell.PaddingRight = 0f;
                            tblCell.AddElement(subTable);
                            mainTable.AddCell(tblCell);

我尝试设置每列的宽度,删除填充,并设置父表和子表的总宽度,但结果好坏参半。

【问题讨论】:

  • 我没有时间给出完整的答案,但令人困惑的一点是SetWidths() 设置了列的相对 宽度。因此,如果您传递“50, 100”,您不是传递 50 个单位和 100 个单位,而是说第一列应该得到三分之一(50/(50+100)),第二列应该得到三分之二(100/(50+100))。相反,您可能想使用 SetTotalWidth(float[])LockedWidth

标签: c# itextsharp pdfptable


【解决方案1】:

嵌套表格有不同的方法,每种不同的方法都有其特定的行为。我已经在NestedTables6 示例中演示了这一点:

首先我们创建主表:

PdfPTable mainTable = new PdfPTable(1);
mainTable.setTotalWidth(1000);
mainTable.setLockedWidth(true);

在定义总宽度时,我们还必须锁定宽度。我的代码是用 Java 编写的,但是很容易使代码适应 C#。类似于 mainTable.LockedWidth = true;(我对 C# 不是很精通,所以如果我的 C# 不完全正确,请您原谅我)。

嵌套表格的最简单方法是添加带有addCell() 的表格。但是:在这种情况下,使用默认填充,这意味着您必须将默认填充设置为0。在 C# 中,这将类似于:mainTable.DefaultCell.Padding = 0; 在 Java 中,它是这样完成的:

mainTable.getDefaultCell().setPadding(0);
PdfPTable subTable1 = new PdfPTable(5);
subTable1.setTotalWidth(new float[]{200, 200, 200, 100, 300});
subTable1.setLockedWidth(true);
subTable1.addCell("test 1");
subTable1.addCell("test 2");
subTable1.addCell("test 3");
subTable1.addCell("test 4");
subTable1.addCell("test 5");
mainTable.addCell(subTable1);

第二种嵌套表格的方法是创建一个PdfPCell,并将表格作为参数。在这种情况下,默认填充是0

PdfPTable subTable2 = new PdfPTable(5);
subTable2.setTotalWidth(new float[]{200, 100, 200, 200, 300});
subTable2.setLockedWidth(true);
subTable2.addCell("test 1");
subTable2.addCell("test 2");
subTable2.addCell("test 3");
subTable2.addCell("test 4");
subTable2.addCell("test 5");
PdfPCell cell2 = new PdfPCell(subTable2);
mainTable.addCell(cell2);

您正在使用AddElement() 方法。这也可以,但您需要将填充设置为0

PdfPTable subTable3 = new PdfPTable(5);
subTable3.setTotalWidth(new float[]{200, 200, 100, 200, 300});
subTable3.setLockedWidth(true);
subTable3.addCell("test 1");
subTable3.addCell("test 2");
subTable3.addCell("test 3");
subTable3.addCell("test 4");
subTable3.addCell("test 5");
PdfPCell cell3 = new PdfPCell();
cell3.setPadding(0);
cell3.addElement(subTable3);
mainTable.addCell(cell3);

请注意,我将表的总宽度定义为 1000,并确保子表的所有列宽之和等于 1000。我还使用了 setTotalWidths() 方法,因为我正在传递绝对值(而您传递的是相对值)。

最终结果如下:cmp_nested_tables6.pdf

如您所见,两边没有空白。

【讨论】:

  • 很好的例子,谢谢。我会试试这个并进行更新。
猜你喜欢
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 2013-02-10
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
相关资源
最近更新 更多