使用Java对PDF添加水印的操作代码

 更新时间:2025年10月24日 08:25:22   作者:LSTM97  
在当今数字化办公环境中,PDF 文档作为信息交流和存储的重要载体,其安全性和版权保护变得尤为关键,企业常常需要对内部敏感文档或对外发布的资料添加水印,以防止未经授权的使用,本文将为您揭示这一问题的解决方案,深入探讨如何使用Java对PDF添加水印,需要的朋友可以参考下

引言

在当今数字化办公环境中,PDF 文档作为信息交流和存储的重要载体,其安全性和版权保护变得尤为关键。企业常常需要对内部敏感文档或对外发布的资料添加水印,以防止未经授权的使用、泄露或篡改。那么,如何通过 Java 编程高效、灵活地实现 PDF 水印的添加呢?

本文将为您揭示这一问题的解决方案。我们将深入探讨如何利用功能强大且易于集成的 Spire.PDF for Java 库,为您的 PDF 文档添加专业的文本水印图片水印。通过本文提供的详细教程和可运行的代码示例,您将能够轻松掌握 PDF 水印技术,有效提升文档的安全性和专业性。

认识 Spire.PDF for Java 及其在水印处理中的优势

Spire.PDF for Java 是一款专为 Java 应用程序设计的专业 PDF 文档处理库。它提供了丰富的功能,包括 PDF 的创建、编辑、转换、合并、分割、加密解密以及各种高级操作,如表单填充、电子签名和我们今天要重点讨论的水印添加

该库具有以下显著优势:

  • 跨平台兼容性:支持 Windows、Linux、macOS 等多种操作系统,确保您的应用在不同环境下稳定运行。
  • 功能丰富:不仅限于水印,还涵盖了 PDF 处理的方方面面,满足企业级应用需求。
  • 易于集成:提供清晰的 API 接口和详细的文档,开发者可以快速上手并将其集成到现有项目中。
  • 高性能:优化了处理效率,能够快速处理大量 PDF 文档。
  • 灵活的水印配置:允许开发者精细控制水印的文本内容、字体、颜色、大小、透明度、旋转角度、位置等,以及图片水印的尺寸、位置和透明度。

如何获取和配置 Spire.PDF for Java 依赖

要开始使用 Spire.PDF for Java,您需要将其作为依赖添加到您的 Maven 项目中。

Maven 依赖示例:

<repositories>
    <repository>
        <id>e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.pdf</artifactId>
        <version>5.12.7</version> <!-- 请替换为最新版本 -->
    </dependency>
</dependencies>

如何使用 Java 添加文本水印到 PDF

添加文本水印是保护文档版权和防止滥用的常见方法。Spire.PDF for Java 提供了强大的功能来定制文本水印的外观。

以下是添加文本水印的详细步骤和代码示例:

  1. 加载 PDF 文档:使用 PdfDocument 类加载现有 PDF 文件。
  2. 创建水印内容:定义水印文本、字体、大小、颜色、旋转角度和透明度等属性。
  3. 遍历页面并应用水印:遍历 PDF 文档的每一个页面,并在页面上绘制水印。为了实现页面的平铺效果,通常会创建一个 PdfTilingBrush。
  4. 保存文档:将修改后的 PDF 文档保存到新文件或覆盖原文件。

关键文本水印属性及 API 方法

属性描述对应 API 方法/类
内容水印显示的文字PdfTilingBrush.getGraphics().drawString()
字体水印文本的字体PdfFont
大小水印文本的字号PdfFont
颜色水印文本的颜色PdfBrushes.getColor()
透明度水印的透明度(0-1,1为完全不透明)PdfTilingBrush.getGraphics().setTransparency()
旋转角度水印文本的旋转角度PdfTilingBrush.getGraphics().rotateTransform()
位置水印在页面上的起始位置PdfTilingBrush.getGraphics().translateTransform()

Java 代码示例:添加文本水印

import com.spire.pdf.*;
import com.spire.pdf.graphics.*;

import java.awt.*;
import java.awt.geom.Dimension2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.io.IOException;

public class AddTextWatermark {
    public static void main(String[] args) throws IOException {
        // 1. 加载PDF文档
        PdfDocument doc = new PdfDocument();
        doc.loadFromFile("input.pdf"); // 确保input.pdf存在

        // 水印文本
        String watermarkText = "公司机密 严禁转载";

        // 遍历PDF文档的每个页面
        for (int i = 0; i < doc.getPages().getCount(); i++) {
            PdfPageBase page = doc.getPages().get(i);

            // 创建一个尺寸与页面相同的模板,用于绘制水印
            PdfTemplate template = new PdfTemplate(page.getClientSize().getWidth(), page.getClientSize().getHeight());

            // 绘制水印到模板
            drawTextWatermarkToTemplate(template, watermarkText);

            // 创建一个矩形,覆盖整个页面,用于放置水印
            Rectangle2D loRect = new Rectangle2D.Float();
            loRect.setFrame(new Point2D.Float(0, 0), page.getClientSize());

            // 创建水印注释
            PdfWatermarkAnnotation watermarkAnnotation = new PdfWatermarkAnnotation(loRect);
            PdfAppearance appearance = new PdfAppearance(watermarkAnnotation);
            appearance.setNormal(template); // 将绘制了水印的模板设为水印注释的正常外观
            watermarkAnnotation.setAppearance(appearance);
            
            // 将水印注释添加到当前页面的注释集合中
            page.getAnnotationsWidget().add(watermarkAnnotation);
        }

        // 4. 保存带有水印的PDF文档
        doc.saveToFile("output_text_watermark.pdf");
        doc.close();
        System.out.println("文本水印添加成功!文件已保存为 output_text_watermark.pdf");
    }

