使用iTextSharp PdfStamper在现有PDF上叠加图像

时间:2011-02-08 20:29:08

标签: c# itextsharp

我可以使用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选择将新图像放在现有图像下面。

提前致谢。

1 个答案:

答案 0 :(得分:2)

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

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

选项(如果我是对的):

添加您自己的注释

为此,我使用带有LAYOUT_ICON_ONLY的PushbuttonField。将图像绘制为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(),setHorizo​​ntalAdjustment(),setVerticalAdjustment(),setProportionalIcon()以及其他几个来使您的图像看起来完全符合您的需求。

在一次通过中展平,将您的图像添加到另一个

如果现有的图像注释是iText可以展平的东西(可能,也许不是),你可以在两遍中做你想做的事。第一遍只是“setFormFlattening(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);