为什么在 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);
视觉结果:
我正在使用 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);
视觉结果: