SpringBoot 实现 PDF 添加水印

news2024/11/18 3:21:59

SpringBoot 实现 PDF 添加水印

  • 使用场景
  • 方式一:使用 Apache PDFBox 库
  • 方式二:使用 iText 库
  • 方式三:Free Spire.PDF for Java
  • Demo

使用场景

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

方式一:使用 Apache PDFBox 库

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

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

2、添加水印
在添加水印之前,需要读取原始 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();

方式二:使用 iText 库

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

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

2、添加水印
在添加水印之前,需要读取原始 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();

方式三:Free Spire.PDF for Java

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

2、添加文本水印
在添加水印之前,需要读取原始 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();

3、添加图片水印

// 添加图片水印
PdfWatermark watermark = new PdfWatermark("watermark.png");
watermark.setOpacity(0.5f);
page.getWatermarks().add(watermark);

Demo

使用 Apache PDFBox 库 写个demo

package com.sinosoft.springbootplus;

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;

/**
 * @author lsh
 * @date 2023/6/16
 */
public class PdfBoxWatermark {
    public static void main(String[] args) throws IOException {
        // 读取原始 PDF 文件
        PDDocument document = PDDocument.load(new File("C:\\Users\\18234\\Desktop\\redis主从和哨兵(一主一从三哨兵).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();
    }
}

结果:文档的每页都加上了水印
在这里插入图片描述

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

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

相关文章

LIME论文阅读笔记

这是暗图增强领域一篇经典的传统方法论文&#xff0c;发表在TIP这个顶刊 文章基于的是这样一个公式&#xff1a; L R ⋅ T LR\cdot T LR⋅T 其中&#xff0c; L L L是暗图&#xff0c; R R R是反射分量&#xff0c; T T T是illumination map&#xff0c;并且对于彩色图像来说…

OpenCV reshape函数

reshape函数 在opencv中&#xff0c;reshape函数比较有意思&#xff0c;它既可以改变矩阵的通道数&#xff0c;又可以对矩阵元素进行序列化&#xff0c;非常有用的一个函数。 函数原型&#xff1a; C: Mat Mat::reshape(int cn, int rows0) const参数比较少&#xff0c;但设…

DJ3-5 TCP:流量控制、连接控制

目录 一、流量控制 二、连接管理 1. 建立连接&#xff08;三次握手&#xff09; 2. 关闭连接 3. TCP 连接的生命周期 一、流量控制 一条 TCP 连接的每一侧主机都为该连接设置了接收缓冲区。 TCP 的接收方的接收缓冲区&#xff1a; 1. 提供流量控制服务的原因 应用进程会…

Burpsuit使用03:拦截请求并修改响应

burpsuite是渗透的必备工具&#xff0c;使用它可以进行一些截包分析&#xff0c;修改包数据、暴力破解、扫描等功能&#xff0c;使用最多的场景应该是设置代理拦截数据包分析数据和爆破。 文章目录 拦截请求并修改响应Intercept is offForwardDropAction 拦截请求并修改响应 拦…

5.4、docker-compose

h ttps://www.runoob.com/docker/docker-compose.html Docker Compose docker-compose.yml 配置文件编写详解_docker-compose.yml 编写_种子选手的博客-CSDN博客 docker-compose.yml 配置文件编写详解 1.dockerfile: 构建镜像&#xff1b; 2.docker run: 启动容器&#xff1b;…

upyter Notebook:内核似乎挂掉

项目场景&#xff1a;提示&#xff1a;这里简述项目相关背景&#xff1a;项目场景&#xff1a;深度强化学习在中国股票量化交易上的应用&#xff0c;要求跑赢大盘问题描述提示&#xff1a;这里描述项目中遇到的问题&#xff1a;使用Jupyter Notebook运行时&#xff0c;跑到绘图…

瑞萨RA系列mcu学习笔记--RTT-pwm驱动

方案1&#xff1a;Studio 2.2.6和使用了RASC3.5下使用pwm驱动 开发环境必须说一下&#xff0c;本人在在开发环境的问题上栽了一个跟头&#xff0c; 使用最新版的RTT Studio 2.2.6和使用了RASC4.0的版本生成的公共编译ok&#xff0c;但是一下载到mcu就直接不能运行&#xff1a…

浅谈Java的IO与Netty

一、Java的IO((Input/Output))模型 传统IO和Java NIO最大的区别是传统的IO是面向流&#xff0c;NIO是面向Buffer Socket之间建立链接及通信的过程&#xff01;实际上就是对TCP/IP连接与通信过程的抽象: 1.服务端Socket会bind到指定的端口上&#xff0c;Listen客户端的”插入”…

如何迁移现有应用和数据到阿里云服务器?有哪些迁移工具和方法?

如何迁移现有应用和数据到阿里云服务器&#xff1f;有哪些迁移工具和方法&#xff1f;   随着云计算技术的不断发展&#xff0c;越来越多的企业和个人开始将应用和数据迁移到云服务器上。阿里云作为国内领先的云服务提供商&#xff0c;为用户提供了一系列方便可靠的应用和数据…

2023开放原子全球开源峰会参会感受:英特尔开源技术合作与产品创新

2023开放原子全球开源峰会参会感受&#xff1a;英特尔开源技术合作与产品创新 文章目录 2023开放原子全球开源峰会参会感受&#xff1a;英特尔开源技术合作与产品创新一. 引言二. 6.11参会感受2.1 英特尔基础软件开放生态合作2.2 Celadon加速安卓在英特尔架构上的产品创新2.3 面…

ASEMI代理光宝高速光耦LTV-5341参数,LTV-5341应用

编辑-Z LTV-5341参数描述&#xff1a; 型号&#xff1a;LTV-5341 储存温度Tstg&#xff1a;-55~125℃ 工作温度Topr&#xff1a;-40~110℃ 总输出电源电压(VCC –VEE)&#xff1a;35V 平均正向输入电流IF&#xff1a;20mA 峰值瞬态输入电流IF(TRAN)&#xff1a;1A 输入…

【面试中的网络知识】DNS原理-如何实现域名和IP地址的查询转换

接上一篇&#xff0c;理解 浏览器是如何生成HTTP消息的 &#xff0c;最好是按照顺序来读。  从上一篇博客我们得知浏览器是如何生成了HTTP消息了&#xff0c;但是浏览器作为应用程序&#xff0c;是不具备向网络中发送请求的能力&#xff0c;而是需要委托给操作系统的内核协议栈…

淘宝详情页分发推荐算法总结:用户即时兴趣强化

转子&#xff1a;https://juejin.cn/post/6992169847207493639 商品详情页是手淘内流量最大的模块之一&#xff0c;它加载了数十亿级商品的详细信息&#xff0c;是用户整个决策过程必不可少的一环。这个区块不仅要承接用户对当前商品充分感知的诉求&#xff0c;同时也要能肩负起…

必学KVM技术详解包括所有技能

KVM虚拟化进阶学习 一&#xff0c;KVM命令行安装 图形化安装教程&#xff1a;https://blog.csdn.net/weixin_53678904/article/details/125950867?spm1001.2014.3001.5501 1.存储池管理 ​ KVM必须要配置⼀个⽬录当作他存储磁盘镜像(存储卷)的⽬录&#xff0c;我们称这个⽬…

通达信筹码单峰密集选股公式,突破筹码密集区发出信号

筹码密集是相对筹码发散而言的&#xff0c;筹码分布在宽广的价格区间&#xff0c;这种状态就是筹码发散&#xff08;如下图&#xff09;&#xff0c;而且筹码峰像群山一样&#xff0c;有多个高峰&#xff0c;属于多峰形态。 与之相对的&#xff0c;筹码分布在比较窄的价格区间&…

Armbian安装1panel教程

文章目录 一 1panel简介二 检测是否安装1Panel三 环境要求四 安装操作指导4.1 确定系统类型4.2 执行安装命令4.3 访问1panel面板4.4 设置1panel访问配置4.5 查看访问1panel面板入口 五 常用命令总结 一 1panel简介 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。 二…

New Bing使用教程

New Bing使用教程 New Bing简介前提条件使用技巧 New Bing简介 New Bing是微软推出的一款基于GPT4模型的智能搜索引擎&#xff0c;它不仅可以提供高质量的搜索结果&#xff0c;还可以与用户进行自然语言交互。 用户只需安装Edge浏览器即可使用&#xff0c;但现实使用中会出现…

驱动操作 驱动移植试验和Source Insight添加项目

目录 驱动移植 》1.需要有一个驱动对应的 .c代码 》2.将.c文件放入到对应的文件夹内 》3.修改Makefile文件 》4.修改Kconfig菜单 》5.到顶层目录配置自己驱动 》6.编译成模块 》7.此时用的开发板上内核的编译器&#xff0c;安装得到开发板上进行安装 》8.在开发板上进…

标准IO和文件IO分别实现cp功能(嵌入式学习)

标准IO和文件IO分别实现cp功能 标准IO实现cp功能标准IO概念代码实现 文件IO实现cp功能文件IO概念代码实现 标准IO实现cp功能 标准IO概念 想了解标准IO的概念&#xff0c;请点击这里——》IO进程——标准IO&#xff08;嵌入式学习&#xff09; IO进程——标准IO&#xff08;嵌…

【C语言】三子棋详解(包教包会的那种)

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 三子棋及五子棋详解 前言三子棋的实现1. 打印菜单2.初始化并打印棋盘棋盘初始化函数功能的实现打印棋盘 3.玩家下棋与模拟电脑下棋玩家下棋电脑下棋随机数的生成 4.判断输赢我们的game函数 源码game.hgame.ctest.c 总结 …