SpringBoot 实现 PDF 添加水印有哪些方案

SpringBoot 实现 PDF 添加水印有哪些方案

    • 方式一:使用 Apache PDFBox 库
    • 方式二:使用 iText 库
    • 方式三:用 Ghostscript 命令行
    • 方式四:Free Spire.PDF for Java
    • 方式五:Aspose.PDF for Java

简介
PDF(Portable Document Format,便携式文档格式)是一种流行的文件格式,它可以在多个操作系统和应用程序中进行查看和打印。在某些情况下,我们需要对 PDF 文件添加水印,以使其更具有辨识度或者保护其版权。本文将介绍如何使用 Spring Boot 来实现 PDF 添加水印的方式。

方式一:使用 Apache PDFBox 库

PDFBox 是一个流行的、免费的、用 Java 编写的库,它可以用来创建、修改和提取 PDF 内容。PDFBox 提供了许多 API,包括添加文本水印的功能。

添加 PDFBox 依赖
首先,在 pom.xml 文件中添加 PDFBox 的依赖:

<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.24</version>
</dependency

添加水印
在添加水印之前,需要读取原始 PDF 文件:

PDDocument document = PDDocument.load(new File("original.pdf"));
然后,遍历 PDF 中的所有页面,并使用 PDPageContentStream 添加水印:// 遍历 PDF 中的所有页面
for (int i = 0; i < document.getNumberOfPages(); i++) {PDPage page = document.getPage(i);PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true);// 设置字体和字号contentStream.setFont(PDType1Font.HELVETICA_BOLD, 36);// 设置透明度contentStream.setNonStrokingColor(200, 200, 200);// 添加文本水印contentStream.beginText();contentStream.newLineAtOffset(100, 100); // 设置水印位置contentStream.showText("Watermark"); // 设置水印内容contentStream.endText();contentStream.close();
}

最后,需要保存修改后的 PDF 文件:

document.save(new File("output.pdf"));
document.close();
完整代码
下面是使用 PDFBox 来实现 PDF 添加水印的完整代码:import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType1Font;import java.io.File;
import java.io.IOException;public class PdfBoxWatermark {public static void main(String[] args) throws IOException {// 读取原始 PDF 文件PDDocument document = PDDocument.load(new File("original.pdf"));// 遍历 PDF 中的所有页面for (int i = 0; i < document.getNumberOfPages(); i++) {PDPage page = document.getPage(i);PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true);// 设置字体和字号contentStream.setFont(PDType1Font.HELVETICA_BOLD, 36);// 设置透明度contentStream.setNonStrokingColor(200, 200, 200);// 添加文本水印contentStream.beginText();contentStream.newLineAtOffset(100, 100); // 设置水印位置contentStream.showText("Watermark"); // 设置水印内容contentStream.endText();contentStream.close();}// 保存修改后的 PDF 文件document.save(new File("output.pdf"));document.close();}
}

方式二:使用 iText 库

iText 是一款流行的 Java PDF 库,它可以用来创建、读取、修改和提取 PDF 内容。iText 提供了许多 API,包括添加文本水印的功能。

添加 iText 依赖
在 pom.xml 文件中添加 iText 的依赖:

<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version>
</dependency>

添加水印
在添加水印之前,需要读取原始 PDF 文件:

PdfReader reader = new PdfReader("original.pdf");
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("output.pdf"));
然后,遍历 PDF 中的所有页面,并使用 PdfContentByte 添加水印:// 获取 PDF 中的页数
int pageCount = reader.getNumberOfPages();// 添加水印
for (int i = 1; i <= pageCount; i++) {PdfContentByte contentByte = stamper.getUnderContent(i); // 或者 getOverContent()contentByte.beginText();contentByte.setFontAndSize(BaseFont.createFont(), 36f);contentByte.setColorFill(BaseColor.LIGHT_GRAY);contentByte.showTextAligned(Element.ALIGN_CENTER, "Watermark", 300, 400, 45);contentByte.endText();
}

最后,需要保存修改后的 PDF 文件并关闭文件流:

stamper.close();
reader.close();

