Adding and removing watermarks in PDF documents play a crucial role in document management, copyright protection, and information security. A watermark can serve as a visual marker, such as a company logo, copyright notice, or the word "Confidential", indicating the source, status, or ownership of the document.
Spire.PDF provides a method for adding watermarks by embedding watermark annotations within the PDF document. This approach affords the flexibility to remove the watermark post-insertion, offering users greater control and options. This article will introduce how to add or remove watermark annotations in PDF documents using Spire.PDF for Java in Java projects.
Install Spire.PDF for Java
First of all, you're required to add the Spire.Pdf.jar file as a dependency in your Java program. The JAR file can be downloaded from this link. If you use Maven, you can easily import the JAR file in your application by adding the following code to your project's pom.xml file.
<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>10.10.7</version> </dependency> </dependencies>
Add Watermark Annotations to PDF in Java
Spire.PDF provides a method to add watermark annotations to PDF pages using the PdfWatermarkAnnotation object. Notably, watermarks added by this method can be easily removed later. Here are the key steps involved:
- Initialize an instance of the PdfDocument class.
- Load a PDF document using the PdfDocument.loadFromFile() method.
- Create a PdfTrueTypeFont font object to draw the watermark text.
- Create a Rectangle2D type object to define the boundary of the page.
- Use a for loop to iterate over all PdfPageBase objects in the PDF document.
- Create a PdfTemplate object for drawing the watermark, setting its size to match the current page.
- Call a custom insertWatermark() method to draw the watermark content onto the PdfTemplate object.
- Create a PdfWatermarkAnnotation object and define the position where the watermark should be placed.
- Create a PdfAppearance object to configure the visual effects of the watermark.
- Use the PdfAppearance.setNormal(PdfTemplate) method to associate the PdfTemplate object with the PdfAppearance object.
- Use the PdfWatermarkAnnotation.setAppearance(PdfAppearance) method to associate the PdfAppearance object with the PdfWatermarkAnnotation object.
- Add the watermark annotation to the page by calling PdfPageBase.getAnnotationsWidget().add(PdfWatermarkAnnotation).
- Save the changes to a file using the PdfDocument.saveToFile() method.
- Java
import com.spire.pdf.*; import com.spire.pdf.annotations.*; import com.spire.pdf.annotations.appearance.*; import com.spire.pdf.graphics.*; import java.awt.*; import java.awt.geom.*; public class AddWatermarkInPDF { public static void main(String[] args) { // Create a PdfDocument object PdfDocument pdfDocument = new PdfDocument(); // Load the PDF document from a file pdfDocument.loadFromFile("Sample1.pdf"); // Set the font style Font font = new Font("Arial", Font.PLAIN, 22); // Create a PdfTrueTypeFont object for subsequent text rendering PdfTrueTypeFont trueTypeFont = new PdfTrueTypeFont(font); // Get the page object PdfPageBase page; // Define the watermark text String watermarkAnnotationText = "ID_0"; // Create a size object Dimension2D dimension2D = new Dimension(); // Create a rectangle object Rectangle2D loRect = new Rectangle2D.Float(); // Iterate through each page in the PDF for (int i = 0; i < pdfDocument.getPages().getCount(); i++) { // Get the current page page = pdfDocument.getPages().get(i); // Set the size object to the size of the current page dimension2D.setSize(page.getClientSize().getWidth(), page.getClientSize().getHeight()); // Set the rectangle object frame, which is the entire page range loRect.setFrame(new Point2D.Float(0, 0), dimension2D); // Create a PdfTemplate object to draw the watermark PdfTemplate template = new PdfTemplate(page.getClientSize().getWidth(), page.getClientSize().getHeight()); // Insert the watermark insertWatermark(template, trueTypeFont, "Non Editable"); // Create a PdfWatermarkAnnotation object to define the watermark position PdfWatermarkAnnotation watermarkAnnotation = new PdfWatermarkAnnotation(loRect); // Create a PdfAppearance object to set the watermark appearance PdfAppearance appearance = new PdfAppearance(watermarkAnnotation); // Set the normal state template of the watermark appearance.setNormal(template); // Set the appearance to the watermark object watermarkAnnotation.setAppearance(appearance); // Set the watermark text watermarkAnnotation.setText(watermarkAnnotationText); // Set the watermark print matrix to control the watermark's position and size watermarkAnnotation.getFixedPrint().setMatrix(new float[]{1, 0, 0, 1, 0, 0}); // Set the horizontal offset watermarkAnnotation.getFixedPrint().setHorizontalTranslation(0.5f); // Set the vertical offset watermarkAnnotation.getFixedPrint().setVerticalTranslation(0.5f); // Add the watermark to the page's annotation widget page.getAnnotationsWidget().add(watermarkAnnotation); } // Save the PDF document to a file pdfDocument.saveToFile("AddWatermark.pdf"); // Close and release the PDF document resources pdfDocument.dispose(); } static void insertWatermark(PdfTemplate template, PdfTrueTypeFont font, String watermark) { // Create a Dimension2D object to set the size of the watermark Dimension2D dimension2D = new Dimension(); // Set the size of the watermark to half the width and one third the height of the template dimension2D.setSize(template.getWidth() / 2, template.getHeight() / 3); // Create a PdfTilingBrush object for repeating pattern fill of the watermark PdfTilingBrush brush = new PdfTilingBrush(dimension2D); // Set the transparency of the watermark to 0.3 brush.getGraphics().setTransparency(0.3F); // Start a group of graphic state saves brush.getGraphics().save(); // Translate the graphics context so its center aligns with the center of the watermark tile brush.getGraphics().translateTransform((float) brush.getSize().getWidth() / 2, (float) brush.getSize().getHeight() / 2); // Rotate the graphics context to tilt the watermark at 45 degrees brush.getGraphics().rotateTransform(-45); // Draw the watermark text in the graphics context using the specified font, color, and centered alignment brush.getGraphics().drawString(watermark, font, PdfBrushes.getGray(), 0, 0, new PdfStringFormat(PdfTextAlignment.Center)); // End the group of graphic state saves and restore brush.getGraphics().restore(); // Reset the watermark transparency to 1, i.e., completely opaque brush.getGraphics().setTransparency(1); // Create a Rectangle2D object to define the area for filling the watermark Rectangle2D loRect = new Rectangle2D.Float(); // Set the fill area for the watermark to cover the entire size of the template loRect.setFrame(new Point2D.Float(0, 0), template.getSize()); // Draw the watermark on the template using the watermark tile template.getGraphics().drawRectangle(brush, loRect); } }
Remove Watermark Annotations from PDF in Java
Spire.PDF can remove watermark annotations added to PDF pages via the PdfWatermarkAnnotation object. Here are the detailed steps:
- Initialize an instance of the PdfDocument class.
- Load a PDF document using the PdfDocument.loadFromFile() method.
- Iterate over every PdfPageBase object in the PDF document using a for loop.
- Retrieve all annotations on the current page using the PdfPageBase.getAnnotationsWidget() method.
- Again, use a for loop to iterate over every annotation object on the current page, filtering out annotations of type PdfWatermarkAnnotationWidget.
- Determine the target watermark annotation by invoking the PdfWatermarkAnnotationWidget.getText() method and perform the deletion operation.
- Save the changes to a file using the PdfDocument.saveToFile() method.
- Java
import com.spire.pdf.*; import com.spire.pdf.annotations.*; public class RemoveWatermarkFromPDF { public static void main(String[] args) { // Create a PdfDocument object PdfDocument pdfDocument = new PdfDocument(); // Load the PDF document from a file pdfDocument.loadFromFile("Sample2.pdf"); // Define a string ID to match and remove a specific watermark String id = "ID_0"; // Iterate through every page in the PDF document for (int i = 0; i < pdfDocument.getPages().getCount(); i++) { // Get all annotations on the current page PdfAnnotationCollection annotationWidget = pdfDocument.getPages().get(i).getAnnotationsWidget(); // Iterate through all annotations on the current page for (int j = 0; j < annotationWidget.getCount(); j++) { // Check if the current annotation is a watermark annotation if (annotationWidget.get(j) instanceof PdfWatermarkAnnotationWidget) { // If the watermark text equals the ID, remove the watermark if (annotationWidget.get(j).getText().equals(id)) { annotationWidget.remove(annotationWidget.get(j)); } } } } // Save the modified PDF document to a new file pdfDocument.saveToFile("RemoveWatermark.pdf"); // Dispose of the PdfDocument object resources pdfDocument.dispose(); } }
Apply for a Temporary License
If you'd like to remove the evaluation message from the generated documents, or to get rid of the function limitations, please request a 30-day trial license for yourself.