水印到pdf不能很好地工作

时间:2018-04-04 03:49:20

标签: c# itext watermark

我有代码在用户上传文件时创建水印。水印在中间页面和页脚页面中创建。但我的问题是水印工作并不完美,具体取决于上传文件内容的内容。有关详细信息,请注意以下图片:

enter image description here

enter image description here

enter image description here

这是我的代码:

    public bool InsertWaterMark(string path)
    {
        bool valid = true;
        string FileDestination = AppDomain.CurrentDomain.BaseDirectory + "Content/" + path;
        string FileOriginal = AppDomain.CurrentDomain.BaseDirectory + "Content/" + path.Replace("FileTemporary", "FileOriginal");
        System.IO.File.Copy(FileDestination, FileOriginal);
        string watermarkText = "Controlled Copy";

        PdfReader reader = new PdfReader(FileOriginal);            
        using (FileStream fs = new FileStream(FileDestination, FileMode.Create, FileAccess.Write, FileShare.None))
        {
            using (PdfStamper stamper = new PdfStamper(reader, fs))
            {
                int pageCount = reader.NumberOfPages; 
                for (int i = 1; i <= pageCount; i++)
                {
                    PdfContentByte cbCenter = stamper.GetUnderContent(i);
                    PdfGState gState = new PdfGState();
                    cbCenter.BeginText();
                    iTextSharp.text.Rectangle rect = reader.GetPageSize(i);
                    cbCenter.SetColorFill(BaseColor.GRAY);                                       
                    gState.FillOpacity = 0.15f;
                    cbCenter.SetGState(gState);
                    cbCenter.SetFontAndSize(BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 80);                       
                    cbCenter.ShowTextAligned(PdfContentByte.ALIGN_CENTER, watermarkText, rect.Width / 2, rect.Height / 2, 45f);
                    cbCenter.EndText();

                    PdfContentByte cbFooter = stamper.GetUnderContent(i);
                    PdfGState gStateFooter = new PdfGState();
                    cbFooter.BeginText(); 
                    cbFooter.SetColorFill(BaseColor.RED);                        
                    gStateFooter.FillOpacity = 1f;
                    cbFooter.SetGState(gStateFooter);      
                    cbFooter.SetFontAndSize(BaseFont.CreateFont(BaseFont.HELVETICA_OBLIQUE, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 12);      
                    cbFooter.ShowTextAligned(PdfContentByte.ALIGN_CENTER, '"' + "When printed, this documents are considered uncontrolled" + '"', 300.7f, 10.7f, 0);
                    cbFooter.EndText();
               } 
            }
        }
        reader.Close();
        return valid;
    }

请更正我的代码并提供解决方案。 谢谢你的进步

1 个答案:

答案 0 :(得分:0)

您正在使用<Setter Property="Font",这意味着您要在现有内容下添加内容。

换句话说:水印涵盖的existsong内容。如果现有内容不透明,则水印将不可见。如果您执行Ctrl + A,您将能够看到形状,但在打印页面时您将看不到它。

在示例ALFA中,您会在现有文本下看到水印,因为现有文本没有背景。在示例CARLIE中,您看不到它,因为文本具有覆盖水印的白色背景。

如何解决这个问题?使用stamper.GetUnderContent(i)代替stamper.GetOverContent(i)

另外:为什么你还在使用iTextSharp版本5或更早版本?目前的版本是针对.NET的iText 7。请升级!