【问题标题】:Assign Dynamic PdfPCell width to dynamically generated PdfPCell将动态 PdfPCell 宽度分配给动态生成的 PdfPCell
【发布时间】:2016-06-03 17:02:45
【问题描述】:

我使用的是 iTextSharp 5.4.5.0 版。

我正在尝试使用多个 PdfPCell 打印 PdfPTable。 PdfPCell 的数量将是动态的。那么如何为动态生成的 PdfPCell 分配宽度?

我知道如何为单元格的静态和固定数量分配宽度。但是对于动态单元格,如何为每个动态生成的单元格分配宽度? PdfPCell 的数量不固定。

请帮帮我?

谢谢。

【问题讨论】:

  • 动态单元格数是指一行的某些单元格可以合并为一个colspan吗?或者你的意思是你的表的各个行在结构上没有共同点?
  • 我的意思是,列数不是预先固定的。单元格将根据数据库中的数据动态生成。如果我有 5 条来自 db 的记录,则 5 列和 15 条记录,然后 15 列(PdfpCells)。那么如何动态地为每个单元分配宽度。对于每一行,单元格将是相同的。但是小区的总数不是预先固定的。我希望你现在明白了。谢谢
  • 但是一旦你为第一行创建了单元格,你就知道了,不是吗?因此,您还可以将这些单元格添加到List 而不是PdfPTable。第一行的单元格完成后,您就知道表格的列数,可以创建具有该列数的PdfPTable,并将列表中的单元格添加到表格中。然后可以像往常一样添加下一行。
  • 是的,我知道列的计数,但是如何为不同的单元格分配不同的宽度。我可以像这样创建 PdfPTable:“ PdfPTable table = new PdfPTable(noOfColumns);” 但我不能这样写:“table.SetTotalWidth(new float[] { 7, 104, 35, 35, 35, 35, 35, 35 });"因为细胞是动态生成的。我想将每个单元格分配为不同的宽度。
  • 但是每一行单元格的宽度和每一行对应单元格的宽度是一样的,不是吗?因此,如果您按照我之前评论中的建议进行操作,并在创建第一行的单元格后创建 PdfPTable,则可以设置单元格宽度。

标签: c# asp.net itextsharp pdfptable


【解决方案1】:

即使在 cmets 中对原始问题进行了一些反复讨论后,我也不能完全确定我是否正确理解了这个问题,但让我们尝试一下:

所以让我们假设您事先不知道列数,但需要获取第一行的单元格以了解列数及其宽度。在这种情况下,您可以简单地执行以下操作:

public void CreatePdfWithDynamicTable()
{
    using (FileStream output = new FileStream(@"test-results\content\dynamicTable.pdf", FileMode.Create, FileAccess.Write))
    using (Document document = new Document(PageSize.A4))
    {
        PdfWriter writer = PdfWriter.GetInstance(document, output);
        document.Open();

        PdfPTable table = null;
        List<PdfPCell> cells = new List<PdfPCell>();
        List<float> widths = new List<float>();
        for (int row = 1; row < 10; row++)
        {
            // retrieve the cells of the next row and put them into the list "cells"
            ...
            // if this is the first row, determine the widths of these cells and put them into the list "widths"
            ...
            // Now create the table (if it is not yet created)
            if (table == null)
            {
                table = new PdfPTable(widths.Count);
                table.SetWidths(widths.ToArray());
            }
            // Fill the table row
            foreach (PdfPCell cell in cells)
                table.AddCell(cell);
            cells.Clear();
        }

        document.Add(table);
    }
}

【讨论】:

  • 您好,很抱歉迟到了。是否可以仅将宽度明确分配给特定单元格?意味着如果我只想将宽度分配给第二个单元格,其余单元格将自动采用宽度。我怎样才能做到这一点 ?谢谢。
  • 我不知道PdfPTable 有这种自动化。如果要设置一列的宽度,则必须设置所有列。请注意,所有设置列宽的方法(SetTotalWidth(float[]) 除外)都将宽度视为相对宽度,因此使用这些方法仅设置单个宽度是没有意义的。而SetTotalWidth(float[]) 也需要所有列的宽度,因为此方法将这些宽度值相加以获得所需的总宽度。
猜你喜欢
  • 2021-12-28
  • 1970-01-01
  • 2012-11-14
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多