我使用以下代码在我的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);
}
}
结果如下:
正如您所看到的,每行中具有数字的单元格的高度不同。似乎忽略了cell.FixedHeight属性。
有没有办法设定这些细胞的固定高度?
答案 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();
}
}
我已经跳过了类构造函数和代码的一些细节,它们绘制了标记(屏幕截图上的红色数字)。
结果:
我想,这种解决方法不是最佳选择。但我不得不画一个红色标记,所以我不得不处理细胞渲染事件。
希望,有人可以展示正确的解决方案。