我必须创建一个包含表和嵌套表的文档。当嵌套表被添加到具有固定宽度的列时(在我的示例中,这是第一个宽度为150pt的列),嵌套表看起来像预期的那样(第一列自动,第二列70pt)。但是,如果我将相同的嵌套表添加到宽度应自动调整的列中,嵌套表的列似乎也会更改为auto。有没有我错过的东西?
嵌套表示例
生成此示例的代码如下所示
public void Test(){
//using (var stream = new MemoryStream())
var file = string.Format(@"c:\sample{0}.pdf", Guid.NewGuid());
var rand = new Random();
using (var pdfDoc = new PdfDocument(new PdfWriter(file)))
using (var doc = new Document(pdfDoc))
{
var table = new Table(new[] { UnitValue.CreatePointValue(150), UnitValue.CreatePointValue(0), UnitValue.CreatePointValue(0), UnitValue.CreatePercentValue(25)});
//table.SetWidthPercent(100);
for (var i = 0; i < table.GetNumberOfColumns(); i ++ )
{
var column = table.GetColumnWidth(i);
table.AddHeaderCell(new Cell().SetBackgroundColor(Color.LIGHT_GRAY).SetMargin(0).Add(column.ToString()));
}
const string sampledata = "01234567";
for (var i = 0; i < table.GetNumberOfColumns() * 6; i++)
{
switch (i)
{
case 6:
table.AddCell(new Image(ImageDataFactory.Create(@"c:\demo.jpg")));
break;
case 4:
{
var subTable = CreateSubTable("subtable", rand);
table.AddCell(new Cell().SetMargin(0).SetPadding(0).Add(subTable));
break;
}
case 9:
{
var subTable = CreateSubTable("subtable", rand);
table.AddCell(new Cell().SetMargin(0).SetPadding(0).Add(subTable));
break;
}
default:
table.AddCell(sampledata.Substring(0, rand.Next(1, sampledata.Length)));
break;
}
}
doc.Add(table);
}
private static Table CreateSubTable(string sampledata, Random rand){
var subTable = new Table(new[] {UnitValue.CreatePointValue(0), UnitValue.CreatePointValue(70)});
for (var h = 0; h < subTable.GetNumberOfColumns(); h++)
{
var column = subTable.GetColumnWidth(h);
subTable.AddHeaderCell(new Cell().SetBackgroundColor(Color.LIGHT_GRAY).SetMargin(0).Add(column.ToString()));
}
for (var j = 0; j < subTable.GetNumberOfColumns() * 4; j++)
{
subTable.AddCell(sampledata.Substring(0, rand.Next(1, sampledata.Length)));
}
return subTable;
}
答案 0 :(得分:1)
是的,你错过了什么。
首先,您可以查看最新的itext7快照版本,并按预期查找代码。 See the result pdf
不同之处在于,在7.0.2自动布局中,itext不考虑最大宽度计算中的列宽。这已经改变了,这就是为什么现在你的代码会像你期望的那样工作。
但是,在某些情况下,将以不同方式处理相同的嵌套表。它取决于可用的宽度(在第二列的情况下 - 自动计算宽度的列)。所以一般来说,某些单元格内容不可能放置嵌套表(0 pt,70 pt),而itext会挤压第二列。
好消息是我们收到了太多关于自动布局算法的问题,并决定写一些详细的文档。我相信这将在一周内结束。然后每个人都会高兴=)