SpringBoot 實(shí)現(xiàn) PDF 添加水印有哪些方案?
閱讀本文大概需要 8 分鐘。
來自:cnblogs.com/hushaojun/p/16285486.html
簡(jiǎn)介
方式一:使用 Apache PDFBox 庫(kù)
添加 PDFBox 依賴
pom.xml?文件中添加 PDFBox 的依賴:
????org.apache.pdfbox
????pdfbox
????2.0.24
添加水印
PDDocument?document?=?PDDocument.load(new?File("original.pdf"));
PDPageContentStream?添加水印://?遍歷?PDF?中的所有頁(yè)面
for?(int?i?=?0;?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();
}
document.save(new?File("output.pdf"));
document.close();
完整代碼
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?main(String[]?args)?throws?IOException?{
????????//?讀取原始?PDF?文件
????????PDDocument?document?=?PDDocument.load(new?File("original.pdf"));
????????//?遍歷?PDF?中的所有頁(yè)面
????????for?(int?i?=?0;?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 庫(kù)
添加 iText 依賴
pom.xml?文件中添加 iText 的依賴:
????com.itextpdf
????itextpdf
????5.5.13
添加水印
PdfReader?reader?=?new?PdfReader("original.pdf");
PdfStamper?stamper?=?new?PdfStamper(reader,?new?FileOutputStream("output.pdf"));
PdfContentByte?添加水印://?獲取?PDF?中的頁(yè)數(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();
}
stamper.close();
reader.close();
完整代碼
import?com.itextpdf.text.*;
import?com.itextpdf.text.pdf.*;
import?java.io.FileOutputStream;
import?java.io.IOException;
public?class?ItextWatermark?{
????public?static?void?main(String[]?args)?throws?IOException,?DocumentException?{
????????//?讀取原始?PDF?文件
????????PdfReader?reader?=?new?PdfReader("original.pdf");
????????PdfStamper?stamper?=?new?PdfStamper(reader,?new?FileOutputStream("output.pdf"));
????????//?獲取?PDF?中的頁(yè)數(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();
????}
}
方式三:用 Ghostscript 命令行
Ghostscript
Windows[1] macOS[2] Linux[3]
添加水印
gs?-dBATCH?-dNOPAUSE?-sDEVICE=pdfwrite?-sOutputFile=output.pdf?-c?"newpath?/Helvetica-Bold?findfont?36?scalefont?setfont?0.5?setgray?200?200?moveto?(Watermark)?show?showpage"?original.pdf
-sDEVICE=pdfwrite?表示輸出為 PDF 文件;-sOutputFile=output.pdf?表示輸出文件名為?output.pdf;最后一個(gè)參數(shù)?original.pdf?則表示原始 PDF 文件的路徑;中間的字符串則表示添加的水印內(nèi)容。注意事項(xiàng)
方式四:Free Spire.PDF for Java
添加 Free Spire.PDF for Java 依賴
pom.xml?文件中添加 Free Spire.PDF for Java 的依賴:
????e-iceblue
????free-spire-pdf-for-java
????1.9.6
添加文本水印
PdfDocument?pdf?=?new?PdfDocument();
pdf.loadFromFile("original.pdf");
PdfPageBase?添加水印://?遍歷?PDF?中的所有頁(yè)面
for?(int?i?=?0;?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.saveToFile("output.pdf");
pdf.close();
添加圖片水印
PdfWatermark?的參數(shù)修改為圖片路徑即可。//?添加圖片水印
PdfWatermark?watermark?=?new?PdfWatermark("watermark.png");
watermark.setOpacity(0.5f);
page.getWatermarks().add(watermark);
完整代碼
import?com.spire.pdf.*;
public?class?FreeSpirePdfWatermark?{
????public?static?void?main(String[]?args)?{
????????//?讀取原始?PDF?文件
????????PdfDocument?pdf?=?new?PdfDocument();
????????pdf.loadFromFile("original.pdf");
????????//?遍歷?PDF?中的所有頁(yè)面
????????for?(int?i?=?0;?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);
????????????//?添加圖片水印
????????????//?PdfWatermark?watermark?=?new?PdfWatermark("watermark.png");
????????????//?watermark.setOpacity(0.5f);
????????????//?page.getWatermarks().add(watermark);
????????}
????????//?保存修改后的?PDF?文件
????????pdf.saveToFile("output.pdf");
????????pdf.close();
????}
}
方式五:Aspose.PDF for Java
pom.xml?文件中添加 Aspose.PDF for Java 的依賴:
????com.aspose
????aspose-pdf
????21.4
添加文本水印
@PostMapping("/addTextWatermark")
public?ResponseEntity?addTextWatermark(@RequestParam("file")?MultipartFile?file)?throws?IOException?{
????//?加載?PDF?文件
????Document?pdfDocument?=?new?Document(file.getInputStream());
????TextStamp?textStamp?=?new?TextStamp("Watermark");
????textStamp.setWordWrap(true);
????textStamp.setVerticalAlignment(VerticalAlignment.Center);
????textStamp.setHorizontalAlignment(HorizontalAlignment.Center);
????pdfDocument.getPages().get_Item(1).addStamp(textStamp);
????//?保存?PDF?文件
????ByteArrayOutputStream?outputStream?=?new?ByteArrayOutputStream();
????pdfDocument.save(outputStream);
????return?ResponseEntity.ok()
????????????.header(HttpHeaders.CONTENT_DISPOSITION,?"attachment;?filename=\"watermarked.pdf\"")
????????????.contentType(MediaType.APPLICATION_PDF)
????????????.body(outputStream.toByteArray());
}
添加圖片水印
@PostMapping("/addImageWatermark")
public?ResponseEntity?addImageWatermark(@RequestParam("file")?MultipartFile?file)?throws?IOException?{
????//?加載?PDF?文件
????Document?pdfDocument?=?new?Document(file.getInputStream());
????ImageStamp?imageStamp?=?new?ImageStamp("watermark.png");
????imageStamp.setWidth(100);
????imageStamp.setHeight(100);
????imageStamp.setVerticalAlignment(VerticalAlignment.Center);
????imageStamp.setHorizontalAlignment(HorizontalAlignment.Center);
????pdfDocument.getPages().get_Item(1).addStamp(imageStamp);
????//?保存?PDF?文件
????ByteArrayOutputStream?outputStream?=?new?ByteArrayOutputStream();
????pdfDocument.save(outputStream);
????return?ResponseEntity.ok()
????????????.header(HttpHeaders.CONTENT_DISPOSITION,?"attachment;?filename=\"watermarked.pdf\"")
????????????.contentType(MediaType.APPLICATION_PDF)
????????????.body(outputStream.toByteArray());
}
完整代碼
import?com.aspose.pdf.*;
import?org.springframework.http.HttpHeaders;
import?org.springframework.http.MediaType;
import?org.springframework.http.ResponseEntity;
import?org.springframework.web.bind.annotation.*;
import?org.springframework.web.multipart.MultipartFile;
import?java.io.ByteArrayOutputStream;
import?java.io.IOException;
@RestController
@RequestMapping("/api/pdf")
public?class?PdfController?{
????@PostMapping("/addTextWatermark")
????public?ResponseEntity?addTextWatermark(@RequestParam("file")?MultipartFile?file)?throws?IOException?{
????????//?加載?PDF?文件
????????Document?pdfDocument?=?new?Document(file.getInputStream());
????????TextStamp?textStamp?=?new?TextStamp("Watermark");
????????textStamp.setWordWrap(true);
????????textStamp.setVerticalAlignment(VerticalAlignment.Center);
????????textStamp.setHorizontalAlignment(HorizontalAlignment.Center);
????????pdfDocument.getPages().get_Item(1).addStamp(textStamp);
????????//?保存?PDF?文件
????????ByteArrayOutputStream?outputStream?=?new?ByteArrayOutputStream();
????????pdfDocument.save(outputStream);
????????return?ResponseEntity.ok()
????????????????.header(HttpHeaders.CONTENT_DISPOSITION,?"attachment;?filename=\"watermarked.pdf\"")
????????????????.contentType(MediaType.APPLICATION_PDF)
????????????????.body(outputStream.toByteArray());
????}
????@PostMapping("/addImageWatermark")
????public?ResponseEntity?addImageWatermark(@RequestParam("file")?MultipartFile?file)?throws?IOException?{
????????//?加載?PDF?文件
????????Document?pdfDocument?=?new?Document(file.getInputStream());
????????ImageStamp?imageStamp?=?new?ImageStamp("watermark.png");
????????imageStamp.setWidth(100);
????????imageStamp.setHeight(100);
????????imageStamp.setVerticalAlignment(VerticalAlignment.Center);
????????imageStamp.setHorizontalAlignment(HorizontalAlignment.Center);
????????pdfDocument.getPages().get_Item(1).addStamp(imageStamp);
????????//?保存?PDF?文件
????????ByteArrayOutputStream?outputStream?=?new?ByteArrayOutputStream();
????????pdfDocument.save(outputStream);
????????return?ResponseEntity.ok()
????????????????.header(HttpHeaders.CONTENT_DISPOSITION,?"attachment;?filename=\"watermarked.pdf\"")
????????????????.contentType(MediaType.APPLICATION_PDF)
????????????????.body(outputStream.toByteArray());
????}
}
/addTextWatermark?和?/addImageWatermark,分別用于添加文本水印和圖片水印。在請(qǐng)求中通過?file?參數(shù)傳遞 PDF 文件。下載并安裝 Postman。 打開 Postman,選擇 POST 請(qǐng)求方法。 在 URL 地址欄中輸入? http://localhost:8080/api/pdf/addTextWatermark。在 Headers 標(biāo)簽頁(yè)中設(shè)置 Content-Type 為 multipart/form-data。 在 Body 標(biāo)簽頁(yè)中選擇 form-data 類型,然后設(shè)置 key 為? file,value 選擇本地的 PDF 文件。點(diǎn)擊 Send 按鈕發(fā)送請(qǐng)求,等待應(yīng)答結(jié)果。
結(jié)論
推薦閱讀:
自從用了這款牛逼的 IDEA 插件,團(tuán)隊(duì)的代碼寫得越來越規(guī)范了!!!
一款可以拿來做畢設(shè)的圖書管理系統(tǒng),簡(jiǎn)單易掌握,非常nice!
互聯(lián)網(wǎng)初中高級(jí)大廠面試題(9個(gè)G) 內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊(duì)列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper......等技術(shù)棧!
?戳閱讀原文領(lǐng)取!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??朕已閱?