    private static void drawTextWatermarkToTemplate(PdfTemplate template, String watermark) {
        // 创建一个刷子,用于平铺水印
        // 水印的尺寸设为模板宽度的一半,高度的三分之一,以实现重复平铺效果
        Dimension2D dimension2D = new Dimension();
        dimension2D.setSize(template.getWidth() / 2, template.getHeight() / 3);
        PdfTilingBrush brush = new PdfTilingBrush(dimension2D);

        // 设置水印的透明度为 0.3 (30%)
        brush.getGraphics().setTransparency(0.3f);

        // 保存当前图形状态
        brush.getGraphics().save();

        // 旋转水印,通常为负45度
        brush.getGraphics().rotateTransform(-45);

        // 设置字体和颜色
        PdfFont font = new PdfFont(PdfFontFamily.Helvetica, 24f, PdfFontStyle.Bold);
        PdfStringFormat format = new PdfStringFormat();
        format.setAlignment(PdfStringAlignment.Center);
        format.setLineAlignment(PdfVerticalAlignment.Middle);

        // 在刷子上绘制水印文本
        // 调整绘制位置,使其在刷子区域内居中
        brush.getGraphics().drawString(watermark, font, PdfBrushes.getGray(),
                (float) brush.getSize().getWidth() / 2, (float) brush.getSize().getHeight() / 2, format);

        // 恢复图形状态
        brush.getGraphics().restore();

        // 将绘制了水印的刷子应用到模板上
        template.getGraphics().drawRectangle(brush, new Rectangle2D.Float(0, 0, template.getWidth(), template.getHeight()));
    }
}

如何使用 Java 添加图片水印到 PDF

除了文本水印,图片水印(如公司 Logo、保密图章等)也是一种常见的文档保护手段。Spire.PDF for Java 同样支持添加图片水印,并提供灵活的配置选项。

以下是添加图片水印的详细步骤和代码示例:

  1. 加载 PDF 文档:使用 PdfDocument 加载现有 PDF 文件。
  2. 加载图片文件:使用 PdfImage.fromFile() 方法加载图片文件作为水印。
  3. 设置图片水印属性:定义图片水印的位置、大小、透明度和旋转角度。
  4. 遍历页面并应用水印:遍历 PDF 文档的每个页面,并在指定位置绘制图片。
  5. 保存文档:将修改后的 PDF 文档保存。

关键图片水印属性及 API 方法

属性描述对应 API 方法/类
来源水印图片文件的路径PdfImage.fromFile()
位置水印在页面上的 X, Y 坐标page.getCanvas().drawImage()
大小水印图片的宽度和高度page.getCanvas().drawImage()
透明度水印的透明度(0-1,1为完全不透明)PdfGraphics.setTransparency()
旋转角度水印图片的旋转角度PdfGraphics.rotateTransform()

Java 代码示例:添加图片水印

import com.spire.pdf.*;
import com.spire.pdf.graphics.*;

import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.io.IOException;

