当前位置: 首页 > 知识库问答 >
问题:

iText:我可以在渲染过程中调整表格单元格的高度吗?

景永春
2023-03-14

我正在生成一个PdfPTable并将其添加到章节中,然后将章节html" target="_blank">添加到我的文档中。我的表格有几个单元格,其中行跨度

+------------------+------------------+
| Cell 1 RowSpan=1 | Cell 2 RowSpan=3 |
+------------------+------------------+
| Cell 3 RowSpan=1 |                  |
+------------------+------------------+
| Cell 4 RowSpan=1 |                  |
+------------------+------------------+

但是打印时,第2行和第3行之间有一个分页符,我希望表格如下所示:

+--------+--------+
| Cell 1 | Cell 2 |
+--------+        |
| Cell 3 |        |
+--------+--------+
Page Break
+--------+--------+
| Cell 4 | Cell 2 |
+--------+--------+

这要归功于我在这里学到的一个技巧,我有一个实现IPdfPCellEvent的类,我实例化并附加到具有RowSpan的单元格

public class CellEvent : IPdfPCellEvent
{
    Phrase m_phrase;
    bool m_first = true;

    public CellEvent(Phrase phrase)
    {
        m_phrase = phrase;
    }

    void IPdfPCellEvent.CellLayout(PdfPCell cell, Rectangle r, PdfContentByte[] canvases)
    {
        if (m_first)
            m_first = false;
        else
        {
            ColumnText ct = cell.Column;
            ct.Canvases = canvases;
            m_phrase.Leading = m_phrase.Font.Size;
            ct.AddElement(m_phrase);
            ct.Go();
        }
    }
}

如果多次调用CellLayout(),则会发生后续调用,因为行跨度已溢出到新页面上(与我上面描述的情况完全相同),因此我手动重新绘制单元格文本。这很有效。

除了

如果我的2号牢房比1号牢房高:

+------------------+-------------------------+
| Cell 1 RowSpan=1 | Cell 2 Line 1 RowSpan=2 |
|                  | Cell 2 Line 2           |
+------------------+-------------------------+
| Cell 3 RowSpan=1 |                         |
+------------------+-------------------------+

表格在这两行之间断裂,我看到的是:

+--------+---------------+
| Cell 1 | Cell 2 Line 1 |
|        | Cell 2 Line 2 |
+--------+---------------+
Page Break
+--------+---------------+
| Cell 3 | Cell 2 Line 1 |
+--------+---------------+

当然,因为表格不知道我想在第2行中画两行文字。

我可以将第#2行的高度设置为始终足以容纳两行,但如果表恰好落在第#1行和第#2行之间没有分页符,则会在第#2行中生成不必要的空白:

+--------+---------------+
| Cell 1 | Cell 2 Line 1 |
|        | Cell 2 Line 2 |
+--------|               |
| Cell 3 |               |
|        |               | <- un-necessary space
+--------+---------------+

我尝试添加一个实现IPdfPTableEvent的类并将其附加到文档中,但似乎在执行所有布局后都会调用TableLayout(),因此我没有机会偷偷进入并调整行高。

我想我可以使用PdfPTable. KeepRowsTotal()来防止行跨度中间的分页,但这不是首选格式。

在将表格呈现到PDF文档中时,是否有办法“参与”表格的布局,以便调整行的高度?

附言。我刚刚创建了PdfPTable的一个子类,我在其中覆盖GetRowHeight(idx)并返回我想要的行高度。它对生成的PDF没有影响。

共有1个答案

卫博
2023-03-14

我想出的解决方案是非迭代的(参见评论中@ChrisHaas的想法),但使用了更多的代码。代码有点乱(反映了我为找出解决方案而进行的所有迭代),所以我不会全部上传,但基本要点是:

public class TableRowInfo
{
    public int height;
}
public class TableEvent : IPdfPTableEventAfterSplit
{
    Dictionary<PdfPRow, TableRowInfo> m_rows = null;
    public bool LoadSpans(PdfPTable table)
    {
        // Fill in m_rows, mapping PdfPRow to information about the height
        // of cells in that row, keeping row-spanning in mind
    }
    void IPdfPTableEventAfterSplit.AfterSplitTable(PdfPTable table, PdfPRow rowToStartNextPage, int startIdx)
    {
        TableRowInfo rowInfo = m_rows[rowToStartNextPage];
        if (rowInfo.height > rowToStartNextPage.MaxHeights)
        {
            PdfPCell[] cells = rowToStartNextPage.GetCells();
            foreach (PdfPCell cell in cells)
            {
                if (cell != null)
                    cell.MinimumHeight = rowInfo.height;
            }
            rowToStartNextPage.MaxHeights = rowInfo.height;
        }
    }
}
PdfPTable table = new PdfPTable(...);
// Fill in the rows of the table here
table.TableEvent = new TableEvent();
table.TableEvent.LoadSpans(table);
 类似资料:
  • 问题内容: 我正在跟踪发现的一些代码,(是的,我知道它是如何工作的)它来自这里:代码链接 我想做的是如果单元格值设置为“黄色”,则设置单元格前景色 这是我的代码: 和单元格渲染器 问题是,如果我将任何单元格值设置为“黄色”,它就不会改变 提前致谢! 问题答案: 您的渲染器曾经使用过吗?您将其设置为包含String的单元格的默认渲染器,但是是否重载了模型的方法,以便它知道某些单元格包含String

  • 场景- > TableView高度是使用纵横比相对于superview的高度动态设置的。 TableViewCell的高度是根据表格视图的高度计算的: 问题 - 最初在委托方法中没有正确计算表格视图高度。但在滚动单元格后正确计算。 尝试的解决方案: 在视图中重新加载。 调用 在单元格中进行. 有什么方法可以正确计算出这个表格的高度吗?

  • 我为包含和的自定义单元格创建了一个文件。宽度是固定的,但高度应根据下载图像的大小进行调整。 此外,单元格高度应该调整,以保持它与图像视图之间的边距。 当我读到几篇关于自动布局的文章时,我不太确定我在这里做了什么:(如果有任何错误,请指出正确的方法) > 为了保持和之间的边距,我应该创建一个约束。 前一步是通过选择和>,然后转到编辑器- 到目前为止,假设如果我调整图像视图的高度,单元格会自动调整自己

  • 问题内容: 有没有一种使用HTML / CSS(具有相对大小)的方法来使一行单元格拉伸包含它的表的整个宽度? 单元格的宽度应相等,并且外部表格的大小也应使用来动态变化。 目前,如果我没有指定固定大小,单元格会自动调整大小以适合其内容。 问题答案: 您甚至不必为单元格设置特定的宽度,足以均匀地分布单元格。 请注意,要使用表格样式的元素,必须设置宽度(在我的示例中为100%)。

  • 我在UIViewController中有一个UITableView作为视图的一部分。我正在尝试根据文本的长度自动调整表格单元格的大小。它不会设置textview的文本,单元格将以idCellTextView单元格的标准高度结束。我已经四处搜索过,正在尝试从单元格内的文本视图相对于内容视图和代码在自动布局中使用固定,如下所示: 与问题相关的视图控制器的其余部分显示在以下位置:

  • 问题内容: iText可以在Swing应用程序中呈现PDF文档吗?还是我必须为此使用另一个库/框架? 问题答案: iText用于以编程方式生成PDF文件(例如,从HTML转换为PDF或生成PDF报告。) 要查看PDF,您可以使用ICEpdf之类的库