c# itextsharp PDF creation with watermark on each page

后端 未结 7 1216
Happy的楠姐
Happy的楠姐 2020-12-04 15:39

I am trying to programmatically create a number of PDF documents with a watermark on each page using itextsharp (a C# port of Java\'s itext).

I am able to do this

相关标签:
7条回答
  • 2020-12-04 16:07

    Although Tim's solution seems very nice, I have managed to do the same thing (I believe) using the following code (perhaps iTextSharp was improved a bit since then...):

        private byte[] AddWatermark(byte[] bytes, BaseFont bf)
        {
            using(var ms = new MemoryStream(10 * 1024))
            {
                using(var reader = new PdfReader(bytes))
                using(var stamper = new PdfStamper(reader, ms))
                {
                    int times = reader.NumberOfPages;
                    for (int i = 1; i <= times; i++)
                    {
                        var dc = stamper.GetOverContent(i);
                        PdfHelper.AddWaterMark(dc, AppName, bf, 48, 35, new BaseColor(70, 70, 255), reader.GetPageSizeWithRotation(i));
                    }
                    stamper.Close();
                }
                return ms.ToArray();
            }
        }
    
        public static void AddWaterMark(PdfContentByte dc, string text, BaseFont font, float fontSize, float angle, BaseColor color, Rectangle realPageSize, Rectangle rect = null)
        {
            var gstate = new PdfGState { FillOpacity = 0.1f, StrokeOpacity = 0.3f };
            dc.SaveState();
            dc.SetGState(gstate);
            dc.SetColorFill(color);
            dc.BeginText();
            dc.SetFontAndSize(font, fontSize);
            var ps = rect ?? realPageSize; /*dc.PdfDocument.PageSize is not always correct*/
            var x = (ps.Right + ps.Left) / 2;
            var y = (ps.Bottom + ps.Top) / 2;
            dc.ShowTextAligned(Element.ALIGN_CENTER, text, x, y, angle);
            dc.EndText();
            dc.RestoreState();
        }
    

    This will add a watermark on all pages of a PDF document that is provided as a byte array.

    (You don't need to do it while creating the PDF.)

    It seems working for both landscape and portrait and it probably works for documents with mixed orientations.

    Cheers! :)

    0 讨论(0)
  • 2020-12-04 16:13

    I used the first solution. I was having trouble getting it to work at first. I getting green underlines under all of my public voids saying that it was going to hide some inherit member.

    Basically I realized that I already had added a PagePageEventHelper and I basically just cut out the code for the OnStartPage. ALSO! For some reason I had to make all of my public void's public override void.

      public override void OnStartPage(PdfWriter writer, Document document)
            {
                if (condition)
                {
                    string watermarkText = "-whatever you want your watermark to say-";
                    float fontSize = 80;
                    float xPosition = 300;
                    float yPosition = 400;
                    float angle = 45;
                    try
                    {
                        PdfContentByte under = writer.DirectContentUnder;
                        BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED);
                        under.BeginText();
                        under.SetColorFill(iTextSharp.text.pdf.CMYKColor.LIGHT_GRAY);
                        under.SetFontAndSize(baseFont, fontSize);
                        under.ShowTextAligned(PdfContentByte.ALIGN_CENTER, watermarkText, xPosition, yPosition, angle);
                        under.EndText();
                    }
                    catch (Exception ex)
                    {
                        Console.Error.WriteLine(ex.Message);
                    }
                }
            }
    
    0 讨论(0)
  • 2020-12-04 16:16

    Yes, the Watermark class seems to be no more - odd. However in the process of converting to iTextSharp 5.3, I found a simple way to add a watermark to a new document.

    MemoryStream mem = new MemoryStream();
    
    Document document = new Document();
    
    PdfWriter writer = PdfWriter.GetInstance(document, mem);
    
    PdfContentByte cb = writer.DirectContent;
    
    document.Open();
    
    document.NewPage();
    
    Image watermark = Image.GetInstance(WATERMARK_URI);
    
    watermark.SetAbsolutePosition(80, 200);
    
    document.Add(watermark);
    
    BaseFont bf = BaseFont.CreateFont(FONT, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
    
    cb.BeginText();
    
    ...
    
    cb.EndText();
    
    document.Close();
    
    0 讨论(0)
  • 2020-12-04 16:18

    Can't you just lay down the watermark on each page after you've made it?

    0 讨论(0)
  • 2020-12-04 16:27

    In iTextSharp you should be able to programmatically add a watermark e.g.

    Watermark watermark = new Watermark(Image.getInstance("watermark.jpg"), 200, 420);
    document.Add(watermark);
    
    0 讨论(0)
  • 2020-12-04 16:30
    string WatermarkLocation = "D:\\Images\\superseded.png";
    
        Document document = new Document();
        PdfReader pdfReader = new PdfReader(FileLocation);
        PdfStamper stamp = new PdfStamper(pdfReader, new FileStream(FileLocation.Replace(".pdf", "[temp][file].pdf"), FileMode.Create));
    
        iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(WatermarkLocation);
        img.SetAbsolutePosition(125, 300); // set the position in the document where you want the watermark to appear (0,0 = bottom left corner of the page)
    
    
    
        PdfContentByte waterMark;
        for (int page = 1; page <= pdfReader.NumberOfPages; page++)
        {
            waterMark = stamp.GetOverContent(page);
            waterMark.AddImage(img);
        }
        stamp.FormFlattening = true;
        stamp.Close();
    
        // now delete the original file and rename the temp file to the original file
        File.Delete(FileLocation);
        File.Move(FileLocation.Replace(".pdf", "[temp][file].pdf"), FileLocation);
    
    0 讨论(0)
提交回复
热议问题