通过Java代码实现PDF文件添加水印的功能,主要依赖iText库(用于PDF操作)和OSS SDK(可选,用于文件上传)。以下是实现的核心步骤:

首先添加依赖

<!-- 添加 PDF 水印 --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>

添加PDF水印的核心方法

@SpringBootTest
public class FileWatermarkUploader {// OSS 配置信息:需根据你的账号信息进行修改private static final String ENDPOINT = "your-endpoint";private static final String ACCESS_KEY_ID = "your-access-key";private static final String ACCESS_KEY_SECRET = "your-secret-key";private static final String BUCKET_NAME = "your-bucket-name";@Testpublic void T() throws Exception {uploadWithWatermark(new File("D:\\test.pdf"), "oss/path/output.pdf", "测试水印 - 保密 Confidential","D:/output/output.pdf");}/*** 上传带水印的文件至 OSS,并保存到本地指定路径。** @param inputFile 原始 PDF 文件* @param objectName OSS 上保存的文件名* @param watermarkText 自定义水印文字* @param outputPath 本地保存路径,如 "C:/output/watermarked.pdf"* @throws Exception 处理异常*/public void uploadWithWatermark(File inputFile, String objectName, String watermarkText, String outputPath)throws Exception {// 判断是否是 PDF 文件if (!inputFile.getName().toLowerCase().endsWith(".pdf")) {throw new IllegalArgumentException("只支持 PDF 文件水印处理");}// 添加水印,返回本地水印文件File watermarkedFile = addPdfWatermark(inputFile, watermarkText);// 将临时文件复制到指定输出路径copyFile(watermarkedFile, new File(outputPath));// 上传到 OSS// uploadToOss(watermarkedFile, objectName);// 删除临时文件if (watermarkedFile.exists()) {watermarkedFile.delete();}}/*** 给 PDF 添加铺满整页的文字水印** @param inputPdf 原始 PDF 文件* @param watermarkText 水印文字* @return 添加水印后的临时文件* @throws IOException IO 异常* @throws DocumentException PDF 处理异常*/private File addPdfWatermark(File inputPdf, String watermarkText) throws IOException, DocumentException {File outputPdf = File.createTempFile("watermarked_", ".doc");PdfReader reader = new PdfReader(new FileInputStream(inputPdf));PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputPdf));int totalPages = reader.getNumberOfPages();BaseFont font = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);PdfGState gs = new PdfGState();gs.setFillOpacity(0.5f);  // 半透明效果for (int i = 1; i <= totalPages; i++) {PdfContentByte canvas = stamper.getUnderContent(i);canvas.setGState(gs);canvas.setFontAndSize(font, 10);canvas.setColorFill(BaseColor.LIGHT_GRAY);float xSpacing = 150f; // 横向间隔float ySpacing = 100f; // 纵向间隔for (float x = 0; x < 595; x += xSpacing) { // 页面宽度 A4 约 595ptfor (float y = 0; y < 842; y += ySpacing) { // 页面高度 A4 约 842ptcanvas.beginText();canvas.showTextAligned(Element.ALIGN_CENTER, watermarkText, x, y, 45);canvas.endText();}}}stamper.close();reader.close();return outputPdf;}/*** 上传文件至 OSS** @param file 文件对象* @param objectName OSS 保存的文件名* @throws FileNotFoundException 文件找不到异常*/private void uploadToOss(File file, String objectName) throws FileNotFoundException {OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);ossClient.putObject(BUCKET_NAME, objectName, new FileInputStream(file));ossClient.shutdown();}/*** 将文件从源路径复制到目标路径** @param source 原始文件* @param destination 目标文件* @throws IOException IO 异常*/private void copyFile(File source, File destination) throws IOException {try (InputStream in = new FileInputStream(source); OutputStream out = new FileOutputStream(destination)) {byte[] buffer = new byte[1024];int length;while ((length = in.read(buffer)) > 0) {out.write(buffer, 0, length);}}}
}

