Adding Image watermark to Pdf while Creating it using iTextSharp

Wonder if this possible. Saw many posts on adding watermark after the pdf is created and saved in disk. But during creation of document how do i add a image watermark. I know how to add a image to document. But how do i position it such that it comes at the end of page.

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

For C#, use this code…

//new Document

Document DOC = new Document();


// open Document

DOC.Open();


//create New FileStream with image "WM.JPG"

FileStream fs1 = new FileStream("WM.JPG", FileMode.Open);


iTextSharp.text.Image JPG = iTextSharp.text.Image.GetInstance(System.Drawing.Image.FromStream(fs1), ImageFormat.Jpeg);


//Scale image

JPG.ScalePercent(35f);


//Set position

JPG.SetAbsolutePosition(130f,240f);

//Close Stream

fs1.Close();


DOC.Add(JPG);

Method 2

This is essentially identical to adding a header or footer.

You need to create a class that implements PdfPageEvent, and in the OnPageEnd, grab the page’s PdfContentByte, and draw your image there. Use an absolute position.

Note: You probably want to derive from PdfPageEventHelper, it has empty implementations of all the page events, so you just need to write the method you actually care about.

Note: Unless your image is mostly transparent, drawing it on top of your page will cover up Many Things. IIRC (“If I Recall Correctly”), PNG and GIF files added by iText will automatically be properly masked, allowing things under them to show through.

If you want to add an opaque image underneath everything, you should override OnStartPage() instead.

This is Java, but converting it is mostly a matter of capitalizing method names and swapping get/set calls for property access.

Image watermarkImage = new Image(imgPath);
watermarkImage.setAbsolutePosition(x, y);

writer.setPageEvent( new MyPageEvent(watermarkImage) );


public MyPageEvent extends PdfPageEventHelper {
  private Image waterMark;
  public MyPageEvent(Image img) {
    waterMark = img;
  }
  public void OnEndPage/*OnStartPage*/(PdfWriter writer, Document doc) {
    PdfContentByte content = writer.getContent();
    content.addImage( waterMark );
  }
}

Method 3

This is the accepted answer’s port to C#, and what worked for me. I’m using an A4 page size:

Define this BackgroundImagePdfPageEvent class:

public class BackgroundImagePdfPageEvent : PdfPageEventHelper
{
    private readonly Image watermark;

    public BackgroundImagePdfPageEvent(string imagePath)
    {
        using (var fs = new FileStream(imagePath, FileMode.Open))
        {
            watermark = Image.GetInstance(System.Drawing.Image.FromStream(fs), ImageFormat.Jpeg);
            watermark.SetAbsolutePosition(0, 0);
            watermark.ScaleAbsolute(PageSize.A4.Width, PageSize.A4.Height);
            watermark.Alignment = Image.UNDERLYING;
        }
    }

    public override void OnStartPage(PdfWriter writer, Document document)
    {
        document.Add(watermark);
    }
}

Then, when creating your document:

var doc = new Document(PageSize.A4);
doc.SetMargins(60f, 60f, 120f, 60f);
var outputStream = new MemoryStream();
var writer = PdfWriter.GetInstance(doc, outputStream);
var imagePath = "PATH_TO_YOUR_IMAGE";
writer.PageEvent = new BackgroundImagePdfPageEvent(imagePath);


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x