public class AddImageWatermark {
    public static void main(String[] args) throws IOException {
        // 1. 加载PDF文档
        PdfDocument doc = new PdfDocument();
        doc.loadFromFile("input.pdf"); // 确保input.pdf存在

        // 2. 加载图片文件作为水印
        PdfImage image = PdfImage.fromFile("watermark.png"); // 确保watermark.png存在

        // 遍历PDF文档的每个页面
        for (int i = 0; i < doc.getPages().getCount(); i++) {
            PdfPageBase page = doc.getPages().get(i);

            // 创建一个尺寸与页面相同的模板
            PdfTemplate template = new PdfTemplate(page.getClientSize().getWidth(), page.getClientSize().getHeight());

            // 设置模板的图形透明度
            template.getGraphics().setTransparency(0.2f); // 20% 透明度

            // 计算图片水印的位置和大小
            float imgWidth = image.getWidth() * 0.5f; // 图片宽度缩放为原始的50%
            float imgHeight = image.getHeight() * 0.5f; // 图片高度缩放为原始的50%
            
            // 将水印放置在页面中心
            float x = (page.getClientSize().getWidth() - imgWidth) / 2;
            float y = (page.getClientSize().getHeight() - imgHeight) / 2;

            // 绘制图片水印到模板
            template.getGraphics().drawImage(image, x, y, imgWidth, imgHeight);

            // 创建一个矩形,覆盖整个页面,用于放置水印
            Rectangle2D loRect = new Rectangle2D.Float();
            loRect.setFrame(new Point2D.Float(0, 0), page.getClientSize());

            // 创建水印注释
            PdfWatermarkAnnotation watermarkAnnotation = new PdfWatermarkAnnotation(loRect);
            PdfAppearance appearance = new PdfAppearance(watermarkAnnotation);
            appearance.setNormal(template); // 将绘制了水印的模板设为水印注释的正常外观
            watermarkAnnotation.setAppearance(appearance);

            // 将水印注释添加到当前页面的注释集合中
            page.getAnnotationsWidget().add(watermarkAnnotation);
        }

        // 4. 保存带有水印的PDF文档
        doc.saveToFile("output_image_watermark.pdf");
        doc.close();
        System.out.println("图片水印添加成功!文件已保存为 output_image_watermark.pdf");
    }
}

总结

通过本文的详细教程,您已经掌握了如何使用 Spire.PDF for Java 库为 PDF 文档添加文本水印图片水印的关键技术。我们深入探讨了 Spire.PDF for Java 的优势、依赖配置,并提供了清晰、可操作的代码示例,涵盖了水印内容设置、样式调整、透明度控制以及页面应用等核心环节。

Spire.PDF for Java 凭借其强大的功能和灵活的 API 设计,使得在 Java 应用程序中实现专业的 PDF 水印功能变得异常简单和高效。无论是为了保护企业机密、确保版权所有,还是提升文档的专业形象,掌握这一技术都将为您的项目带来显著价值。

现在,您可以将这些知识和代码应用于您的实际项目中,提升文档的安全性和管理水平。希望本文能为您在 Java PDF 处理领域提供有益的参考和帮助!

以上就是使用Java对PDF添加水印的操作代码的详细内容,更多关于Java对PDF添加水印的资料请关注脚本之家其它相关文章!

相关文章

  • 详解Spring Boot实战之Filter实现使用JWT进行接口认证

    详解Spring Boot实战之Filter实现使用JWT进行接口认证

    本篇文章主要介绍了详解Spring Boot实战之Filter实现使用JWT进行接口认证,具有一定的参考价值,有兴趣的可以了解一下
    2017-07-07
  • 详解SpringMVC的url-pattern配置及原理剖析

    详解SpringMVC的url-pattern配置及原理剖析

    这篇文章主要介绍了SpringMVC的url-pattern配置及原理剖析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • java中for循环删除集合陷阱

    java中for循环删除集合陷阱

    java中在增强for循环为什么不能增删集合呢?一个循环迭代,跟集合的增删改没什么关系。修改集合不是for去做的。for只管循环迭代,你在循环里边修改集合,改变集合的长度,顺序对循环都有影响
    2015-05-05
  • Java实体映射工具MapStruct使用方法详解

    Java实体映射工具MapStruct使用方法详解

    MapStruct是用于代码中JavaBean对象之间的转换,例如DO转换为DTO,DTO转换为VO,或Entity转换为VO等场景,这篇文章主要给大家介绍了关于Java实体映射工具MapStruct使用的相关资料,需要的朋友可以参考下
    2021-11-11
  • Java中使用注解校验手机号格式的详细指南

    Java中使用注解校验手机号格式的详细指南

    在现代的Web应用开发中,数据校验是一个非常重要的环节,本文将详细介绍如何在Java中使用注解对手机号格式进行校验,感兴趣的小伙伴可以了解下
    2025-03-03
  • 详解java 客户端链接不上redis解决方案

    详解java 客户端链接不上redis解决方案

    这篇文章主要介绍了详解java 客户端链接不上redis解决方案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-01-01
  • Spring 循环依赖之AOP实现详情

    Spring 循环依赖之AOP实现详情

    这篇文章主要介绍了Spring 循环依赖之AOP实现详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的盆友可以参考一下
    2022-07-07
  • Spring TaskScheduler使用实例解析

    Spring TaskScheduler使用实例解析

    这篇文章主要介绍了Spring TaskScheduler使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 大数组元素差异removeAll与Map效率对比

    大数组元素差异removeAll与Map效率对比

    这篇文章主要介绍了大数组元素差异removeAll与Map效率对比,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • SpringBoot中的Actuator详解

    SpringBoot中的Actuator详解

    这篇文章主要介绍了SpringBoot中的Actuator详解,Spring Boot Actuator 在Spring Boot第一个版本发布的时候就有了,它为Spring Boot提供了一系列产品级的特性,监控应用程序,收集元数据,运行情况或者数据库状态等,需要的朋友可以参考下
    2023-09-09

最新评论