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

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

实现效果

相关推荐
蹊黎2 小时前
C++中vector类的部分简单实现
开发语言·c++·visual studio
驭渊的小故事2 小时前
MyBatis XML 开发实战:从配置到 CRUD 全解析
xml·java·mybatis
哦虎!7 小时前
【JavaEE】网络初识
java
for_ever_love__8 小时前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
程序猿追8 小时前
kotlin-retry 接入鸿蒙后,怎样确认它真的会停止重试
开发语言·kotlin·harmonyos
我是人✓8 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
智能直播8 小时前
网络RTMP拉流不卡顿、声音不同步,一文讲透缓冲区、时间戳
开发语言·ffmpeg·php·音视频·视频编解码
欣栀♡9 小时前
JVM 频繁 Full GC 先看日志括号里的 cause,jstat 的 FGC 在 JDK 8 上会骗人
java·jvm
IT研究室9 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
慧都小项9 小时前
MyEclipse 中创建和测试 JAX-RS REST 接口:从项目配置到 REST Explorer
java·restful·myeclipse·jax-rs