为什么在 iText7 colspanned 单元格中增加图像的大小会意外地改变我的列宽?

Why does increasing size of an image in iText7 colspanned cell change my column widths unexpectedly?

我正在使用 iText7 在 PDF 中创建两列 table,并使用 CreatePercentArray 设置相对列宽 (20%, 80%)。在 table 的中间,我有一行包含一个单元格,该单元格跨越两列并包含一个图像。

当图像宽度较小时,列宽正确。随着图像宽度的增加,列宽逐渐变化,直到两者均为 50%,即使图像宽度小于列的组合宽度。

const float SCALE = 1.0f;

float[] colWidths = { 1, 4 };
Table table = new Table(UnitValue.CreatePercentArray(colWidths)).UseAllAvailableWidth();

table.AddCell(new Cell().Add(new Paragraph("row 1, col 1")));
table.AddCell(new Cell().Add(new Paragraph("row 1, col 2")));

Cell image = new Cell(1, 2);
ImageData logoData = ImageDataFactory.Create(@"logo.png");
Image logo= new Image(logoData)
    .ScaleAbsolute(170f * SCALE, 50f * SCALE);
image.Add(logo);
table.AddCell(image);

table.AddCell(new Cell().Add(new Paragraph("row 3, col 1")));
table.AddCell(new Cell().Add(new Paragraph("row 3, col 2")));

document.Add(table);

(出于本测试代码的目的,测试图像的宽高比为 170:50)

如果 SCALE 设置为 1,则列宽为 20:80。 如果 SCALE 增加到 3,列宽将更改为 50:50.

在 SCALE = 1 时,图像比第 1 列宽,比两列的总和更窄,但相对列宽受影响。

在 SCALE = 3 时,图像仍然比第 1 列宽,并且仍然比两列的总和更窄,但相对列宽 受到影响。

我有点看不懂了。我假设内容很容易适合跨越 table 中所有列的单元格,不会影响列宽。但它似乎不是。非常感谢收到任何建议。

在默认模式下,table 的宽度由宽度分布算法计算得出。虽然可以找到它如何工作的细节,例如在 CSS 规范和算法的 iText 7 实现中,可以调试以找出观察到的行为的原因,因为 iText 7 Core 是一个开源库,看来您搜索的只是一种方法按 1:4 比例分配 table 列宽。

这很容易通过 table.SetFixedLayout(); 配置实现。

完整代码:

const float SCALE = 1.0f;

float[] colWidths = { 1, 4 };
Table table = new Table(UnitValue.CreatePercentArray(colWidths)).UseAllAvailableWidth();
table.SetFixedLayout();

table.AddCell(new Cell().Add(new Paragraph("row 1, col 1")));
table.AddCell(new Cell().Add(new Paragraph("row 1, col 2")));

Cell image = new Cell(1, 2);
ImageData logoData = ImageDataFactory.Create(@"logo.png");
Image logo= new Image(logoData)
    .ScaleAbsolute(170f * SCALE, 50f * SCALE);
image.Add(logo);
table.AddCell(image);

table.AddCell(new Cell().Add(new Paragraph("row 3, col 1")));
table.AddCell(new Cell().Add(new Paragraph("row 3, col 2")));

document.Add(table);

视觉结果: