将图像放在PdfPCell的中心并溢出到单元格iTextSharp

时间:2017-07-25 04:49:44

标签: c# itext

我正在尝试使用ItextSharp将图像放置在PdfPCell中。我想将图像放在vert / horiz中心,并且图像适合中心裁剪(隐藏图像的其余部分)我找到的唯一方法是ScaleAbsolute拉伸图像并且看起来很糟糕而另一个是ScaleToFit哪个不填充细胞的所有空间。有没有办法在单元格中显示图像(如overflor:hidden html)enter image description here

@mkl您好。我尝试你的解决方案....它看起来像它以正确的方式工作伟大。唯一的问题是代码与肖像图像配合得很好,而且景观图像也很好。我可以做些什么来解决这个问题? (它只发生在方形区域的景观图像上,代码与高度区域一起工作

enter image description here

1 个答案:

答案 0 :(得分:1)

正如Bruno在评论中提到的那样,您必须使用单元格事件进行自定义缩放和裁剪任务。

即。最初在没有图像的情况下“放置”单元格,并且当完成时,单元格事件由单元格的位置和尺寸以及表格画布触发。现在,您可以根据需要绘制图像,缩放(或旋转,或倾斜,......)并任意剪裁。

这当然意味着你必须确保表单元格不会崩溃(毕竟在“布局”期间它是空的),例如通过设置FixedHeight或相邻单元格来强制执行所需的高度。

例如,如果你拍这张照片:

Willi, a CKCS

并希望将其放入宽度是其高度的四倍的单元格中,在全宽单列表中,应用您描述的缩放和剪裁,您可以这样做(假设{ {1}}是您的document个实例):

Document

使用单元格事件助手类

Image itextImage = RETRIEVE YOUR IMAGE AS ITEXTSHARP IMAGE;

PdfPCell cell = new PdfPCell()
{
    FixedHeight = (document.PageSize.Width - document.LeftMargin - document.RightMargin) / 4,
    CellEvent = new ImageEvent(itextImage)
};

PdfPTable table = new PdfPTable(1);
table.WidthPercentage = 100;
table.AddCell("Above the image");
table.AddCell(cell);
table.AddCell("Below the image");
document.Add(table);

(如您所见,class ImageEvent : IPdfPCellEvent { Image image; public ImageEvent(Image image) { this.image = image; } public void CellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases) { PdfContentByte canvas = canvases[0]; float scaleX = position.Width / image.Width; float scaleY = position.Height / image.Height; float scale = Math.Max(scaleX, scaleY); image.ScaleToFit(image.Width * scale, image.Height * scale); image.SetAbsolutePosition((position.Left + position.Right - image.ScaledWidth) / 2, (position.Bottom + position.Top - image.ScaledHeight) / 2); canvas.SaveState(); canvas.Rectangle(position.Left, position.Bottom, position.Width, position.Height); canvas.Clip(); canvas.NewPath(); canvas.AddImage(image); canvas.RestoreState(); } } 因子被选为所需布局的scalescaleX的最大值。如果您选择最小值,结果将是是原始示例的scaleY版本。或者,如果您选择的值略高于最大值,则可以进一步缩放到图像的中心。)

,结果如下:

Screenshot of the table