maven依赖
bash
<dependencies>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.2.5</version>
<type>pom</type>
</dependency>
</dependencies>
实现代码
前端代码
bash
window.open(url + "/docinf/doc/docFile/addWatermarkItextStream.do?fileName=test.pdf"+"#toolbar=0",'_blank', "toolbar=no");
在你需要下载的地方,增加点击事件,里面增加window.open方法
这里面有两个toolbar的设置,第一个toolbar=0,是拼接在url后面的,这个是禁用浏览器pdf的下载功能,第二个"toolbar=no",是禁用新窗口浏览器的工具栏,让页面更清爽一些
后端代码
bash
@RequestMapping("/addWatermarkItextStream")
public void addWatermarkItextStream( HttpServletRequest request, HttpServletResponse response) {
try {
String inputPdfPath = "你的pdf路径";
// 水印文本
String watermarkText = "马仔水印";
// 设置响应头
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "inline; filename=watermarked.pdf");
// 获取响应输出流
OutputStream out = response.getOutputStream();
// 创建 PDF 阅读器和写入器
PdfDocument pdfDoc = new PdfDocument(new PdfReader(inputPdfPath), new PdfWriter(out));
// 加载支持中文的字体,这里以宋体为例,需要确保字体文件存在
// 注意,这个路径是我服务器上字体的路径,引号里面必须加上",0",否则中文字体无法显示
PdfFont font = PdfFontFactory.createFont("C:\\Windows\\Fonts\\simsun.ttc,0");
//PdfFont font = PdfFontFactory.createFont();
// 遍历每一页
for (int i = 1; i <= pdfDoc.getNumberOfPages(); i++) {
// 获取当前页面
PdfCanvas pdfCanvas = new PdfCanvas(pdfDoc.getPage(i).newContentStreamBefore(), pdfDoc.getPage(i).getResources(), pdfDoc);
// 设置透明度
PdfExtGState gs1 = new PdfExtGState();
gs1.setFillOpacity(0.3f);
pdfCanvas.setExtGState(gs1);
// 创建画布
Canvas canvas = new Canvas(pdfCanvas, pdfDoc.getPage(i).getPageSize());
canvas.setFont(font).setFontSize(50);
// 定义水印之间的间距
float xSpacing = 300;
float ySpacing = 400;
// 计算水平和垂直方向的水印数量
int numX = (int) Math.ceil(PageSize.A4.getWidth() / xSpacing) * 2;
int numY = (int) Math.ceil(PageSize.A4.getHeight() / ySpacing) * 3;
// 循环添加水印
for (int x = 0; x < numX; x++) {
for (int y = 0; y < numY; y++) {
float xPos = x * xSpacing;
float yPos = y * ySpacing;
canvas.showTextAligned(new Paragraph(watermarkText),
xPos, yPos,
i, TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45);
}
}
}
// 关闭 PDF 文档
pdfDoc.close();
// 刷新并关闭输出流
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
实现效果
