代码之家  ›  专栏  ›  技术社区  ›  achmad darmawan

水印到pdf无法正常工作

  •  1
  • achmad darmawan  · 技术社区  · 6 年前

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

    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 回复  |  直到 6 年前
        1
  •  1
  •   Bruno Lowagie    6 年前

    您正在使用 stamper.GetUnderContent(i) ,这表示您正在添加内容 在下面 现有内容。

    换句话说:水印 包括在 现有内容。如果现有内容不透明,水印将不可见。如果按Ctrl+A组合键,则可以看到形状,但在打印页面时无法看到。

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

    如何修复此问题?使用 stamper.GetOverContent(i) 而不是 压模。GetUnderContent(一)

    另外:为什么您仍在使用iTextSharp版本5或更早版本?当前版本为iText 7 for。网。请升级!