当前位置: 首页 > news >正文

【java】使用iText实现pdf文件增加水印功能

maven依赖

<dependencies><dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.2.5</version><type>pom</type></dependency>
</dependencies>

实现代码

前端代码

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",是禁用新窗口浏览器的工具栏,让页面更清爽一些

后端代码

@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();}}

实现效果

在这里插入图片描述

相关文章:

  • Postman最佳平替, API测试工具Bruno实用教程(一):基础篇
  • 广告屏蔽插件的内部细节EasyList 规则详解:为什么广告屏蔽不直接用 CSS/JS?​(彩蛋)
  • Flink + Kafka 数据血缘追踪与审计机制实战
  • 开发搭载阿里云平台的物联网APP(支持数据接收与发送)
  • 日常开发中,iOS 性能调优我们怎么做?
  • SQL Server To Paimon Demo by Flink standalone cluster mode
  • 多线服务器具有什么优势
  • 【Science Advances】普林斯顿大学利用非相干光打造可重构纳米光子神经网络
  • Easy云盘总结篇-文件分享
  • vue3的新特性
  • Frida使用java.lang.reflect.Array类打印Java反射数组
  • Mkdocs页面如何嵌入PDF
  • 【Prometheus】业务指标与基础指标的标签来源差异及设计解析(扩展版)
  • 【Prometheus】深入解析 Prometheus 特殊标签 `__param_<name>`:动态抓取参数的艺术
  • var、let、const的区别
  • WPF MVVM入门系列教程(六、ViewModel案例演示)
  • 华为设备链路聚合实验:网络工程实战指南
  • Notepad++中XML格式化插件介绍
  • GPT与LLaMA:两大语言模型架构的深度解析与对比
  • console-chat-gpt开源程序是用于 AI Chat API 的 Python CLI
  • 构筑高地共伴成长,第六届上海创新创业青年50人论坛在沪举行
  • 巴基斯坦空袭印度多地空军基地,巴战机进入印领空
  • 巴西总统卢拉将访华
  • 巴基斯坦称对印度发起军事行动
  • “科创板八条”后百单产业并购发布,披露交易金额超247亿
  • 上财发布“AI+课程体系”,人工智能如何赋能财经教育?