【问题标题】:Place image in the center of PdfPCell and have overflow to cell iTextSharp将图像放在 PdfPCell 的中心并溢出到单元格 iTextSharp
【发布时间】:2017-07-25 04:49:44
【问题描述】:

我正在尝试使用 ItextSharp 将图像放置在 PdfPCell 中。我想将图像放在垂直/水平中心并且图像将适合中心裁剪(以隐藏图像的其余部分)我发现的唯一方法是 ScaleAbsolute 拉伸图像并且看起来很糟糕,另一个是 ScaleToFit哪个不填满单元格的所有空间。有没有办法在单元格中显示图像(如 overflor:hidden html)

@mkl 你好。我尝试了您的解决方案,然后.... WOWW 看起来它以正确的方式工作。唯一的问题是代码在纵向图像上工作得很好,在横向图像上几乎很好。我可以做些什么来解决这个问题? (它只发生在方形区域的横向图像上,代码在高度区域上工作得很好

【问题讨论】:

  • 使用单元格事件添加图片。
  • @Elidotnet 您能否使用 Bruno 的提示实施解决方案,或者您还需要帮助吗?
  • @mkl 仍然需要帮助
  • @Elidotnet 好的,参见。我的回答

标签: c# itext


【解决方案1】:

正如 Bruno 在评论中已经提到的,您必须使用单元格事件来执行自定义缩放和剪辑任务。

即单元格最初是在没有图像的情况下“布局”的,完成后,将使用单元格的位置和尺寸以及表格画布触发单元格事件。现在您可以随心所欲地绘制图像,缩放(或旋转,或倾斜,...)和任意剪裁。

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


例如,如果您拍摄这张图片:

并且想要将它放入一个宽度是它的高度的四倍的单元格中,在一个全宽的单列表中,应用您描述的缩放和剪辑,您可以这样做(假设 @ 987654326@ 是您的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();
    }
}

(如您所见,scale 因子被选为您所需布局的 scaleXscaleY 的最大值。如果您选择最小值,则结果将是 ScaleToFit 版本你原来的例子。或者如果你选择一个比最大值高一点的值,你会放大到图像的中心。)

结果如下:

【讨论】:

  • 我将一些图片和代码上传到您的解决方案(抱歉发布我的图片作为答案,我不知道如何使用图片和代码进行评论)
  • 抱歉发布我的图片作为答案,我不知道如何使用图片和代码进行评论 - 您应该编辑您的问题以添加额外信息。
  • 感谢您提供出色的解决方案。你知道如何完成这个问题吗?当图像处于横向模式时,需要一些正方形区域的帮助
  • @Elidotnet 啊,好吧,我误解了您的要求,我认为就像在您最初的示例中一样,您的图像对于单元格来说总是很高,但是您的新示例表明它们也可能太宽了。我会调整解决方案。
  • @Elidotnet 我相应地调整了ImageEvent.CellLayout 中的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 2015-11-09
  • 2016-01-12
  • 1970-01-01
  • 2021-06-15
  • 2014-03-04
  • 2010-11-13
相关资源
最近更新 更多