DEV Community

Alexis
Alexis

Posted on

Java: Add One-Line or Multi-Line Text Watermarks to PDF

PDF watermarks serve as a means of identifying ownership, indicating confidentiality, or showing status of the PDF file by placing text or images under or in front of its content. This article will show you how to add a one-line or multi-line text watermark to PDF in Java, and how to set the position, opacity, size, and angle of the watermarks, by using Spire.PDF for Java.

Add Spire.Pdf.jar as dependency

If you are working on a maven project, you can include the dependency in pom.xml file using this:

<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.pdf</artifactId>
        <version>8.8.3</version>
    </dependency>
</dependencies>
Enter fullscreen mode Exit fullscreen mode

If you are not using maven, then you can find the required jar files from the zip file available in this location. Include all the jar files into the application lib folder to run the sample code given in this tutorial.

Add One-Line Text Watermark to PDF in Java

Below are the steps to add a one-line text watermark to PDF using Spire.PDF for Java.

  • Create a PdfDocument object.
  • Load a PDF file using PdfDocument.loadFromFile() method.
  • Specify the watermark text and font.
  • Move the coordinate system of a page to an appropriate position.
  • Draw the text watermark at the specified location.
  • Save the document to another PDF file using PdfDocument.saveToFile() method.
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.graphics.PdfBrushes;
import com.spire.pdf.graphics.PdfTrueTypeFont;

import java.awt.*;
import java.awt.geom.Dimension2D;

public class AddOneLineTextWatermark {

    public static void main(String[] args) {

        //Create a PdfDocument object
        PdfDocument pdf = new PdfDocument();

        //Load a sample PDF document
        pdf.loadFromFile("C:/Users/Administrator/Desktop/Terms of Service.pdf");

        //Create a PdfTrueTypeFont object
        PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Arial", Font.PLAIN,50), true);

        //Set the watermark text
        String text = "CONFIDENTIAL";

        //Measure the text size
        Dimension2D textSize = font.measureString(text);

        //Calculate the values of two offset variables,
        //which will be used to calculate the translation amount of the coordinate system
        float offset1 = (float)(textSize.getWidth() * Math.sqrt(2) / 4);
        float offset2 = (float)(textSize.getHeight() * Math.sqrt(2) / 4);

        //Traverse all the pages in the document
        for (int i = 0; i < pdf.getPages().getCount(); i++) {

            PdfPageBase page = pdf.getPages().get(i);

            //Set the page transparency
            page.getCanvas().setTransparency(0.8f);

            //Translate the coordinate system by specified coordinates
            page.getCanvas().translateTransform(page.getCanvas().getSize().getWidth() / 2 - offset1 - offset2, page.getCanvas().getSize().getHeight() / 2 + offset1 - offset2);

            //Rotate the coordinate system 45 degrees counterclockwise
            page.getCanvas().rotateTransform(-45);

            //Draw watermark text on the page
            page.getCanvas().drawString(text, font, PdfBrushes.getDarkGray(), 0, 0);
        }


        //Save the changes to another file
        pdf.saveToFile("output/OneLineTextWatermark.pdf");
    }
}

Enter fullscreen mode Exit fullscreen mode

onelinewatermark

Add Multi-Line Text Watermark to PDF in Java

The following are the steps add a muti-line text watermark to PDF.

  • Create a PdfDocument object
  • Load a sample PDF document using PdfDocument.loadFromFile() method.
  • Create a custom method insertMultiLineTextWatermark(PdfPageBase page, String watermarkText, PdfTrueTypeFont font, int rowNum, int columnNum) to add multi-line text watermarks to a PDF page. The parameters rowNum and columnNum specify the row and column number of the tiled watermarks.
  • Traverse all pages in the document, and call the custom method insertMultiLineTextWatermark() to apply watermarks to each page.
  • Save the document to another file using PdfDocument.saveToFile() method.
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.graphics.PdfBrushes;
import com.spire.pdf.graphics.PdfTilingBrush;
import com.spire.pdf.graphics.PdfTrueTypeFont;

import java.awt.*;
import java.awt.geom.Dimension2D;

public class AddMultiLineWatermarkToPDF {

    public static void main(String[] args) {

        //Create a PdfDocument instance
        PdfDocument pdf = new PdfDocument();

        //Load a sample PDF document
        pdf.loadFromFile("C:/Users/Administrator/Desktop/Terms of Service.pdf");

        //Create a PdfTrueTypeFont object
        PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Arial", Font.PLAIN, 20), true);

        //Traverse all the pages
        for (int i = 0; i < pdf.getPages().getCount(); i++) {

            //Call insertMultiLineTextWatermark() method to add text watermarks to the specified page
             insertMultiLineTextWatermark(pdf.getPages().get(i), "Internal Use Only", font, 3, 3);
        }

        //Save the document to another file
        pdf.saveToFile("output/MultiLineTextWatermark.pdf");
    }

    //Create a custom method to insert multi-line text watermarks to a page
    static void insertMultiLineTextWatermark(PdfPageBase page, String watermarkText, PdfTrueTypeFont font, int rowNum, int columnNum) {

        //Measure the text size
        Dimension2D textSize = font.measureString(watermarkText);

        //Calculate the values of two offset variables, which will be used to calculate the translation amount of coordinate system
        double offset1 = textSize.getWidth() * Math.sqrt(2) / 4;
        double offset2 = textSize.getHeight() * Math.sqrt(2) / 4;

        //Create a tile brush
        PdfTilingBrush brush = new PdfTilingBrush(new Dimension((int) page.getActualSize().getWidth() / columnNum, (int) page.getActualSize().getHeight() / rowNum));
        brush.getGraphics().setTransparency(0.3f);
        brush.getGraphics().save();
        brush.getGraphics().translateTransform(brush.getSize().getWidth() / 2 - offset1 - offset2, brush.getSize().getHeight() / 2 + offset1 - offset2);
        brush.getGraphics().rotateTransform(-45);

        //Draw watermark text on the tile brush
        brush.getGraphics().drawString(watermarkText, font, PdfBrushes.getDarkGray(), 0, 0);
        brush.getGraphics().restore();

        //Draw a rectangle (that covers the whole page) using the tile brush
        page.getCanvas().drawRectangle(brush, 0, 0, page.getActualSize().getWidth(), page.getActualSize().getHeight());
    }
}

Enter fullscreen mode Exit fullscreen mode

multilinewatermark

Top comments (3)

Collapse
 
lexiebkm profile image
Alexander B.K.

Nice article. Is JDK 8 enough to write this app ?

Collapse
 
alexis92 profile image
Alexis

Yes, it is.

Collapse
 
lexiebkm profile image
Alexander B.K.

Thanks. I will try the pdf library you use here.