• java实现pdf文件添加水印,下载到浏览器


    java实现pdf文件添加水印,下载到浏览器

    添加itextpdf依赖

    <dependency>
        <groupId>com.itextpdfgroupId>
        <artifactId>itextpdfartifactId>
        <version>5.5.8version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    文件下载到浏览器和指定路径

    根据需求,不需要指定路径可以删除对应的输出流

    public void addPDFImageWaterMark(MultipartFile srcFile, MultipartFile imagePath, HttpServletResponse response) {
        String fileName = "test.pdf";
        PdfReader reader = null;
        PdfStamper stamper = null;
        FileInputStream fileInputStream = null;
      	//这个输出流要放入PdfStamper构造方法中,这里也会下载一个文件,不需要的话可以在finally中删除
     		FileOutputStream fileOutputStream = null;
      	//下载到你指定的路径,try里面new的路径,不需要下载到指定路径可以删除
        FileOutputStream fos = null;
        // 设置响应头,指定内容类型和文件名,准备下载到浏览器,下载到指定位置,不需要下载到浏览器可以删除这个输出流
        ServletOutputStream outputStream = null;
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "attachment; filename=" + srcFile.getOriginalFilename());
        try {
            outputStream = response.getOutputStream();
            //如果是路径的话可以使用另一个构造方法reader = new PdfReader(srcPath);
            reader = new PdfReader(srcFile.getBytes());
            fileOutputStream = new FileOutputStream(fileName);
            stamper = new PdfStamper(reader, fileOutputStream);
            //加载图片
            //如果是路径的话可以使用另一个构造方法Image image =Image.getInstance(imagePath);
            Image image = Image.getInstance(imagePath.getBytes());
            //将图片控制大小,适配这个大小
            image.scaleToFit(200, 100);
    
            PdfGState gs = new PdfGState();
            //gs.setFillOpacity(0.2f);//图片水印透明度
            //gs.setStrokeOpacity(0.4f);//设置笔触字体不透明度
            PdfContentByte content = null;
    
            int total = reader.getNumberOfPages();//pdf文件页数
            for (int i = 0; i < total; i++) {
                float x = reader.getPageSize(i + 1).getWidth();//页宽度
                float y = reader.getPageSize(i + 1).getHeight();//页高度
                content = stamper.getOverContent(i + 1);
                content.setGState(gs);
                content.beginText();//开始写入
    
                //每页7行,一行3个
                for (int j=0; j<3; j++) {
                    for (int k=0; k<7; k++) {
                        //setAbsolutePosition 方法的参数(输出水印X轴位置,Y轴位置)
                        image.setAbsolutePosition(x/3*j-30, y/7*k-20);
                        content.addImage(image);
                    }
                }
                content.endText();//结束写入
            }
            //要先关闭流才能将生成的文件写到指定地方!!!
            stamper.close();
            reader.close();
            //指定这个文件(这里我用的相对路径)
            fileInputStream = new FileInputStream(fileName);
            //创建输出流,下载到指定路径
            fos = new FileOutputStream("test1.pdf");
            byte[] buffer = new byte[1024];
            int bytesRead = 0;
            while ((bytesRead = fileInputStream.read(buffer)) != -1) {
                // 浏览器下载
                outputStream.write(buffer, 0, bytesRead);
                //下载到指定路径
                fos.write(buffer, 0, bytesRead);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                //关闭流
                if (stamper != null) {
                    stamper.close();
                }
                if (reader != null) {
                    reader.close();
                }
                if (fos != null) {
                    fos.close();
                }
                if (fileInputStream != null) {
                    fileInputStream.close();
                }
                if (fileOutputStream != null) {
                    fileOutputStream.close();
                }
                if (outputStream != null) {
                    outputStream.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91

    效果如下:代码中的相对路径在src平级目录下,test.pdf是PdfStamper里面fileOutputStream生成的,test1.pdf是fos生成的

    在这里插入图片描述

    浏览器下载的如下:

    在这里插入图片描述

    生成的pdf内容如下(红框里面是pdf原来的内容,可以自己调整代码中注释掉的设置水印透明度来调整)

    在这里插入图片描述

    提供的前端代码自行测试

    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Titletitle>
    head>
    <body>
    
        <h2>测试PDF添加水印h2>
        <form method="post" action="http://localhost:8080/addPDFImageWaterMark" enctype="multipart/form-data">
            <label for="srcFile">选择PDF文件:label>
            <input type="file" name="srcFile" id="srcFile" accept=".pdf" required>
            <br>
            <label for="imagePath">选择水印图片:label>
            <input type="file" name="imagePath" id="imagePath" accept=".jpg, .png" required>
            <br>
            <button type="submit">添加水印并下载button>
        form>
    
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    java分布式事务
    MyBatis环境搭建&&测试增删改查
    Flink 源码解读系列 DataStream 窗口分配器 WinowAssigner
    大数据Doris(十二):扩容缩容
    【JavaEE进阶系列 | 从小白到工程师】基本类型包装类的使用,装箱以及拆箱与parseInt方法
    OAuth 2.0实现统一认证
    【PowerQuery】导入与加载XML
    Ubuntu更改时区
    【UCIe】UCIe Lane Reversal 介绍
    CPU的睿频、超线程、SIMD指令集等特性对密码算法性能的影响
  • 原文地址:https://blog.csdn.net/m0_65778338/article/details/134164181