在使用itextsharp创建的PDF表中设置单元格高度

时间:2016-05-10 10:42:54

标签: c# pdf itextsharp

我使用以下代码在我的itextsharp PDF文档中创建一个表:

foreach (var subComp in competency.SubCompetensies)
{
    cell = new PdfPCell(new Phrase(0, subComp.DescriptionMin, _nfDescr));
    cell.Padding = 5;
    cell.Rowspan = 2;

    table.AddCell(cell);

    cell = new PdfPCell(new Phrase(0, subComp.Name, _nfSubComp));
    cell.Colspan = 10;
    cell.Padding = 5;
    table.AddCell(cell);

    cell = new PdfPCell(new Phrase(subComp.DescriptionMax, _nfDescr));
    cell.Padding = 5;
    cell.Rowspan = 2;

    table.AddCell(cell);

    for (int i = 1; i < 11; i++)
    {
        cell = new PdfPCell(new Phrase(0, i.ToString(), _nfScale));
        cell.FixedHeight = 15f;
        cell.Padding = 3;
        cell.PaddingLeft = 5;
        table.AddCell(cell);
    }
}

结果如下:

PDF_Table

正如您所看到的,每行中具有数字的单元格的高度不同。似乎忽略了cell.FixedHeight属性。

有没有办法设定这些细胞的固定高度?

1 个答案:

答案 0 :(得分:3)

好吧,我找到了解决方案。至于我,它似乎很小变态,但我的截止日期并不关心我的代码是多么精致。

可能会有人发现它很有用。

为什么要忽略FixedHeight?

因为最后绘制数字的单元格占用了一行中的所有可用空间。

可能的解决方案

我只能看到两种方式:

  • 显然,改变一行中的单元格顺序
  • 自行渲染行的中心部分

我决定选择第二种方式。 我没有使用rowpans / colspans创建十三个单元格并将它们添加到一行,而是仅添加三个单元格:

 cell = new PdfPCell(new Phrase(0, subComp.DescriptionMin, _nfDescr));
                            cell.MinimumHeight = 50;
                            cell.Padding = 5;
                            cell.BorderColor = BaseColor.WHITE;
                            cell.BackgroundColor = new BaseColor(233, 240, 242);
                            table.AddCell(cell);

                            cell = new PdfPCell();
                            cell.CellEvent = new CellEvents(subComp);
                            cell.BorderColor = BaseColor.WHITE;
                            table.AddCell(cell);

                            cell = new PdfPCell(new Phrase(subComp.DescriptionMax, _nfDescr));
                            cell.Padding = 5;
                            cell.BorderColor = BaseColor.WHITE;
                            cell.BackgroundColor = new BaseColor(233, 240, 242);
                            table.AddCell(cell);

我将自定义单元格事件添加到第二次出售。在设置单元格高度之后和布局渲染之前触发它。这是事件处理程序的代码:

 private class CellEvents : IPdfPCellEvent
{
    public void CellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases)
    {

        int scoreCellHeight = 20;

        var pdfContentByte = canvases[0];
        pdfContentByte.SaveState();

        pdfContentByte.Rectangle(pos.Left, pos.Bottom + scoreCellHeight, pos.Width, pos.Height - scoreCellHeight);
        pdfContentByte.SetColorFill(new BaseColor(233, 240, 242));
        pdfContentByte.Fill();


        ColumnText ct = new ColumnText(pdfContentByte);
        ct.SetSimpleColumn(new Phrase(_model.Name, _nfSubComp), pos.Left, pos.Bottom + 20, pos.Left + pos.Width, pos.Bottom + pos.Height - 5, 10, Element.ALIGN_CENTER);
        ct.Go();

        float scaleWidth = pos.Width / 10;

        for (int i = 1; i < 11; i++)
        {
            float scaleLeft = pos.Left + (i - 1) * pos.Width / 10;

            pdfContentByte.Rectangle(scaleLeft, pos.Bottom, scaleWidth, scoreCellHeight);

            pdfContentByte.SetColorFill(i % 2 == 1
                ? new BaseColor(Color.LightBlue)
                : new BaseColor(233, 240, 242));
            pdfContentByte.Fill();


            ct.SetSimpleColumn(new Phrase(i.ToString(), _nfScale), scaleLeft, pos.Bottom,
                    scaleLeft + scaleWidth, pos.Bottom + 7, 0, Element.ALIGN_CENTER);
            ct.Go();
        }
        canvases[0].RestoreState();
    }
}

我已经跳过了类构造函数和代码的一些细节,它们绘制了标记(屏幕截图上的红色数字)。

结果:

PDF_result

我想,这种解决方法不是最佳选择。但我不得不画一个红色标记,所以我不得不处理细胞渲染事件。

希望,有人可以展示正确的解决方案。