SpringBoot 实现 PDF 添加水印有哪些方案?
共 588字,需浏览 2分钟
·
2023-06-20 09:43
阅读本文大概需要 8 分钟。
来自:cnblogs.com/hushaojun/p/16285486.html
简介
方式一:使用 Apache PDFBox 库
添加 PDFBox 依赖
pom.xml
文件中添加 PDFBox 的依赖:
org.apache.pdfbox
pdfbox
2.0.24
添加水印
PDDocument document = PDDocument.load(new File("original.pdf"));
PDPageContentStream
添加水印:// 遍历 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);
// 设置字体和字号
contentStream.setFont(PDType1Font.HELVETICA_BOLD, 36);
// 设置透明度
contentStream.setNonStrokingColor(200, 200, 200);
// 添加文本水印
contentStream.beginText();
contentStream.newLineAtOffset(100, 100); // 设置水印位置
contentStream.showText("Watermark"); // 设置水印内容
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 中的所有页面
for (int i = 0; i < document.getNumberOfPages(); i++) {
PDPage page = document.getPage(i);
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("Watermark"); // 设置水印内容
contentStream.endText();
contentStream.close();
}
// 保存修改后的 PDF 文件
document.save(new File("output.pdf"));
document.close();
}
}
方式二:使用 iText 库
添加 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 中的页数
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 中的页数
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 文件并关闭文件流
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
;最后一个参数 original.pdf
则表示原始 PDF 文件的路径;中间的字符串则表示添加的水印内容。注意事项
方式四: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 中的所有页面
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.saveToFile("output.pdf");
pdf.close();
添加图片水印
PdfWatermark
的参数修改为图片路径即可。// 添加图片水印
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 中的所有页面
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);
// 添加图片水印
// 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 ResponseEntityaddTextWatermark(@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 ResponseEntityaddImageWatermark(@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 ResponseEntityaddTextWatermark(@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 ResponseEntityaddImageWatermark(@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
,分别用于添加文本水印和图片水印。在请求中通过 file
参数传递 PDF 文件。下载并安装 Postman。 打开 Postman,选择 POST 请求方法。 在 URL 地址栏中输入 http://localhost:8080/api/pdf/addTextWatermark
。在 Headers 标签页中设置 Content-Type 为 multipart/form-data。 在 Body 标签页中选择 form-data 类型,然后设置 key 为 file
,value 选择本地的 PDF 文件。点击 Send 按钮发送请求,等待应答结果。
结论
推荐阅读:
自从用了这款牛逼的 IDEA 插件,团队的代码写得越来越规范了!!!
一款可以拿来做毕设的图书管理系统,简单易掌握,非常nice!
互联网初中高级大厂面试题(9个G) 内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper......等技术栈!
⬇戳阅读原文领取! 朕已阅