谢天谢地,在一些帮助下,我使用以下代码完成了我的印章:
PdfReader reader = new PdfReader(source);
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdfDoc = new PdfDocument(reader, writer);
Rectangle crop = pdfDoc.GetPage(1).GetCropBox();
Debug.WriteLine("CropBox Rectangle Dim "+crop);
float w = 0;
float h = 0;
ImageData img = ImageDataFactory.Create(imgsrc);
float iWidth = img.GetWidth();
float iHeight = img.GetHeight();
if (crop.GetWidth() > crop.GetHeight())
{
w = crop.GetWidth();
h = crop.GetHeight();
}
else
{
w = crop.GetHeight();
h = crop.GetWidth();
}
Debug.WriteLine("Width = "+w+" and Height = "+h);
Rectangle location = new Rectangle(crop.GetLeft(),crop.GetBottom(),iWidth/4,iHeight/4);
PdfStampAnnotation stamp = new PdfStampAnnotation(location).SetStampName(new PdfName("Logo"));
PdfFormXObject xObj = new PdfFormXObject(new Rectangle(iWidth, iHeight));
PdfCanvas canvas = new PdfCanvas(xObj, pdfDoc);
canvas.AddImage(img, 0, 0,iWidth, false);
stamp.SetNormalAppearance(xObj.GetPdfObject());
stamp.SetFlags(PdfAnnotation.PRINT);
pdfDoc.GetFirstPage().AddAnnotation(stamp);
pdfDoc.Close();
如果我没有弄错,使用iText标记的过程涉及使用外部图像文件 - 我这样做了。但是,与我的Adobe邮票不同,图像保留其白色背景,因此不透明。在试图将其变成透明的PNG时,我最终得到了一个奇怪的结果。我的邮票最终显示为黑色背景。我最初的假设是 Canvas 对象有某种默认为黑色的填充颜色?您如何将黑色填充设置为透明。
我尝试使用“图形状态”( PdfGState状态),将其不透明度设置为0,并将其应用于画布。然而,这反过来也使我的印章图像也不可见。你是如何解决这个问题的?
答案 0 :(得分:0)
好吧,经过几个小时的盯着屏幕后,我发现了为什么我的邮票尺寸不正确的困难。显然,包含要合并的PDF文件的 FormXObject 不会存储其存储的页面的相应宽度和高度。当页面清晰显示时,它不仅可以提供更高的高度,而且还不能反映真实的页面大小。因此,使用 FormXObject.getWidth()和 FormXObject.getHeight()会导致压缩标记图像的尺寸不正确。相反,使用与文件关联的 PdfDocument 来合并并相应地使用 Page()。GetCropBox()。GetWidth()和高度。
当然,毋庸置疑,这种误解是基于我对 FormXObject 真正做什么的假设。
以下是感兴趣的人的最终代码,请注意它包含一些未使用的变量和主要用于调试的不相关行:
PdfReader reader = new PdfReader(src);
PdfWriter writer = new PdfWriter(dest);
// Document to be edited and documented to be merged in
PdfDocument newDoc = new PdfDocument(reader, writer);
PdfDocument srcDoc = new PdfDocument(new PdfReader(stampsrc));
// CropBox And Dimensions
Rectangle crop = newDoc.GetFirstPage().GetCropBox();
float width = crop.GetWidth();
float height = crop.GetHeight();
// Create FormXObject and Canvas
PdfFormXObject page = srcDoc.GetPage(1).CopyAsFormXObject(newDoc);
//Extract Page Dimensions
float xWidth = srcDoc.GetFirstPage().GetCropBox().GetWidth();
float xHeight = srcDoc.GetFirstPage().GetCropBox().GetHeight();
Rectangle location = new Rectangle(crop.GetLeft(), crop.GetBottom(), xWidth , xHeight );
PdfStampAnnotation stamp = new PdfStampAnnotation(location).SetStampName(new PdfName("Logo"));
PdfCanvas canvas = new PdfCanvas(newDoc.GetFirstPage().NewContentStreamBefore(), newDoc.GetFirstPage().GetResources(), newDoc);
// canvas.AddXObject(page,location.GetLeft(),location.GetBottom(),page.GetWidth());
stamp.SetNormalAppearance(page.GetPdfObject());
stamp.SetFlags(PdfAnnotation.PRINT);
newDoc.GetFirstPage().AddAnnotation(stamp);
srcDoc.Close();
newDoc.Close();