SpringBoot應(yīng)用中PDF添加水印的五種實(shí)現(xiàn)方案對比
在 Spring Boot 應(yīng)用中實(shí)現(xiàn) PDF 添加水印,以下是五種常見方案及詳細(xì)實(shí)現(xiàn)步驟:
方案一:使用 Apache PDFBox
特點(diǎn):開源免費(fèi),功能強(qiáng)大,支持文本水印添加。
步驟:
添加依賴(pom.xml):
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.24</version>
</dependency>
實(shí)現(xiàn)代碼:
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 addWatermark(String inputPath, String outputPath, String watermarkText) throws IOException {
PDDocument document = PDDocument.load(new File(inputPath));
for (PDPage page : document.getDocumentCatalog().getPages()) {
PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true);
contentStream.setFont(PDType1Font.HELVETICA_BOLD, 36);
contentStream.setNonStrokingColor(200, 200, 200); // 設(shè)置透明度
contentStream.beginText();
contentStream.newLineAtOffset(100, 100); // 水印位置
contentStream.showText(watermarkText); // 水印內(nèi)容
contentStream.endText();
contentStream.close();
}
document.save(outputPath);
document.close();
}
}
調(diào)用示例:
public class Main {
public static void main(String[] args) throws IOException {
PdfBoxWatermark.addWatermark("original.pdf", "output.pdf", "CONFIDENTIAL");
}
}
方案二:使用 iText
特點(diǎn):功能全面,支持文本和圖片水印,適合復(fù)雜場景。
步驟:
添加依賴(pom.xml):
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.2.6</version>
<type>pom</type>
</dependency>
實(shí)現(xiàn)代碼:
import com.itextpdf.kernel.pdf.*;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ITextWatermark {
public static void addWatermark(String inputPath, String outputPath, String watermarkText) throws IOException {
PdfReader reader = new PdfReader(new File(inputPath));
PdfWriter writer = new PdfWriter(outputPath);
PdfDocument pdfDoc = new PdfDocument(reader, writer);
for (int i = 1; i <= pdfDoc.getNumberOfPages(); i++) {
PdfPage page = pdfDoc.getPage(i);
PdfCanvas canvas = new PdfCanvas(page);
canvas.beginText();
canvas.setFontAndSize(PdfFontFactory.createFont(), 60);
canvas.setTextMatrix(150, 400); // 水印位置
canvas.showText(watermarkText);
canvas.endText();
}
pdfDoc.close();
}
}
調(diào)用示例:
public class Main {
public static void main(String[] args) throws IOException {
ITextWatermark.addWatermark("original.pdf", "output.pdf", "DRAFT");
}
}
方案三:使用 Aspose.PDF for Java
特點(diǎn):商業(yè)庫,功能豐富,支持復(fù)雜操作(如圖片水印、動(dòng)態(tài)水?。?。
步驟:
添加依賴(pom.xml):
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-pdf</artifactId>
<version>21.4</version>
</dependency>
實(shí)現(xiàn)代碼(添加文本水印):
import com.aspose.pdf.*;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayOutputStream;
public class AsposeWatermark {
public static byte[] addWatermark(MultipartFile file, String watermarkText) throws Exception {
Document pdfDocument = new Document(file.getInputStream());
TextStamp textStamp = new TextStamp(watermarkText);
textStamp.setVerticalAlignment(VerticalAlignment.Center);
textStamp.setHorizontalAlignment(HorizontalAlignment.Center);
pdfDocument.getPages().get_Item(1).addStamp(textStamp);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
pdfDocument.save(outputStream);
return outputStream.toByteArray();
}
}
REST API 示例:
@PostMapping("/addWatermark")
public ResponseEntity<byte[]> addWatermark(@RequestParam("file") MultipartFile file) throws Exception {
byte[] result = AsposeWatermark.addWatermark(file, "CONFIDENTIAL");
return ResponseEntity.ok()
.header("Content-Disposition", "attachment; filename=\"watermarked.pdf\"")
.contentType(MediaType.APPLICATION_PDF)
.body(result);
}
方案四:使用第三方 API 服務(wù)
特點(diǎn):無需維護(hù)本地庫,適合快速集成。
步驟:
選擇服務(wù):如 Adobe Document Cloud、DocuSign 等。
注冊 API 密鑰。
調(diào)用 API(示例使用 RestTemplate):
public byte[] addWatermarkViaApi(String apiKey, String filePath, String watermarkText) {
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer " + apiKey);
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
body.add("file", new FileSystemResource(filePath));
body.add("watermarkText", watermarkText);
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(body, headers);
ResponseEntity<byte[]> response = restTemplate.postForEntity("https://api.example.com/addWatermark", request, byte[].class);
return response.getBody();
}
方案五:基于模板生成 PDF
特點(diǎn):適合固定格式的 PDF,結(jié)合模板引擎(如 Thymeleaf)。
步驟:
準(zhǔn)備模板:創(chuàng)建包含水印的 PDF 模板。
填充數(shù)據(jù):使用模板引擎動(dòng)態(tài)填充內(nèi)容。
轉(zhuǎn)換為 PDF(示例使用 iText):
public void generatePdfWithTemplate(String templatePath, String outputPath, Map<String, Object> data) {
// 使用 Thymeleaf 生成 HTML
String htmlContent = templateEngine.process("template.html", data);
// 將 HTML 轉(zhuǎn)換為 PDF(需額外依賴如 Flying Saucer)
ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(htmlContent);
renderer.layout();
renderer.createPDF(new FileOutputStream(outputPath));
}
總結(jié)對比
| 方案 | 優(yōu)點(diǎn) | 缺點(diǎn) | 適用場景 |
|---|---|---|---|
| Apache PDFBox | 免費(fèi)開源,簡單易用 | 功能相對基礎(chǔ) | 快速添加文本水印 |
| iText | 功能全面,支持復(fù)雜操作 | 商業(yè)版本需付費(fèi) | 需要高級(jí)功能(如圖片水?。?/td> |
| Aspose.PDF | 功能強(qiáng)大,支持復(fù)雜場景 | 商業(yè)庫,費(fèi)用較高 | 企業(yè)級(jí)應(yīng)用 |
| 第三方 API | 無需維護(hù),快速集成 | 依賴網(wǎng)絡(luò),成本可能較高 | 原型開發(fā)或輕量級(jí)需求 |
| 模板生成 | 適合固定格式,靈活度高 | 需要模板設(shè)計(jì)和轉(zhuǎn)換工具 | 報(bào)告、合同等固定格式文檔 |
根據(jù)實(shí)際需求選擇合適的方案,例如:
- 快速實(shí)現(xiàn):Apache PDFBox 或 iText。
- 企業(yè)級(jí)需求:Aspose.PDF。
- 無需維護(hù):第三方 API。
到此這篇關(guān)于SpringBoot應(yīng)用中PDF添加水印的五種實(shí)現(xiàn)方案對比的文章就介紹到這了,更多相關(guān)SpringBoot PDF添加水印內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IntelliJ?IDEA?2024.2?發(fā)布新功能介紹Spring?Data?JPA即時(shí)查詢、自動(dòng)補(bǔ)全cro
在2024.2?Ultimate版本中,對?Spring?Data?JPA?的支持做了增強(qiáng),新功能允許您在不運(yùn)行應(yīng)用程序和分析日志文件的情況下查看方法將生成的查詢,下面就來一起看看這個(gè)版本中推出的幾個(gè)強(qiáng)大新特性2024-08-08
JAVA內(nèi)存空間相關(guān)知識(shí)匯總
這篇文章主要介紹了JAVA內(nèi)存空間相關(guān)知識(shí),文中介紹的非常詳細(xì),代碼幫助大家更好的參考和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06
一步步教你搭建Scala開發(fā)環(huán)境(非常詳細(xì)!)
Scala是一門基于jvm的函數(shù)式的面向?qū)ο缶幊陶Z言,擁有比java更加簡潔的語法,下面這篇文章主要給大家介紹了關(guān)于搭建Scala開發(fā)環(huán)境的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04
Java?SpringMVC實(shí)現(xiàn)自定義攔截器
這篇文章主要為大家詳細(xì)介紹了SpringMVC實(shí)現(xiàn)自定義攔截器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03
Jenkins系統(tǒng)如何進(jìn)行數(shù)據(jù)備份
隨著我們的長期使用,Jenkins系統(tǒng)中的內(nèi)容會(huì)越來越多,特別是一些配置相關(guān)的東西,不能有任何丟失。這個(gè)時(shí)候我們就需要定期備份我們的Jenkins系統(tǒng),避免一些誤操作不小心刪除了某些重要文件,本文就將介紹下Jenkins系統(tǒng)如何進(jìn)行數(shù)據(jù)備份2021-06-06

