SpringBoot應用中PDF添加水印的五種實現方案對比
在 Spring Boot 應用中實現 PDF 添加水印,以下是五種常見方案及詳細實現步驟:
方案一:使用 Apache PDFBox
特點:開源免費,功能強大,支持文本水印添加。
步驟:
添加依賴(pom.xml
):
<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.24</version> </dependency>
實現代碼:
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); // 設置透明度 contentStream.beginText(); contentStream.newLineAtOffset(100, 100); // 水印位置 contentStream.showText(watermarkText); // 水印內容 contentStream.endText(); contentStream.close(); } document.save(outputPath); document.close(); } }
調用示例:
public class Main { public static void main(String[] args) throws IOException { PdfBoxWatermark.addWatermark("original.pdf", "output.pdf", "CONFIDENTIAL"); } }
方案二:使用 iText
特點:功能全面,支持文本和圖片水印,適合復雜場景。
步驟:
添加依賴(pom.xml
):
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itext7-core</artifactId> <version>7.2.6</version> <type>pom</type> </dependency>
實現代碼:
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(); } }
調用示例:
public class Main { public static void main(String[] args) throws IOException { ITextWatermark.addWatermark("original.pdf", "output.pdf", "DRAFT"); } }
方案三:使用 Aspose.PDF for Java
特點:商業(yè)庫,功能豐富,支持復雜操作(如圖片水印、動態(tài)水?。?。
步驟:
添加依賴(pom.xml
):
<dependency> <groupId>com.aspose</groupId> <artifactId>aspose-pdf</artifactId> <version>21.4</version> </dependency>
實現代碼(添加文本水印):
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 服務
特點:無需維護本地庫,適合快速集成。
步驟:
選擇服務:如 Adobe Document Cloud、DocuSign 等。
注冊 API 密鑰。
調用 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
特點:適合固定格式的 PDF,結合模板引擎(如 Thymeleaf)。
步驟:
準備模板:創(chuàng)建包含水印的 PDF 模板。
填充數據:使用模板引擎動態(tài)填充內容。
轉換為 PDF(示例使用 iText):
public void generatePdfWithTemplate(String templatePath, String outputPath, Map<String, Object> data) { // 使用 Thymeleaf 生成 HTML String htmlContent = templateEngine.process("template.html", data); // 將 HTML 轉換為 PDF(需額外依賴如 Flying Saucer) ITextRenderer renderer = new ITextRenderer(); renderer.setDocumentFromString(htmlContent); renderer.layout(); renderer.createPDF(new FileOutputStream(outputPath)); }
總結對比
方案 | 優(yōu)點 | 缺點 | 適用場景 |
---|---|---|---|
Apache PDFBox | 免費開源,簡單易用 | 功能相對基礎 | 快速添加文本水印 |
iText | 功能全面,支持復雜操作 | 商業(yè)版本需付費 | 需要高級功能(如圖片水印) |
Aspose.PDF | 功能強大,支持復雜場景 | 商業(yè)庫,費用較高 | 企業(yè)級應用 |
第三方 API | 無需維護,快速集成 | 依賴網絡,成本可能較高 | 原型開發(fā)或輕量級需求 |
模板生成 | 適合固定格式,靈活度高 | 需要模板設計和轉換工具 | 報告、合同等固定格式文檔 |
根據實際需求選擇合適的方案,例如:
- 快速實現:Apache PDFBox 或 iText。
- 企業(yè)級需求:Aspose.PDF。
- 無需維護:第三方 API。
到此這篇關于SpringBoot應用中PDF添加水印的五種實現方案對比的文章就介紹到這了,更多相關SpringBoot PDF添加水印內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中Future、FutureTask原理以及與線程池的搭配使用
這篇文章主要為大家詳細介紹了Java中Future、FutureTask原理以及與線程池的搭配使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-09-09Java中String、StringBuffer和StringBuilder的區(qū)別
這篇文章主要介紹了Java中String、StringBuffer和StringBuilder的區(qū)別,StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數組保存字符串char[]value但是沒有final關鍵字修飾,所以這兩個可變,需要的朋友可以參考下2024-01-01java面向國際化項目開發(fā)需遵循的命名規(guī)范
這篇文章主要為大家介紹了在參與開發(fā)國際化項目時需遵循的java命名規(guī)范,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-03-03Java AbstractMethodError案例分析詳解
這篇文章主要介紹了Java AbstractMethodError案例分析詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-08-08Java?循環(huán)隊列/環(huán)形隊列的實現流程
循環(huán)隊列又叫環(huán)形隊列,是一種特殊的隊列。循環(huán)隊列解決了隊列出隊時需要將所有數據前移一位的問題。本文將帶大家詳細了解循環(huán)隊列如何實現,需要的朋友可以參考一下2022-02-02