【问题标题】:iTextSharp 7: Stamp with TransparencyiTextSharp 7:透明印章
【发布时间】:2017-02-02 17:15:22
【问题描述】:

谢天谢地,在一些帮助下,我使用以下代码让我的图章工作了:

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 进行标记的过程涉及使用外部图像文件——我确实这样做了。然而,与我的 Adob​​e 邮票不同,这些图像保留了它们的白色背景,因此不透明。在尝试将其变成透明的 PNG 时,我得到了一个奇怪的结果。我的邮票最终以黑色背景出现。我最初的假设是 Canvas 对象具有某种默认为黑色的填充颜色?您将如何将黑色填充设置为透明。

我尝试使用“图形状态”(PdfGState 状态),将其不透明度设置为 0,并将其应用到 Canvas。然而,这反过来又使我的邮票图像不可见。你如何解决这个问题?

【问题讨论】:

  • 冲压只是在现有内容之上或之下添加内容的术语,它不一定涉及外部图像,也可以是文本。也就是说,请看一下构建块教程本章中的透明背景图像示例:developers.itextpdf.com/content/itext-7-building-blocks/…。我刚刚浏览了代码(因此是评论而不是答案),但它应该为您提供水印的方法,这听起来像是您正在尝试做的事情。
  • @Samuel Huylebroeck 看到水印示例,不完全是我遇到的。然而,我寻找了一种不同的方式来标记我的标志。现在我正在叠加包含图章的 PDF。它工作得很好,但是一旦您将印章与 FormXObject(即包含印章的页面)相关联,尺寸就会变得混乱 - 或者更糟糕的是,印章不会出现。让我知道是否值得发布新代码。

标签: c# pdf annotations itext itext7


【解决方案1】:

好吧,在盯着屏幕看了几个小时之后,我才发现为什么我的邮票尺寸不正确。显然,包含要合并的 PDF 文件的 FormXObject 不存储它正在存储的页面的相应宽度和高度。当页面明显是横向时,它不仅会提供更大的高度,而且它也不能反映真实的页面大小。因此,使用 FormXObject.getWidth()FormXObject.getHeight() 会导致尺寸不正确,从而挤压印章图像。相反,使用与文件关联的 PdfDocument 进行合并,并相应地使用 Page().GetCropBox().GetWidth()Height

当然,这种误解不用说是基于我对 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();

【讨论】:

  • " 显然,包含要合并的 PDF 文件的 FormXObject 不存储它正在存储的页面的相应宽度和高度。" - 表单 XObject 具有尺寸页面 MediaBox,而不是其 CropBox
猜你喜欢
  • 1970-01-01
  • 2022-06-21
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多