SpringBoot實(shí)現(xiàn)PDF添加水印的三種方法
使用場景
PDF(Portable Document Format,便攜式文檔格式)是一種流行的文件格式,它可以在多個(gè)操作系統(tǒng)和應(yīng)用程序中進(jìn)行查看和打印。在某些情況下,我們需要對(duì) PDF 文件添加水印,以使其更具有辨識(shí)度或者保護(hù)其版權(quán)。本文將介紹如何使用 Spring Boot 來實(shí)現(xiàn) PDF 添加水印的方式。
方式一:使用 Apache PDFBox 庫
PDFBox 是一個(gè)流行的、免費(fèi)的、用 Java 編寫的庫,它可以用來創(chuàng)建、修改和提取 PDF 內(nèi)容。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 添加水?。?/p>
// 遍歷 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);
? ? // 設(shè)置字體和字號(hào)
? ? contentStream.setFont(PDType1Font.HELVETICA_BOLD, 36);
? ? // 設(shè)置透明度
? ? contentStream.setNonStrokingColor(200, 200, 200);
? ? // 添加文本水印
? ? contentStream.beginText();
? ? contentStream.newLineAtOffset(100, 100); // 設(shè)置水印位置
? ? contentStream.showText("Watermark"); // 設(shè)置水印內(nèi)容
? ? contentStream.endText();
? ? contentStream.close();
}最后,需要保存修改后的 PDF 文件:
document.save(new File("output.pdf"));
document.close();方式二:使用 iText 庫
iText 是一款流行的 Java PDF 庫,它可以用來創(chuàng)建、讀取、修改和提取 PDF 內(nèi)容。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 中的頁數(shù)
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 文件并關(guān)閉文件流:
stamper.close(); reader.close();
方式三:Free Spire.PDF for Java
Free Spire.PDF for Java 是一款免費(fèi)的 Java PDF 庫,它提供了一個(gè)簡單易用的 API,用于創(chuàng)建、讀取、修改和提取 PDF 內(nèi)容。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 添加水?。?/p>
// 遍歷 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 庫 寫個(gè)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);
? ? ? ? ? ? // 設(shè)置字體和字號(hào)
? ? ? ? ? ? contentStream.setFont(PDType1Font.HELVETICA_BOLD, 36);
? ? ? ? ? ? // 設(shè)置透明度
? ? ? ? ? ? contentStream.setNonStrokingColor(200, 200, 200);
? ? ? ? ? ? // 添加文本水印
? ? ? ? ? ? contentStream.beginText();
? ? ? ? ? ? contentStream.newLineAtOffset(100, 100); // 設(shè)置水印位置
? ? ? ? ? ? contentStream.showText("Watermark"); // 設(shè)置水印內(nèi)容
? ? ? ? ? ? contentStream.endText();
? ? ? ? ? ? contentStream.close();
? ? ? ? }
? ? ? ? // 保存修改后的 PDF 文件
? ? ? ? document.save(new File("output.pdf"));
? ? ? ? document.close();
? ? }
}結(jié)果:文檔的每頁都加上了水印

到此這篇關(guān)于SpringBoot實(shí)現(xiàn)PDF添加水印的三種方法的文章就介紹到這了,更多相關(guān)SpringBoot PDF添加水印內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中ArrayList與LinkedList的使用及區(qū)別詳解
這篇文章主要給大家介紹了關(guān)于Java中ArrayList與LinkedList的使用及區(qū)別的相關(guān)資料,ArrayList和LinkedList都是實(shí)現(xiàn)了List接口的容器類,用于存儲(chǔ)一系列的對(duì)象引用,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-11-11
java錯(cuò)誤:無效的源發(fā)行版:18解決辦法圖文詳解
在Java開發(fā)中,如果你遇到錯(cuò)誤: 無效的源發(fā)行版,這通常意味著你正在使用的Java編譯器(通常是javac)被配置為編譯一個(gè)比你的JDK 版本更高,這篇文章主要給大家介紹了關(guān)于java錯(cuò)誤:無效的源發(fā)行版:18的解決辦法,需要的朋友可以參考下2024-08-08
java中int轉(zhuǎn)string與string轉(zhuǎn)int的效率對(duì)比
這篇文章主要介紹了java中int轉(zhuǎn)string與string轉(zhuǎn)int的效率對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
spring中@Transactional注解和事務(wù)的實(shí)戰(zhàn)
本文主要介紹了spring中@Transactional注解和事務(wù)的實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-07-07
java編程之基于SpringBoot框架實(shí)現(xiàn)掃碼登錄
本文將介紹基于SpringBoot + Vue + Android實(shí)現(xiàn)的掃碼登錄demo的總體思路,文中附含詳細(xì)示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09
Java 對(duì)HashMap進(jìn)行排序的三種常見方法
這篇文章主要介紹了Java 對(duì)HashMap進(jìn)行排序的三種常見方法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-10-10
使用Flyway進(jìn)行Java數(shù)據(jù)庫版本控制的操作指南
今天我們將深入探討如何使用Flyway進(jìn)行Java數(shù)據(jù)庫版本控制,Flyway是一個(gè)流行的數(shù)據(jù)庫遷移工具,用于管理和自動(dòng)化數(shù)據(jù)庫模式的演變,文中通過代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-07-07

