自动布局列

时间:2017-04-28 15:15:27

标签: c# itext7

我必须创建一个包含表和嵌套表的文档。当嵌套表被添加到具有固定宽度的列时(在我的示例中,这是第一个宽度为150pt的列),嵌套表看起来像预期的那样(第一列自动,第二列70pt)。但是,如果我将相同的嵌套表添加到宽度应自动调整的列中,嵌套表的列似乎也会更改为auto。有没有我错过的东西?

嵌套表示例

nested table example

生成此示例的代码如下所示

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

1 个答案:

答案 0 :(得分:1)

是的,你错过了什么。

首先,您可以查看最新的itext7快照版本,并按预期查找代码。 See the result pdf

不同之处在于,在7.0.2自动布局中,itext不考虑最大宽度计算中的列宽。这已经改变了,这就是为什么现在你的代码会像你期望的那样工作。

但是,在某些情况下,将以不同方式处理相同的嵌套表。它取决于可用的宽度(在第二列的情况下 - 自动计算宽度的列)。所以一般来说,某些单元格内容不可能放置嵌套表(0 pt,70 pt),而itext会挤压第二列。

好消息是我们收到了太多关于自动布局算法的问题,并决定写一些详细的文档。我相信这将在一周内结束。然后每个人都会高兴=)