C# 使用iTextSharp PdfStamper在现有PDF上覆盖图像

C# 使用iTextSharp PdfStamper在现有PDF上覆盖图像,c#,itextsharp,C#,Itextsharp,我能够使用PDFStamper和PdfContentByte content.AddImage方法将图像覆盖到现有PDF文档上 当现有文档的顶部已经覆盖了一个图像时,我的问题就出现了。你可以看到我试图覆盖的小图像的上边缘。它明显隐藏在现有图像覆盖下 我在尝试将我的覆盖图像显示在现有图像覆盖的顶部时遇到问题 我的代码: System.Drawing.Image bitmap PdfReader pdfReader = new PdfReader(pathToOriginalPdf); PdfSt

我能够使用PDFStamper和PdfContentByte content.AddImage方法将图像覆盖到现有PDF文档上

当现有文档的顶部已经覆盖了一个图像时,我的问题就出现了。你可以看到我试图覆盖的小图像的上边缘。它明显隐藏在现有图像覆盖下

我在尝试将我的覆盖图像显示在现有图像覆盖的顶部时遇到问题

我的代码:

System.Drawing.Image bitmap

PdfReader pdfReader = new PdfReader(pathToOriginalPdf);
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(pathToTimestampedPdf, FileMode.Create, FileAccess.Write, FileShare.None));

MemoryStream imageStream = new MemoryStream();
bitmap.Save(imageStream, ImageFormat.Bmp);
byte[] bitmapBytes = imageStream.ToArray();

iTextSharp.text.Image image = Image.GetInstance(bitmapBytes);

PdfContentByte underContent;

try
{
    underContent = pdfStamper.GetOverContent(1);
    underContent.AddImage(image);
}
我需要一种方法,要么将现有的图像覆盖层展平到PDF内容上,要么设置z顺序,以便我新添加的覆盖层可以位于顶部

出于某种原因,PdfStamper选择将新图像置于现有图像的下方


提前谢谢。

如果我们能看到有问题的PDF,那会有所帮助。这样我们就不用猜了,我们就知道了

尽管如此,我怀疑您的“现有图像覆盖”是注释的一部分。您放入页面内容中的任何内容都不会出现在批注上方

选项(如果我是对的):

添加您自己的注释 为此,我将使用一个仅带有布局图标的按钮字段。将图像绘制到
PdfTemplate
,并将其用于按钮的“图标”

注释的Z顺序由页面注释数组的顺序决定。新注释将附加到此数组。没问题

PushbuttonField fld = new PushbuttonField(stamper.getWriter(), box, name);
fld.setLayout(PushbuttonField.LAYOUT_ICON_ONLY);
fld.setImage(myImage);

stamper.addAnnotation(fld.getField(), 1);
您可能需要使用setScaleIcon()、setHorizontalAdjustment()、setVerticalAdjustment()、setProtorolicon()和其他一些工具,才能使图像看起来完全符合您的需要

在一个过程中展平,在另一个过程中添加图像 如果现有的图像注释是iText可以展平的(可能是,可能不是),您可以在两个过程中完成您想要的操作。第一步是“setFormFlatting(true);close();”,而第二步是您现在正在做的所有事情

ByteArrayOutputStream output = new ByteArrayOutputStream();
PdfStamper stamper = new PdfStamper( firstReader, output );
stamper.setFormFlattening(true);
stamper.setFreeTextFlatten(true);  // probably not needed.
stamper.close();

PdfReader secondReader = new PdfReader(output.toByteArray());
FileOutputStream finalOutput = new FileOutputStream( outputPath );
stamper = new PdfStamper(secondReader, finalOutput);
// do your thing here.
stamper.getOverContent(1).addImage(image);
以下链接提供了答案