首页 > 解决方案 > iText 7水印画布在某些特殊的3d pdf中未正确显示

问题描述

我一直在使用 iText7 最新的 .net 包在 pdf 文档上创建水印注释。我看到大多数noraml pdf文件的水印都正确地印在了所需的位置,但是对于一些特殊的3d(尺寸)pdf文件,水印奇怪地没有正确出现,我相信水印的某些部分正在被另一个切割3d 图层。这是经历的失真的屏幕截图。我试图理解和解决这个问题,但无法得到任何线索。有人可以帮忙吗?这是示例 pdf,以供您查看。

在此处输入图像描述

这是我用来嵌入水印的非常简短的相关代码。

            float watermarkTrimmingRectangleWidth = 500;
            float watermarkTrimmingRectangleHeight = 500;
            float formWidth = 500;
            float formHeight = 500;
            float formXOffset = -40;
            float formYOffset = 0;
            float xTranslation = 50;
            float yTranslation = 25;
            double rotationInRads = Math.PI / 4.2;

 PdfDocument pdfDoc = new PdfDocument(new PdfReader(filePath), new PdfWriter(destinationfile));
 var numberOfPages = pdfDoc.GetNumberOfPages();
 PdfPage page = null;

            for (var i = 1; i <= numberOfPages; i++)
            {
                
                page = pdfDoc.GetPage(i);
                Rectangle ps = page.GetPageSize();              

                float bottomLeftX = ps.GetWidth() / 2 - watermarkTrimmingRectangleWidth / 2;                    
                float bottomLeftY = ps.GetHeight() / 2 - watermarkTrimmingRectangleHeight / 2;                  

                Rectangle watermarkTrimmingRectangle = new Rectangle(bottomLeftX, bottomLeftY, ps.GetWidth(), watermarkTrimmingRectangleHeight);
               
                PdfWatermarkAnnotation watermark = new PdfWatermarkAnnotation(watermarkTrimmingRectangle);
              
                AffineTransform transform = new AffineTransform();
                transform.Translate(xTranslation, yTranslation);
                
                transform.Rotate(rotationInRads);
                PdfFixedPrint fixedPrint = new PdfFixedPrint();
                watermark.SetFixedPrint(fixedPrint);                  
               
                Rectangle formRectangle = new Rectangle(formXOffset, formYOffset, formWidth, formHeight);

                //Observation: font XObject will be resized to fit inside the watermark rectangle
                PdfFormXObject form = new PdfFormXObject(formRectangle);
                PdfExtGState gs1 = new PdfExtGState().SetFillOpacity(0.8f).SetStrokeOpacity(1.5f);
                PdfCanvas canvas = new PdfCanvas(form, pdfDoc);
                float[] transformValues = new float[6];
                transform.GetMatrix(transformValues);

                canvas.SaveState()
                    .BeginText().SetExtGState(gs1)
                    .SetTextMatrix(transformValues[0], transformValues[1], transformValues[2], transformValues[3], transformValues[4], transformValues[5])
                    .SetFontAndSize(font, fontSize)
                    .ShowText("Restricted Internal")
                    .EndText()
                    .RestoreState();

                canvas.Release();
                watermark.SetAppearance(PdfName.N, new PdfAnnotationAppearance(form.GetPdfObject()));
                watermark.SetFlags(PdfAnnotation.READ_ONLY);
                page.AddAnnotation(watermark);
                
            }
            page?.Flush();
            pdfDoc.Close();

标签: c#pdfitext

解决方案


您的水印注释绘制在某些表单字段之上。
因为页面元素的显示顺序是页面内容、注释、表单域,所以你的注释外观被表单域挡住了。


推荐阅读