当前位置: 首页 > news >正文

Java 对 PDF 文件添加水印

Java 对 PDF 文件添加水印

在实际开发中,我们可能需要对 PDF 文件添加水印,例如公司标识、版权信息等。本文介绍如何使用 Java 及 iText 库向 PDF 文件添加水印。


1. 引入 iText 依赖

iText 是一个强大的 PDF 处理库,支持创建、修改 PDF 文件。要使用 iText,请在 pom.xml 文件中添加以下 Maven 依赖:

<dependencies>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext7-core</artifactId>
        <version>7.1.16</version>
    </dependency>
</dependencies>

2. 添加文本水印

以下示例展示了如何向 PDF 每一页添加半透明的文本水印:

import com.itextpdf.kernel.colors.ColorConstants;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.*;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.properties.TextAlignment;

import java.io.File;
import java.io.IOException;

public class PdfWatermark {
    public static void main(String[] args) throws IOException {
        String src = "input.pdf";
        String dest = "output.pdf";

        PdfDocument pdfDoc = new PdfDocument(new PdfReader(src), new PdfWriter(dest));
        int numberOfPages = pdfDoc.getNumberOfPages();

        for (int i = 1; i <= numberOfPages; i++) {
            PdfPage page = pdfDoc.getPage(i);
            Rectangle pageSize = page.getPageSize();
            PdfCanvas over = new PdfCanvas(page);
            Canvas canvas = new Canvas(over, pageSize);

            Paragraph watermark = new Paragraph("CONFIDENTIAL")
                    .setFontSize(50)
                    .setFontColor(ColorConstants.GRAY)
                    .setOpacity(0.3f);
            
            canvas.showTextAligned(watermark,
                    pageSize.getWidth() / 2,
                    pageSize.getHeight() / 2,
                    TextAlignment.CENTER,
                    (float) Math.toRadians(45));
        }
        
pdfDoc.close();
        System.out.println("水印添加完成!");
    }
}

说明

  • 读取已有 PDF 并创建新的 PDF 文件。
  • 遍历所有页面,绘制文本水印。
  • setOpacity(0.3f) 使水印半透明。
  • showTextAligned 方法可调整水印位置和旋转角度。

3. 添加图片水印

如果需要使用图片作为水印,可以使用 Image 类:

import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.*;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.element.Image;

import java.io.IOException;

public class PdfImageWatermark {
    public static void main(String[] args) throws IOException {
        String src = "input.pdf";
        String dest = "output_with_image_watermark.pdf";
        String watermarkPath = "watermark.png";

        PdfDocument pdfDoc = new PdfDocument(new PdfReader(src), new PdfWriter(dest));
        ImageData imageData = ImageDataFactory.create(watermarkPath);
        int numberOfPages = pdfDoc.getNumberOfPages();

        for (int i = 1; i <= numberOfPages; i++) {
            PdfPage page = pdfDoc.getPage(i);
            Rectangle pageSize = page.getPageSize();
            PdfCanvas over = new PdfCanvas(page);
            Canvas canvas = new Canvas(over, pageSize);
            
            Image watermark = new Image(imageData);
            watermark.setOpacity(0.3f)
                     .scaleToFit(pageSize.getWidth() / 2, pageSize.getHeight() / 2)
                     .setFixedPosition(pageSize.getWidth() / 4, pageSize.getHeight() / 4);
            
            canvas.add(watermark);
        }
        
pdfDoc.close();
        System.out.println("图片水印添加完成!");
    }
}

说明

  • 读取 PDF 文件和水印图片。
  • 使用 setOpacity(0.3f) 让水印透明。
  • scaleToFit 控制图片大小。
  • setFixedPosition 设置水印位置。

4. 结论

通过 iText,我们可以轻松地为 PDF 添加文本或图片水印。以上代码可根据需求进行调整,如:

  • 修改水印字体、颜色、透明度。
  • 动态调整水印位置。
  • 处理加密 PDF(需要解密后再添加水印)。

希望本教程对你有所帮助!🚀

相关文章:

  • 利用 MATLAB/Simulink 建立完整的控制系统模型,并进行阶跃响应和负载扰动响应仿真
  • 算法与数据结构(和为K的子数组)
  • 深入解析 .NET 中的依赖项加载机制:原理、实现与最佳实践
  • 一人系统 之 为什么要做一人系统?
  • 认知突破、执行闭环与生态创新:DeepSeek、Manus与Coze的AI应用
  • 爬虫案例-爬取某站视频
  • Lua 的 Neovim 常用配置
  • Vue3 组件通信 $refs $parent
  • 【React】使用Swiper报错`Swiper` needs at least one child
  • 前端会话控制技术:cookie/session/token
  • 特斯拉Optimus 2.0:多模态感知与强化学习引领家庭场景变革
  • 【递归、搜索和回溯算法】专题三 :穷举VS暴搜VS深搜VS回溯VS剪枝
  • WebGL图形编程实战【2】:动态着色 × 纹理贴图技术揭秘
  • 学习Flutter:搭建第一个 Flutter 应用
  • StarRocks 主键(Primary Key)深度解析
  • MATLAB+Arduino控制小车直行+转向
  • 竞赛团队招募系统----山东大学web课程设计
  • cool-admin-midway 使用腾讯云cos上传图片
  • SAP SD学习笔记35 - ATP(可用性检查)的各种Pattern
  • NLP高频面试题(十二)——Lora微调的原理、什么是Qlora
  • 美国明尼苏达州发生山火,过火面积超80平方公里
  • SIFF动画单元公布首批片单:《燃比娃》《凡尔赛玫瑰》等
  • 行知读书会|换一个角度看见社会
  • 普京:俄中关系是国家间关系的真正典范
  • 广西百色通报:极端强对流天气致墙体倒塌,3人遇难7人受伤
  • 婚姻登记“全国通办”首日,上海虹口登记中心迎来“甜蜜高峰”