完整代码
下面是使用 iText 来实现 PDF 添加水印的完整代码:

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;import java.io.FileOutputStream;
import java.io.IOException;public class ItextWatermark {public static void main(String[] args) throws IOException, DocumentException {// 读取原始 PDF 文件PdfReader reader = new PdfReader("original.pdf");PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("output.pdf"));// 获取 PDF 中的页数int pageCount = reader.getNumberOfPages();// 添加水印for (int i = 1; i <= pageCount; i++) {PdfContentByte contentByte = stamper.getUnderContent(i); // 或者 getOverContent()contentByte.beginText();contentByte.setFontAndSize(BaseFont.createFont(), 36f);contentByte.setColorFill(BaseColor.LIGHT_GRAY);contentByte.showTextAligned(Element.ALIGN_CENTER, "Watermark", 300, 400, 45);contentByte.endText();}// 保存修改后的 PDF 文件并关闭文件流stamper.close();reader.close();}
}

方式三:用 Ghostscript 命令行

Ghostscript 是一款流行的、免费的、开源的 PDF 处理程序,它可以用来创建、读取、修改和提取 PDF 内容。Ghostscript 中提供了命令行参数来添加水印。
Ghostscript
首先需要在本地安装 Ghostscript 程序。
添加水印,可以在终端中使用 Ghostscript 的命令行工具执行以下命令来实现:

gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=output.pdf -c "newpath /Helvetica-Bold findfont 36 scalefont setfont 0.5 setgray 200 200 moveto (Watermark) show showpage" original.pdf

上述命令中,-sDEVICE=pdfwrite 表示输出为 PDF 文件;-sOutputFile=output.pdf 表示输出文件名为 output.pdf;最后一个参数 original.pdf 则表示原始 PDF 文件的路径;中间的字符串则表示添加的水印内容。

注意事项
使用 Ghostscript 命令行添加水印时,会直接修改原始 PDF 文件,因此建议先备份原始文件。

方式四:Free Spire.PDF for Java

下面介绍一下使用 Free Spire.PDF for Java 实现 PDF 添加水印的方式。

Free Spire.PDF for Java 是一款免费的 Java PDF 库,它提供了一个简单易用的 API,用于创建、读取、修改和提取 PDF 内容。Free Spire.PDF for Java 也支持添加文本水印以及图片水印。

添加 Free Spire.PDF for Java 依赖
首先,在 pom.xml 文件中添加 Free Spire.PDF for Java 的依赖:

<dependency><groupId>e-iceblue</groupId><artifactId>free-spire-pdf-for-java</artifactId><version>1.9.6</version>
</dependency>

添加文本水印
在添加水印之前,需要读取原始 PDF 文件:

PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("original.pdf");
然后,遍历 PDF 中的所有页面,并使用 PdfPageBase 添加水印:// 遍历 PDF 中的所有页面
for (int i = 0; i < pdf.getPages().getCount(); i++) {PdfPageBase page = pdf.getPages().get(i);// 添加文本水印PdfWatermark watermark = new PdfWatermark("Watermark");watermark.setFont(new PdfFont(PdfFontFamily.Helvetica, 36));watermark.setOpacity(0.5f);page.getWatermarks().add(watermark);
}
最后,需要保存修改后的 PDF 文件:pdf.saveToFile("output.pdf");
pdf.close();
添加图片水印
添加图片水印与添加文本水印类似,只需要将 PdfWatermark 的参数修改为图片路径即可。// 添加图片水印
PdfWatermark watermark = new PdfWatermark("watermark.png");
watermark.setOpacity(0.5f);
page.getWatermarks().add(watermark);
完整代码
下面是使用 Free Spire.PDF for Java 来实现 PDF 添加水印的完整代码:import com.spire.pdf.*;public class FreeSpirePdfWatermark {public static void main(String[] args) {// 读取原始 PDF 文件PdfDocument pdf = new PdfDocument();pdf.loadFromFile("original.pdf");// 遍历 PDF 中的所有页面for (int i = 0; i < pdf.getPages().getCount(); i++) {PdfPageBase page = pdf.getPages().get(i);// 添加文本水印PdfWatermark watermark = new PdfWatermark("Watermark");watermark.setFont(new PdfFont(PdfFontFamily.Helvetica, 36));watermark.setOpacity(0.5f);page.getWatermarks().add(watermark);// 添加图片水印// PdfWatermark watermark = new PdfWatermark("watermark.png");// watermark.setOpacity(0.5f);// page.getWatermarks().add(watermark);}// 保存修改后的 PDF 文件pdf.saveToFile("output.pdf");pdf.close();}
}

方式五:Aspose.PDF for Java

Aspose.PDF for Java 是一个强大的 PDF 处理库,提供了添加水印的功能。结合 Spring Boot 使用 Aspose.PDF for Java 库添加 PDF 水印的方式如下:

首先,在 pom.xml 文件中添加 Aspose.PDF for Java 的依赖:

<dependency><groupId>com.aspose</groupId><artifactId>aspose-pdf</artifactId><version>21.4</version>
</dependency>

在 Spring Boot 应用程序中调用 Aspose.PDF for Java 的 API 设置 PDF 水印。

添加文本水印

@PostMapping("/addTextWatermark")
public ResponseEntity<byte[]> addTextWatermark(@RequestParam("file") MultipartFile file) throws IOException {// 加载 PDF 文件Document pdfDocument = new Document(file.getInputStream());TextStamp textStamp = new TextStamp("Watermark");textStamp.setWordWrap(true);textStamp.setVerticalAlignment(VerticalAlignment.Center);textStamp.setHorizontalAlignment(HorizontalAlignment.Center);pdfDocument.getPages().get_Item(1).addStamp(textStamp);// 保存 PDF 文件ByteArrayOutputStream outputStream = new ByteArrayOutputStream();pdfDocument.save(outputStream);return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"watermarked.pdf\"").contentType(MediaType.APPLICATION_PDF).body(outputStream.toByteArray());
}
添加图片水印
@PostMapping("/addImageWatermark")
public ResponseEntity<byte[]> addImageWatermark(@RequestParam("file") MultipartFile file) throws IOException {// 加载 PDF 文件Document pdfDocument = new Document(file.getInputStream());ImageStamp imageStamp = new ImageStamp("watermark.png");imageStamp.setWidth(100);imageStamp.setHeight(100);imageStamp.setVerticalAlignment(VerticalAlignment.Center);imageStamp.setHorizontalAlignment(HorizontalAlignment.Center);pdfDocument.getPages().get_Item(1).addStamp(imageStamp);// 保存 PDF 文件ByteArrayOutputStream outputStream = new ByteArrayOutputStream();pdfDocument.save(outputStream);return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"watermarked.pdf\"").contentType(MediaType.APPLICATION_PDF).body(outputStream.toByteArray());
}

注意,以上代码中的文件名、宽度、高度等参数需要根据实际情况进行调整。

完整代码
完整的 Spring Boot 控制器类代码如下:

import com.aspose.pdf.*;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import java.io.ByteArrayOutputStream;
import java.io.IOException;@RestController
@RequestMapping("/api/pdf")
public class PdfController {@PostMapping("/addTextWatermark")public ResponseEntity<byte[]> addTextWatermark(@RequestParam("file") MultipartFile file) throws IOException {// 加载 PDF 文件Document pdfDocument = new Document(file.getInputStream());TextStamp textStamp = new TextStamp("Watermark");textStamp.setWordWrap(true);textStamp.setVerticalAlignment(VerticalAlignment.Center);textStamp.setHorizontalAlignment(HorizontalAlignment.Center);pdfDocument.getPages().get_Item(1).addStamp(textStamp);// 保存 PDF 文件ByteArrayOutputStream outputStream = new ByteArrayOutputStream();pdfDocument.save(outputStream);return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"watermarked.pdf\"").contentType(MediaType.APPLICATION_PDF).body(outputStream.toByteArray());}@PostMapping("/addImageWatermark")public ResponseEntity<byte[]> addImageWatermark(@RequestParam("file") MultipartFile file) throws IOException {// 加载 PDF 文件Document pdfDocument = new Document(file.getInputStream());ImageStamp imageStamp = new ImageStamp("watermark.png");imageStamp.setWidth(100);imageStamp.setHeight(100);imageStamp.setVerticalAlignment(VerticalAlignment.Center);imageStamp.setHorizontalAlignment(HorizontalAlignment.Center);pdfDocument.getPages().get_Item(1).addStamp(imageStamp);// 保存 PDF 文件ByteArrayOutputStream outputStream = new ByteArrayOutputStream();pdfDocument.save(outputStream);return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"watermarked.pdf\"").contentType(MediaType.APPLICATION_PDF).body(outputStream.toByteArray());}
}

这里使用了两个 RESTful API:/addTextWatermark 和 /addImageWatermark,分别用于添加文本水印和图片水印。在请求中通过 file 参数传递 PDF 文件。

下面介绍如何使用 Postman 来测试 Spring Boot 应用程序的 API。

下载并安装 Postman。
打开 Postman,选择 POST 请求方法。
在 URL 地址栏中输入 http://localhost:8080/api/pdf/addTextWatermark。
在 Headers 标签页中设置 Content-Type 为 multipart/form-data。
在 Body 标签页中选择 form-data 类型,然后设置 key 为 file,value 选择本地的 PDF 文件。
点击 Send 按钮发送请求,等待应答结果。
处理结果将会在响应的 Body 中返回,也可以选择浏览器下载或保存到本地磁盘。

以上就是使用 Aspose.PDF for Java 库结合 Spring Boot 添加 PDF 水印的方式。

结论
本文介绍了几种使用 Spring Boot 实现 PDF 添加水印的方式,分别是使用 Apache PDFBox 库、iText 库以及 Ghostscript 命令行等。选择哪种方式,可以根据项目需求和个人偏好来决定。无论采用哪种方式,都需要注意保护原始 PDF 文件,不要在不必要的情况下直接修改原始文件。欢迎点赞收藏,在你老板安排你干这时,希望你能够及时找到相关的Java工具库,实现这项功能。

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

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

相关文章

小程序显示兼容处理,home键处理

定义&#xff1a; env(safe-area-inset-bottom)和env(safe-area-inset-top)是CSS中的变量&#xff0c;用于获取设备底部和顶部安全区域的大小 示例&#xff1a; padding-bottom: calc(env(safe-area-inset-bottom) 12px); /* 兼容iOS> 11.2 */安全间距类型&#xff1a; …

【消息队列】RocketMQ 并发消费和顺序消费

在 RocketMQ 中&#xff0c;消息的消费模式包括并发消费和顺序消费&#xff0c;它们分别适用于不同的业务场景。下面是对这两种消费模式的介绍&#xff1a; 1. 并发消费&#xff1a; 特点&#xff1a; 并发消费是指多个消费者实例同时处理消息&#xff0c;每个实例独立地处理一…

js实现iframe内容加载失败自动重新加载功能

最近一个项目上的程序经常出现掉线的情况&#xff0c;经排查是该单位的网络不稳定&#xff0c;存在网络丢包现象。导致有时候程序运行加载页面失败&#xff0c;开机自启动应用时出现请求失败的概率非常大&#xff0c;为了解决这个问题我在网上东找西找也没有找到有效的解决办法…

【现代控制系统】最小实现与互质分式

最小实现和互质分式 2023年12月12日 文章目录 最小实现和互质分式1. 实现问题2. SISO严格正则系统的实现2.1 能控标准1型实现2.2 能观标准2型实现2.3 能观标准1型实现2.4 能控标准2型实现2.5 最小实现2.6 完全表征 3. 计算互质分式3.1 使用西尔韦斯特结式 4. SISO基于Markov参…

丰果管道——2024中国家装管道十大品牌

丰果管道——2024中国家装管道十大品牌 丰果&#xff08;中国&#xff09;有限公司 丰果管道品牌创立于1999年&#xff0c;是国内最早从事PPR家装管道生产的品牌之一&#xff0c;在业内有着良好的口碑和市场美誉度&#xff0c;在全国的头部装企更是有相当高的市场占有率。2023年…

猫咪发腮长肉吃什么?5款适合猫咪发腮长肉的猫罐头推荐

随着冬季的来临&#xff0c;北方的小猫咪们因为有暖气&#xff0c;日子还算好过。然而南方的猫咪们只能依靠自己的抵抗力来度过这个寒冷的季节。为了确保这些怕冷的小家伙能温暖地度过冬天&#xff0c;铲屎官们是不是该考虑为它们囤积一些肉肉呢&#xff1f; 有些猫咪&#xf…

Go-gin-example 个人注释添加学习版 第三部分 编写一个简单的文件日志

文章目录 本文目标新建logging包file.go编写log文件当前目录结构 接入自定义的log功能验证功能 _ 学习煎鱼大佬的该项目 煎鱼大佬网站 原github地址 个人github项目地址&#xff0c;希望得到一点star 本文目标 在上一节中&#xff0c;我们解决了 API’s 可以任意访问的问题&a…

无货源跨境电商到底应该怎么做,新手必看

如今&#xff0c;跨境电商无疑已经成为了一个热门的创业领域&#xff0c;但对于一些新手来说&#xff0c;面临的一个主要挑战是如何处理产品的货源问题。下面我就和大家分享一下无货源跨境电商的基本概念以及一些新手可以采取的策略和步骤&#xff0c;帮助大家在这个领域取得成…

C#MQTT编程08--MQTT服务器和客户端(cmd版)

1、前言 前面完成了winform版&#xff0c;wpf版&#xff0c;为什么要搞个cmd版&#xff0c;因为前面介绍了mqtt的报文结构&#xff0c;重点分析了【连接报文】&#xff0c;【订阅报文】&#xff0c;【发布报文】&#xff0c;这节就要就看看实际报文是怎么组装的&#xff0c;这…

Flink编程——风险欺诈检测

Flink 风险欺诈检测 文章目录 Flink 风险欺诈检测背景准备条件FraudDetectionJob.javaFraudDetector.java 代码分析执行环境创建数据源对事件分区 & 欺诈检测输出结果运行作业欺诈检测器 欺诈检测器 v1&#xff1a;状态欺诈检测器 v2&#xff1a;状态 时间完整的程序期望的…

3C市场发展态势疲软?直播电商带来新机遇

“ 能否迎来新生 ” 文&#xff5c;王娴 编辑 | 靳淇 出品&#xff5c;极新 目前直播电商成为家电3C行业不可替代的经营阵地,电商生态的重构为关注沟通渠道与销售通路的家电3C行业带来更多选择。内容场与货架场贯通的独特优势&#xff0c;正吸引商家加速入场全域兴趣电商。…

Failed at the node sass@4.14.1 postinstall script.

首先&#xff0c;查看node和 npm版本 #用于列出已安装的 Node.js 版本。 nvm ls #切换node版本 nvm use 12.17.0 #换国内镜像源&#xff1a;&#xff08;单独设置sass的安装源。&#xff09; npm config set sass_binary_sitehttps://npm.taobao.org/mirrors/node-sass …

外卖系统创新:智能推荐与用户个性化体验

外卖系统的日益普及使得用户对于更智能、个性化的体验有着不断增长的期望。在这篇文章中&#xff0c;我们将探讨如何通过智能推荐技术&#xff0c;为用户提供更贴心、更符合口味的外卖选择。我们将使用 Python 和基于协同过滤的推荐算法作为示例&#xff0c;让您更深入地了解智…

VBA_MF系列技术资料1-315

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属于…

练习题 将x减到0的最小操作数

题目 给你一个整数数组 nums 和一个整数 x 。每一次操作时&#xff0c;你应当移除数组 nums 最左边或最右边的元素&#xff0c;然后从 x 中减去该元素的值。请注意&#xff0c;需要 修改 数组以供接下来的操作使用。 如果可以将 x 恰好 减到 0 &#xff0c;返回 最小操作数 &…

CSS常见元素类型 盒子模型

文章目录 常见元素类型块元素内联元素空元素修改元素类型测试元素类型 盒子模型标准文本流:外边距和内边距测试盒子模型 常见元素类型 块元素 常见块元素: div p h1~h6 ul li img 这些元素结束之后自带换行&#xff0c;一行只能存在一个元素&#xff0c;无法横向排列&#xf…

selenium代理ip可用性测试

测试代理ip是否工作正常&#xff0c;将正常的代理ip提取出来 from selenium import webdriver from fake_useragent import UserAgent def check_proxy(proxy):print("开始测试&#xff1a;"proxy)chrome_options webdriver.ChromeOptions()chrome_options.add_arg…

html + css + js简单的项目

以下内容直接复制粘贴就能运行 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&…

uniapp打包配置 (安卓+ios)

TOC 基础配置 HBuilderX中打开项目的manifest.json文件&#xff0c;在“基础配置”中可以设置App的应用名称、版本号等信息&#xff1a; 应用标识 DCloud应用appid&#xff08;简称appid&#xff09;是由DCloud创建App项目时生成的唯一标识&#xff0c;关联DCloud云端服务&…

CentOS 8.5 安装图解

特特特别的说明 CentOS发行版已经不再适合应用于生产环境&#xff0c;客观条件不得不用的话&#xff0c;优选7.9版本&#xff0c;8.5版本次之&#xff0c;最次6.10版本&#xff08;比如说Oracle 11GR2就建议在6版本上部署&#xff09;&#xff01; 引导和开始安装 选择倒计时结…