iTextSharp 7:带透明度的邮票

时间:2017-02-02 17:15:22

标签: c# pdf annotations itext itext7

谢天谢地,在一些帮助下,我使用以下代码完成了我的印章:

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,并将其应用于画布。然而,这反过来也使我的印章图像也不可见。你是如何解决这个问题的?

1 个答案:

答案 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();