Add a Diagonal Watermark to PDF in C#

Manipulate PDF, Shapes
8/29/2011

Downloads

This code sample shows how to add a diagonal watermark to an existing PDF in C#.

pdf-add-watermark.PNG

static void Main(string[] args)
{
  using (FileStream sourceFile = 
    new FileStream("original.pdf", FileMode.Open, FileAccess.Read))
  {
    // open the document
    Document pdf = new Document(sourceFile);
    foreach (Page page in pdf.Pages)
    {
      // stamp each page
      addWatermark(page);
    }

    // save the modified pdf
    using (FileStream targetFile = 
      new FileStream("watermarked.pdf", FileMode.Create, FileAccess.Write))
    {
      pdf.Write(targetFile);
    }
  }
}
Using sourceFile As New FileStream("..\..\input.pdf", FileMode.Open, FileAccess.Read)
    ' open the document
    Dim pdf As New Document(sourceFile)
    For Each page As Page In pdf.Pages
        ' stamp each page
        addWatermark(page)
    Next

    ' save the modified pdf
    Using targetFile As New FileStream("..\..\output.pdf", FileMode.Create, FileAccess.Write)
        pdf.Write(targetFile)
    End Using
End Using

The following method adds the watermark to PDF.

static void addWatermark(Page page)
{
  // calculate the page diagonal
  double diagonal = Math.Sqrt(page.Height * page.Height + page.Width * page.Width);

  // format the text
  TextShape watermark = new TextShape();
  watermark.Text = "Diagonal watermark";
  watermark.Font = Font.CourierBold;
  watermark.Pen = new Pen(RgbColor.Red, 2);
  watermark.Brush = null;
  watermark.FontSize = 1; // recalculated below

  // calculate font size so to fit the diagonal of the page - 0.8 is a fuzzy factor
  watermark.FontSize *= 0.8 * (diagonal / watermark.MeasuredWidth);

  // transform the text so that it runs diagonal across the page
  TransformCollection transforms = new TransformCollection();
  transforms.Add(new TranslateTransform(0, -0.5 * watermark.MeasuredHeight));
  transforms.Add(new TranslateTransform((diagonal - watermark.MeasuredWidth) / 2, 0));
  transforms.Add(new RotateTransform(-(180 / Math.PI) * Math.Atan2(page.Height, page.Width)));
  watermark.Transform = transforms;

  page.Overlay.Add(watermark);
}
Private Sub addWatermark(page As Page)
    ' calculate the page diagonal
    Dim diagonal As Double = Math.Sqrt(page.Height * page.Height + page.Width * page.Width)

    ' format the text
    Dim watermark As New TextShape()
    watermark.Text = "Diagonal watermark"
    watermark.Font = Font.CourierBold
    watermark.Pen = New Pen(RgbColor.Red, 2)
    watermark.Brush = Nothing
    watermark.FontSize = 1
    ' recalculated below
    ' calculate font size so to fit the diagonal of the page - 0.8 is a fuzzy factor
    watermark.FontSize *= 0.8 * (diagonal / watermark.MeasuredWidth)

    ' transform the text so that it runs diagonal across the page
    Dim transforms As New TransformCollection()
    transforms.Add(New TranslateTransform(0, -0.5 * watermark.MeasuredHeight))
    transforms.Add(New TranslateTransform((diagonal - watermark.MeasuredWidth) / 2, 0))
    transforms.Add(New RotateTransform(-(180 / Math.PI) * Math.Atan2(page.Height, page.Width)))
    watermark.Transform = transforms

    page.Overlay.Add(watermark)
End Sub