当前位置: 代码网 > it编程>编程语言>Java > Java基于iText7实现PDF添加通用文本水印的示例详解

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

2026年02月05日 Java 我要评论
本文介绍如何使用 java 在 pdf 文档上添加通用的文字水印,示例基于 itext7,强调实现思路和关键 api,便于在任意项目中复用或扩展。1. 方案概览目标:在现有 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水印的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com