使用iTextSharp将水印添加到PDF不适用于图像PDF C#

使用iTextSharp将水印添加到PDF不适用于图像PDF C#,c#,.net,pdf,itext,C#,.net,Pdf,Itext,我正在使用下面的代码在PDF中添加水印。这是正常的工作正常文本PDF。如果包含图像,则水印不可见 public void AddWatermarkPdf() { PdfReader pdfReader = new PdfReader("SimpleArabic.pdf"); PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(DateTime.No

我正在使用下面的代码在PDF中添加水印。这是正常的工作正常文本PDF。如果包含图像,则水印不可见

public void AddWatermarkPdf()
      {
          PdfReader pdfReader = new PdfReader("SimpleArabic.pdf");
          PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(DateTime.Now.ToFileTime() 
         + "Out.pdf", FileMode.Create, FileAccess.Write, FileShare.None));
         iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance("WaterMarkDoc.png");
          img.SetAbsolutePosition(-200, -50);
          PdfContentByte waterMark;
          for (int pageIndex = 1; pageIndex <= pdfReader.NumberOfPages; pageIndex++)
          {
            Rectangle pagesize = pdfReader.GetCropBox(pageIndex);
            waterMark = pdfStamper.GetUnderContent(pageIndex);
            waterMark.AddImage(img);
          }
          pdfStamper.FormFlattening = true;
          pdfStamper.Close();
     }
   
public void AddWatermarkPdf()
{
PdfReader PdfReader=新PdfReader(“simplerabic.pdf”);
PdfStamper PdfStamper=newpdfstamper(pdfReader,newfilestream(DateTime.Now.ToFileTime())
+“Out.pdf”,FileMode.Create,FileAccess.Write,FileShare.None);
iTextSharp.text.Image img=iTextSharp.text.Image.GetInstance(“WaterMarkDoc.png”);
img.SetAbsolutePosition(-200,-50);
PdfContentByte水印;

对于(int pageIndex=1;pageIndex有两种方法可以添加水印:在现有内容下或在现有内容之上。出于您的预期目的,最好的方法是在PDF内容之上添加水印,水印设置为较低的不透明度

这是一个Java代码示例,但很容易转录:

受保护的无效操作EPDF(字符串dest)引发异常{
PdfDocument pdfDoc=新PdfDocument(新PDF阅读器(SRC)、新PDF编写器(DEST));
PdfFont font=PdfFontFactory.createFont(FontProgramFactory.createFont(StandardFonts.HELVETICA));
PdfCanvas over=新的PdfCanvas(pdfDoc.getFirstPage());
over.setFillColor(ColorConstants.BLACK);
段落p=新段落(“此水印添加在现有内容之上”)
.setFont(字体).setFontSize(15);
新画布(覆盖,pdfDoc,pdfDoc.getDefaultPageSize())
.showTextAligned(p,297500,1,TextAlignment.CENTER,VerticalAlignment.TOP,0);
p=新段落(“此透明水印添加在现有内容之上”)
.setFont(字体).setFontSize(15);
over.saveState();
PdfExtGState gs1=新的PdfExtGState();
gs1.不透明度(0.5f);
超过.setExtGState(gs1);
新画布(覆盖,pdfDoc,pdfDoc.getDefaultPageSize())
.showTextAligned(p,297450,1,TextAlignment.CENTER,VerticalAlignment.TOP,0);
结束。恢复遗产();
pdfDoc.close();
}
资料来源:iText知识库对此进行了详细解释:

编辑:

这是您正在使用的iText 5版本的C#示例:

 public class TransparentWatermark 
    {
        public static readonly String DEST = "results/sandbox/stamper/transparent_watermark.pdf";
        public static readonly String SRC = "../../../resources/pdfs/hero.pdf";

        public static void Main(String[] args) 
        {
            FileInfo file = new FileInfo(DEST);
            file.Directory.Create();
            
            new TransparentWatermark().ManipulatePdf(DEST);
        }

        protected void ManipulatePdf(String dest) 
        {
            PdfDocument pdfDoc = new PdfDocument(new PdfReader(SRC), new PdfWriter(dest));
            PdfCanvas under = new PdfCanvas(pdfDoc.GetFirstPage().NewContentStreamBefore(), new PdfResources(), pdfDoc);
            PdfFont font = PdfFontFactory.CreateFont(FontProgramFactory.CreateFont(StandardFonts.HELVETICA));
            Paragraph paragraph = new Paragraph("This watermark is added UNDER the existing content")
                    .SetFont(font)
                    .SetFontSize(15);
            
            Canvas canvasWatermark1 = new Canvas(under, pdfDoc.GetDefaultPageSize())
                    .ShowTextAligned(paragraph, 297, 550, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
            canvasWatermark1.Close();
            PdfCanvas over = new PdfCanvas(pdfDoc.GetFirstPage());
            over.SetFillColor(ColorConstants.BLACK);
            paragraph = new Paragraph("This watermark is added ON TOP OF the existing content")
                    .SetFont(font)
                    .SetFontSize(15);
            
            Canvas canvasWatermark2 = new Canvas(over, pdfDoc.GetDefaultPageSize())
                    .ShowTextAligned(paragraph, 297, 500, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
            canvasWatermark2.Close();
            paragraph = new Paragraph("This TRANSPARENT watermark is added ON TOP OF the existing content")
                    .SetFont(font)
                    .SetFontSize(15);
            over.SaveState();
            
            // Creating a dictionary that maps resource names to graphics state parameter dictionaries
            PdfExtGState gs1 = new PdfExtGState();
            gs1.SetFillOpacity(0.5f);
            over.SetExtGState(gs1);
            Canvas canvasWatermark3 = new Canvas(over, pdfDoc.GetDefaultPageSize())
                    .ShowTextAligned(paragraph, 297, 450, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
            canvasWatermark3.Close();
            over.RestoreState();
            
            pdfDoc.Close();
        }
    }

您的代码不会添加水印,而是在任何现有内容后面添加图像。图像上方显示的任何不透明对象(如其他图像)都会将其隐藏。使图像显示在其他图像下方的唯一方法是使现有图像透明