SpringBoot實現(xiàn)PDF添加水印的三種方法
使用場景
PDF(Portable Document Format,便攜式文檔格式)是一種流行的文件格式,它可以在多個操作系統(tǒng)和應(yīng)用程序中進(jìn)行查看和打印。在某些情況下,我們需要對 PDF 文件添加水印,以使其更具有辨識度或者保護(hù)其版權(quán)。本文將介紹如何使用 Spring Boot 來實現(xiàn) PDF 添加水印的方式。
方式一:使用 Apache PDFBox 庫
PDFBox 是一個流行的、免費(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è)置字體和字號 ? ? 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 庫,它提供了一個簡單易用的 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 庫 寫個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è)置字體和字號 ? ? ? ? ? ? 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實現(xiàn)PDF添加水印的三種方法的文章就介紹到這了,更多相關(guān)SpringBoot PDF添加水印內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring中實現(xiàn)定時調(diào)度的幾種方法
本篇文章主要介紹了Spring中實現(xiàn)定時調(diào)度示例,可以在無人值守的時候系統(tǒng)可以在某一時刻執(zhí)行某些特定的功能,有興趣的可以了解一下。2017-02-02SpringBoot開發(fā)技巧之如何處理跨域請求CORS
CORS(Cross-Origin Resource Sharing)"跨域資源共享",是一個W3C標(biāo)準(zhǔn),它允許瀏覽器向跨域服務(wù)器發(fā)送Ajax請求,打破了Ajax只能訪問本站內(nèi)的資源限制2021-10-10java將數(shù)字價格轉(zhuǎn)換為中文大寫代碼示例(工具類)
這篇文章主要介紹了java將數(shù)字價格轉(zhuǎn)換為中文大寫的相關(guān)資料,在Java中實現(xiàn)將數(shù)字價格轉(zhuǎn)換為中文大寫需要將數(shù)字分解為各個部分(如個位、十位、百位等),并根據(jù)這些部分轉(zhuǎn)換為對應(yīng)的中文大寫數(shù)字,需要的朋友可以參考下2024-10-10Mybatis學(xué)習(xí)總結(jié)之mybatis使用建議
這篇文章主要介紹了Mybatis學(xué)習(xí)總結(jié)之mybatis使用建議的相關(guān)資料,非常具有參考借鑒價值,需要的朋友可以參考下2016-05-05Java基礎(chǔ)之淺談hashCode()和equals()
今天給大家?guī)淼氖顷P(guān)于Java基礎(chǔ)的相關(guān)知識,文章圍繞著hashCode()和equals()展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06Java基礎(chǔ)之引用相關(guān)知識總結(jié)
今天聊聊Java的引用,大多數(shù)時候我們說引用都是強(qiáng)引用,只有在對象不使用的情況下才會釋放內(nèi)存,其實Java 內(nèi)存有四種不同的引用.一起看看吧,,需要的朋友可以參考下2021-05-05@Value如何獲取yml和properties配置參數(shù)
這篇文章主要介紹了@Value如何獲取yml和properties配置參數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07Java8中Lambda表達(dá)式使用和Stream API詳解
這篇文章主要給大家介紹了關(guān)于Java8中Lambda表達(dá)式使用和Stream API的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Java8具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05springboot讀取application.yml報錯問題及解決
這篇文章主要介紹了springboot讀取application.yml報錯問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06