【问题标题】:How to insert image in a Rectangle using iTextSharp如何使用 iTextSharp 在矩形中插入图像
【发布时间】:2018-01-19 13:17:16
【问题描述】:

我尝试在彩色矩形上放置图像,但图像没有出现。

请提出任何答案。

这是我的代码:-

pcb.RoundRectangle(iXCoordinate + 5, iYCoordinate, 500, 100, 5);
pcb.SetRGBColorFill(198, 226, 255);
pcb.Fill();
pcb.RoundRectangle(iXCoordinate + 5, iYCoordinate, 500, 100, 5); pcb.Stroke();
pcb.ResetRGBColorFill();

pcb.BeginText();
pcb.SetFontAndSize(BaseFont.CreateFont(@"C:\Windows\Fonts\arial.ttf", BaseFont.CP1252, false), 10);
pcb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, sCustomerName, iXCoordinate + 30, iYCoordinate, 0); iYCoordinate -= 12;
pcb.EndText();

iTextSharp.text.Image myImage = iTextSharp.text.Image.GetInstance(@"D:\Maruti\Resources\logo.jpg");
myImage.SetAbsolutePosition(iXCoordinate + 410, iYCoordinate - 40);
myImage.ScaleAbsoluteHeight(35);
myImage.ScaleAbsoluteWidth(80);
doc.Add(myImage);

【问题讨论】:

  • 您的代码不是独立的。你可以改变你的例子吗?
  • myImage=...之后设置断点并检查是否加载(非空),同时检查iXCoordinate和iYCoordinate
  • 也请分享一个样本结果pdf进行分析。
  • 感谢您的快速回复。先生,请访问帖子@mkl中的链接PDF示例
  • 也就是说,图像可能大部分被矩形隐藏,在矩形的右下角附近只有一点可见吗?在这种情况下,您的描述 “图像未出现” 将是错误的,因为它显然确实出现了。

标签: c# itext


【解决方案1】:

在您的代码中,您将表单和文本的即时绘制结合到页面内容流(使用您最有可能从您的PdfWriter 检索为DirectContentPdfContentByte pcb)和通过 iText 布局间接绘制图像机制(使用Document doc)。

以这种混合方式添加的元素不一定会按照您在代码中添加它们的顺序出现在结果内容中。例如,在您的情况下,您最后添加的图像(通过Document)实际上首先出现在内容流中,然后是您通过DirectContent 添加的所有内容。因此,图像(部分)被之后绘制的圆角矩形覆盖。

通常您可以通过仅使用DocumentDirectContent 在同一页面区域中绘制来防止这种情况。例如,在您的情况下,您也应该将图像添加到DirectContent,而不是Document。对于这个替换

doc.Add(myImage);

通过

pcb.AddImage(myImage);

由于现在您的所有绘图都是使用DirectContent 完成的,因此图像是在圆角矩形之后绘制的,因此是完全可见的。


不过,关于您的其他代码的两个注意事项:

  • 你先定义一个路径,然后设置填充颜色再填充路径:

    pcb.RoundRectangle(iXCoordinate + 5, iYCoordinate, 500, 100, 5);
    pcb.SetRGBColorFill(198, 226, 255);
    pcb.Fill();
    

    严格来说,这会创建一个无效的内容流,因为 PDF 规范明确要求在路径定义和匹配的路径绘制操作之间可能只有一个剪切路径运算符。不过,许多 PDF 查看器会接受无效的内容流。

    因此,您应该在pcb.RoundRectangle 之前拉起pcb.SetRGBColorFill

  • 如果你想描边和填充相同的路径,你可以只定义一次路径并调用pcb.FillStroke()而不是定义它两次,一次使用Fill(),一次使用Stroke()。 /p>

因此,绘制表单的更简单和更正确的方法是

pcb.SetRGBColorFill(198, 226, 255);
pcb.RoundRectangle(iXCoordinate + 5, iYCoordinate, 500, 100, 5);
pcb.FillStroke();
pcb.ResetRGBColorFill();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    相关资源
    最近更新 更多