Java基于iText7实现PDF添加通用文本水印的示例详解

 更新时间:2026年02月05日 11:32:54   作者:Reboot  
这篇文章主要为大家详细介绍了Java基于iText7实现PDF添加通用文本水印的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

本文介绍如何使用 Java 在 PDF 文档上添加通用的文字水印,示例基于 iText7,强调实现思路和关键 API,便于在任意项目中复用或扩展。

1. 方案概览

目标:在现有 PDF 文件的每一页上添加居中、斜向、半透明的文字水印,例如「xx公司」。

适用场景

  • 预览/下载前对 PDF 加防泄露水印;
  • 批量归档 PDF 时统一添加版权信息;
  • 按用户或租户动态生成个性化水印(用户名、时间、IP 等)。

核心技术栈

  • Java 8+;
  • iText7(com.itextpdf:itext7-core);
  • 如需中文,建议引入中文字体依赖(如 font-asian 或自备 TTF/OTF 字体)。

2. 基本依赖配置示例(Maven)

<dependencies>
    <!-- iText7 主依赖(PDF 内核) -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext7-core</artifactId>
        <version>7.2.5</version>
        <type>pom</type>
    </dependency>
​
    <!-- 可选:中文字体支持(也可以使用自带 TTF 字体文件) -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>font-asian</artifactId>
        <version>7.2.5</version>
    </dependency>
</dependencies>

实际版本号可按项目统一依赖管理调整。

3. 实现思路

使用 PdfReader 读取原始 PDF 输入流(或文件)。

使用 PdfWriter 将处理结果写入输出流(内存或新文件)。

构造 PdfDocument 与高级布局对象 Document

选择合适的字体(特别是包含中文的字体)。

遍历 PDF 的每一页,计算页面中心坐标,在对应页上绘制水印 Paragraph

  • 文本内容:例如「xx公司」或某个动态字符串;
  • 字体、字号、颜色、透明度;
  • 旋转角度(如 45°)与对齐方式(居中)。

关闭文档,输出带水印的 PDF。

4. 示例代码:为每页添加对角线文字水印

import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.kernel.colors.DeviceRgb;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.properties.TextAlignment;
import com.itextpdf.layout.properties.VerticalAlignment;
​
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
​
public class PdfWatermarkUtil {
​
    /**
     * 为 PDF 每一页添加斜向文字水印
     *
     * @param pdfInput     原始 PDF 输入流
     * @param watermark    水印文本(如 "xx公司")
     * @return 带水印 PDF 的字节数组
     */
    public static byte[] addTextWatermark(InputStream pdfInput, String watermark) throws Exception {
        try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
            PdfReader reader = new PdfReader(pdfInput);
            PdfWriter writer = new PdfWriter(out);
            PdfDocument pdfDoc = new PdfDocument(reader, writer);
            Document document = new Document(pdfDoc);
​
            PdfFont font = createFont();
​
            int totalPages = pdfDoc.getNumberOfPages();
            for (int i = 1; i <= totalPages; i++) {
                Rectangle pageSize = pdfDoc.getPage(i).getPageSize();
                float x = (pageSize.getLeft() + pageSize.getRight()) / 2;
                float y = (pageSize.getTop() + pageSize.getBottom()) / 2;
​
                Paragraph p = new Paragraph(watermark)
                        .setFont(font)
                        .setFontSize(60)
                        .setFontColor(new DeviceRgb(192, 192, 192))
                        .setOpacity(0.3f);
​
                document.showTextAligned(
                        p,
                        x, y, i,
                        TextAlignment.CENTER,
                        VerticalAlignment.MIDDLE,
                        (float) Math.toRadians(45)
                );
            }
​
            document.close();
            pdfDoc.close();
            return out.toByteArray();
        }
    }
​
    /**
     * 创建字体(示例:使用系统或自带的中文字体)
     */
    private static PdfFont createFont() throws Exception {
        // 示例:使用内置字体或自带 TTF 文件
        // 1)若有自定义字体:
        // return PdfFontFactory.createFont("/path/to/simsun.ttf", PdfEncodings.IDENTITY_H, true);
        // 2)简化示例:使用内置字体(不保证完整中文支持)
        return PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H", true);
    }
}

5. 关键点与扩展建议

