【问题标题】:IText7 nested table on auto layout column自动布局列上的 IText7 嵌套表
【发布时间】:2017-04-28 15:15:27
【问题描述】:

我必须创建一个包含表格和嵌套表格的文档。当嵌套表添加到具有固定宽度的列(在我的示例中,这是宽度为 150pt 的第一列)时,嵌套表看起来如预期(第一列自动,第二列 70pt)。但是,如果我将相同的嵌套表添加到应自动调整宽度的列中,则嵌套表的列似乎也更改为自动。有什么我遗漏的吗?

嵌套表示例

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

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

【问题讨论】:

    标签: c# itext7


    【解决方案1】:

    是的,你错过了一些东西。

    首先,您可以检查最新的 itext7 快照版本并发现您的代码按预期工作。 See the result pdf

    不同之处在于,在 7.0.2 中,自动布局 itext 在最大宽度计算中不考虑列宽。这已经改变了,这就是为什么现在您的代码可以按预期工作的原因。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多