关键点说明

  • iText依赖:需在项目中引入iText库(如com.itextpdf:itextpdf:5.2.0)。
  • 水印样式:通过PdfGState设置透明度,通过BaseFont设置字体,通过showTextAligned控制水印位置和旋转角度。
  • 水印密度:通过xSpacing和ySpacing调整水印排列密度。
  • 临时文件处理:生成水印文件后建议删除临时文件,避免存储浪费。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/910248.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/910248.shtml
英文地址,请注明出处:http://en.pswp.cn/news/910248.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Swoft2 框架精华教程:Swoft 的视图组件

概述 用模板对页面进行渲染&#xff0c;这是比较经典的一种设计方式了。主要目的是在服务器端进行页面渲染&#xff0c;以使客户端浏览器可以直接拿到页面 html 的代码&#xff0c;这样对搜索引擎对网站的收录比较友好。如果是前后端分离的形式&#xff0c;由于前后端交互是用…

[学习] 哈希码:原理、用途与实现详解(C代码示例)

哈希码&#xff1a;原理、用途与实现详解 博主在《在C语言中使用字典》一文中&#xff0c;使用哈希来实现键值对的快速检索&#xff0c;今天对哈希这一算法工具&#xff0c;进行一些深入的研究&#xff0c;争取能能做到知其然亦知其所以然。 文章目录 哈希码&#xff1a;原理、…

golang--channel的关键特性和行为

Go 语言 Channel 的核心特性与行为深度解析 Channel 是 Go 语言并发编程的核心组件&#xff0c;用于在不同 goroutine 之间进行通信和同步。以下是其关键特性和行为的全面分析&#xff1a; 一、基本特性 1. 类型安全通信管道 ch : make(chan int) // 只能传递整数2. 方向性…

HarmonyOS 5 鸿蒙多模态融合测试技术方案详解

以下是针对HarmonyOS 5多模态融合测试的技术方案详解&#xff0c;综合交互逻辑、容错机制及分布式验证等核心模块&#xff1a; ‌一、多模态交互核心逻辑验证‌ ‌事件融合机制‌ 通过kit.AbilityKit监听语音指令&#xff0c;结合ArkUI手势系统捕获屏幕坐标&#xff1a; import…

在AI普及的大环境下神经网络在新能源汽车热管理系统中的应用简介

一、神经网络的核心原理与结构 1. 生物启发与基础组成 神经网络&#xff08;Artificial Neural Network, ANN&#xff09;受生物神经元信息处理机制启发&#xff0c;由大量人工神经元互联构成计算模型。每个神经元接收输入信号&#xff08;如温度、流量等物理量&#xff09;&a…

​ CATIA V5与3DEXPERIENCE协同设计:引领无人机行业新纪元

在无人机行业蓬勃发展的今天&#xff0c;传统设计流程正面临前所未有的系统性挑战。更令人担忧的是&#xff0c;随着无人机应用场景的不断拓展&#xff0c;从农业植保到城市物流&#xff0c;从应急救援到军事侦察&#xff0c;对产品性能的要求日益严苛。传统设计方法已难以应对…

关于科技公司经营的一些想法

分析了一些我们公司的问题&#xff1a; 1&#xff0c;测试 重视测试&#xff0c;加大测试投入 2&#xff0c;人才 人才评判标准&#xff1a;结果论&#xff0c;主要根据该岗位问题的解决效率与质量评判。工作时长不重要 任人唯贤。尽可能录用能解决问题的人才&#xff0c;不…

校招生成长日记(一):初来乍到

提前来了几天&#xff0c;感受一下广东的生活。第一印象就是闷热&#xff01;后面尝了潮汕火锅&#xff0c;椰子鸡&#xff0c;荔枝&#xff0c;都很不错&#xff01;&#xff01;&#xff01;就是没有重口味的&#xff0c;好想念我的酸辣粉&#xff0c;麻辣烫啊......y走了瞬间…

【精选】移动端学习平台设计与开发 移动端平台开发(含资料阅读、时事新闻、时政答题与讨论功能) 基于移动端的专题教育平台设计与实现

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Protobuf 高级特性详解 —— 嵌套消息、Oneof 字段与自定义选项

