
pdf.js 官方库本身不支持运行时添加水印,因其定位是轻量级 pdf 渲染器而非文档编辑工具;若需水印效果,应通过服务端预处理 pdf 或在 canvas 渲染层叠加 dom 元素实现。
pdf.js 官方库本身不支持运行时添加水印,因其定位是轻量级 pdf 渲染器而非文档编辑工具;若需水印效果,应通过服务端预处理 pdf 或在 canvas 渲染层叠加 dom 元素实现。
PDF.js 是 Mozilla 开发的基于 HTML5 的开源 PDF 查看器,核心目标是高保真、高性能地渲染 PDF 内容,而非修改或增强 PDF 文档结构。正如其官方 GitHub 仓库多次明确声明(如 issue #14366),水印(尤其是嵌入式、语义化水印)不属于 PDF.js 的设计范畴。因此,调用类似 pageView.setWatermark() 的方法会直接报错:TypeError: pageView.setWatermark is not a function——因为该 API 根本不存在。
✅ 可行的替代方案
方案一:服务端预加水印(推荐,安全可靠)
在 PDF 文件送达前端前,使用后端工具(如 Apache PDFBox、iText、PyPDF2 或商业 SDK)将水印作为透明图层嵌入每页。例如,Java 中使用 PDFBox 添加倾斜文字水印:
// 示例:PDFBox 添加半透明斜向水印(需引入 org.apache.pdfbox:pdfbox)
PDDocument doc = PDDocument.load(new File("input.pdf"));
PDPage page = doc.getPage(0);
PDPageContentStream contentStream = new PDPageContentStream(doc, page, AppendMode.APPEND, true);
contentStream.beginText();
contentStream.setFont(PDType1Font.HELVETICA_BOLD, 60);
contentStream.setNonStrokingColor(200, 200, 200, 80); // RGBA: 灰色 + 低透明度
contentStream.setTextMatrix(AffineTransform.getRotateInstance(Math.toRadians(45), 300, 400));
contentStream.showText("CONFIDENTIAL");
contentStream.endText();
contentStream.close();
doc.save("watermarked.pdf");
doc.close();
✅ 优势:水印真正融入 PDF 流,兼容打印、复制、无障碍阅读;❌ 缺点:需额外服务端处理与存储开销。
方案二:前端 Canvas 层叠渲染(轻量、即时,但非原生 PDF 水印)
利用 PDF.js 渲染出的