字体选择:对中文 PDF,尽量使用包含中文的 TTF/OTF 字体文件,并通过 PdfEncodings.IDENTITY_H 创建嵌入字体,避免乱码。

透明度与字号:可根据实际打印/预览效果调整水印的字号和 setOpacity,在可见与不干扰阅读之间取得平衡。

动态水印:业务代码中通常不会写死「xx公司」,而是将水印文案作为参数传入,例如「xx公司(机密)」或「用户名+时间戳」。

性能考虑:对于非常大的 PDF(页数很多),可以:

  • 控制只对部分页面加水印;
  • 或在异步任务/批处理服务中执行水印操作。

安全性:水印不能防止专业的 PDF 编辑/篡改,但对一般用户的泄露行为有一定威慑与追责作用,可结合权限控制一同使用。

6. 总结

使用 iText7 给 PDF 添加文字水印的核心就是:读取现有 PDF → 遍历页面 → 在每页叠加一层半透明文本。上面的封装方法只依赖 InputStream 与文案字符串,便于集成到上传、下载或文件转换链路中,实现统一的 PDF 水印策略。

以上就是Java基于iText7实现PDF添加通用文本水印的示例详解的详细内容,更多关于Java iText7添加PDF水印的资料请关注脚本之家其它相关文章!

相关文章

  • 在Spring Boot中使用Spark Streaming进行实时数据处理和流式计算的步骤

    在Spring Boot中使用Spark Streaming进行实时数据处理和流式计算的步骤

    这篇文章主要介绍了在Spring Boot中使用Spark Streaming进行实时数据处理和流式计算,通过本文的介绍,我们了解了在Spring Boot中使用Spark Streaming进行实时数据处理和流式计算的详细步骤,需要的朋友可以参考下
    2024-03-03
  • 避免Java内存泄漏的10个黄金法则详细指南

    避免Java内存泄漏的10个黄金法则详细指南

    在Java开发领域,内存泄漏是一个经久不衰的话题,也是导致应用程序性能下降、崩溃甚至系统瘫痪的常见原因,下面我们就来看看避免Java内存泄漏的10个黄金法则吧
    2025-07-07
  • Java List 使用举例(从入门到精通)

    Java List 使用举例(从入门到精通)

    本文系统讲解Java List,涵盖基础概念、核心特性、常用实现(如ArrayList、LinkedList)及性能对比,介绍创建、操作、遍历方法,结合实战案例,提供选择策略和优化技巧,帮助高效使用List,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • zuul转发后服务取不到请求路径的解决

    zuul转发后服务取不到请求路径的解决

    这篇文章主要介绍了zuul转发后服务取不到请求路径的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java 单链表数据结构的增删改查教程

    Java 单链表数据结构的增删改查教程

    这篇文章主要介绍了Java 单链表数据结构的增删改查教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Java web Hibernate如何与数据库链接

    Java web Hibernate如何与数据库链接

    这篇文章主要介绍了Java web Hibernate如何与数据库链接,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Spring Boot+Nginx实现大文件下载功能

    Spring Boot+Nginx实现大文件下载功能

    相信很多小伙伴,在日常开放中都会遇到大文件下载的情况,大文件下载方式也有很多,比如非常流行的分片下载、断点下载;当然也可以结合Nginx来实现大文件下载,在中小项目非常适合使用,这篇文章主要介绍了Spring Boot结合Nginx实现大文件下载,需要的朋友可以参考下
    2024-05-05
  • SpringCloud Bus组件的使用配置详解

    SpringCloud Bus组件的使用配置详解

    bus称之为springcloud中消息总线,主要用来在微服务系统中实现远端配置更新时通过广播形式通知所有客户端刷新配置信息,避免手动重启服务的工作,这篇文章主要介绍了SpringCloud Bus组件的使用,需要的朋友可以参考下
    2022-03-03
  • java组件SmartUpload和FileUpload实现文件上传功能

    java组件SmartUpload和FileUpload实现文件上传功能

    这篇文章主要为大家详细介绍了java组件SmartUpload和FileUpload实现文件上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • 通过实例解析Spring组合注解与元注解

    通过实例解析Spring组合注解与元注解

    这篇文章主要介绍了通过实例解析Spring组合注解与元注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11

最新评论