在前几篇文章中&#xff0c;我们已经掌握了 Protocol Buffers&#xff08;Protobuf&#xff09;的基础语法、.proto 文件的结构、以及如何使用 Go 和 Java 进行数据的序列化与反序列化操作。本篇文章将深入探讨 Protobuf 的高级特性&#xff0c;包括&#xff1a; 嵌套消息&…

golang--数据类型与存储

在 Go 语言中&#xff0c;理解值类型&#xff08;value types&#xff09;和引用类型&#xff08;reference types&#xff09;的区别对于编写高效、正确的代码至关重要。以下是主要的区别点和需要注意的特殊情况&#xff1a; 一、值类型&#xff08;Value Types&#xff09; …

uniapp——轮播图、产品列表轮播、上一页、下一页、一屏三张图

案例展示 组件封装 <template><view><view class="showSwiperBox"><view class="topSwiper"><swiper class="swiper" :autoplay="autoplay" interval="5000" :previous-margin="margin&qu…

用Python实现安全封装EXE文件加密保护工具

一、概述 这个Python脚本实现了一个强大的EXE文件加密保护工具,它能够将任何Windows可执行文件封装到一个带密码保护的GUI程序中。核心功能包括: 使用AES-256加密算法保护原始EXE文件 创建美观的密码验证界面 支持自定义程序图标 自动处理PyInstaller打包过程 修复Tkinter在…

vue3监听属性watch和watchEffect的详解

文章目录 1. 前言2. 常规用法3. 监听对象和route变化4. 使用场景4.1 即时表单验证4.2 搜索联想功能4.3 数据变化联动处理 5. watchEffect详解5-1 基本概念5-2 核心用法基础示例&#xff1a;自动响应依赖变化处理异步副作用停止监听与清理副作用 5-3 高级场景应用监听多个响应式…

Spring IoC核心实现揭秘

Spring IoC(控制反转)的实现机制是Spring框架的核心,其本质是将对象的创建、依赖管理和生命周期控制权从应用程序代码转移到容器中。以下是其核心实现机制: 🔧 一、核心实现步骤 配置元数据加载 容器启动时读取XML/注解/Java配置类,解析为BeanDefinition对象(包含类名、…

Solidity内部合约创建全解析:解锁Web3开发新姿势

合约创建基础 new 关键字创建合约 在 Solidity 中&#xff0c;new关键字是创建合约实例的最基本方式&#xff0c;它就像是一个 “魔法钥匙”&#xff0c;能够在以太坊区块链上生成一个全新的合约实例。使用new关键字创建合约的过程非常直观&#xff0c;就像我们在其他编程语言…

OCR大模型,破解金融文档处理困境,从文字识别到文字理解

金融机构在日常运营中处理海量文档。这些文档类型多样&#xff0c;格式复杂&#xff0c;是业务运营的基础。如何高效、准确地处理这些文档&#xff0c;直接影响机构的运营效率与风险控制水平。新一代的OCR大模型技术为此提供了有效的解决方案。它提升了文档处理的自动化程度与数…

2025.6.21笔记(2)

1.编写一个程序&#xff0c;输入一个整数&#xff0c;判断它是奇数还是偶数 解题思路&#xff1a; 1.因为要判断输入的数是奇数还是偶数&#xff0c;所以要用到if判断 2.判读奇偶数&#xff1a;如果这个数%20&#xff0c;则它为偶数&#xff0c;如果这个数%2!0&#xff0c;则…

【Ambari3.0.0 部署】Step7—Mariadb初始化-适用于el8

如果有其他系统部署需求可以参考原文 https://doc.janettr.com/install/manual/ MariaDB 10 是 Ambari 及大数据平台的常见数据库方案。本文适配 Rocky Linux 8.10&#xff0c;涵盖 MariaDB 10.11 推荐安装、YUM 源配置、参数优化、初始化和安全设置&#xff0c;帮助你一步到位…

SpringBoot电脑商城项目--删除收获地址+热销排行

删除收获地址 1 删除收获地址-持久层 1.1 规划sql语句 在删除操作之前判断该数据是否存在&#xff0c;判断该条地址的归属是否是当前的用户执行删除收货地址的操作 delete from t_address where aid? 如果用户删除的时默认地址&#xff0c;将剩下地址的某一条作为默认收货地…