java monogodb 图片 pdf 下载添加单个水印 铺满水印

这是基于monogodb 下载后添加水印的介绍  不管你现在用的是本地下载还是其他的服务器 输出后的结果都是添加水印 基本的操作一样的都是通过流下载的然后添加水印 ! 这边的所有操作都是基于这个官网的我只是把他整合了一遍但是没有封装   代码git 

mongoDBWeChat: 小程序于java后台的交互上传下载分页,后端入口

      <dependency>
                <groupId>com.itextpdf</groupId>
                <artifactId>itext-asian</artifactId>
                <version>5.2.0</version>
            </dependency>
        <!-- excel start -->

        <!-- xls -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
        <!-- xlsx -->
       <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.17</version>
    </dependency>

1- 图片添加水印 单个水印

    /**
     * 图片以画布得方式添加水印  单个水印
     *
     * @param objectid
     * @param response
     * @throws IOException
     */
    @RequestMapping("/download2")
    public void downloadWatermark(String objectid, HttpServletResponse response) throws IOException {
        System.out.println("---------下传文件");
        //根据id 查询数据
        Query id = Query.query(Criteria.where("_id").is(objectid));
        GridFSFile fsFiles = gridFsTemplate.findOne(id);
        if (fsFiles == null) {
            System.out.println("没用获取到文件");
        }
        //文件名称
        String s = fsFiles.getFilename();
        //文件类型
        org.bson.Document metadata = fsFiles.getMetadata();
        if (metadata == null) {
            System.out.println("\"获取文件为空\";");
        }
        String contentType = fsFiles.getMetadata().get("_contentType").toString();
        System.out.println("文件类型:" + contentType);
        //通知下载
        response.setContentType(contentType);
        response.setHeader("Content-Disposition", "attachment;filename=\"" + URLEncoder.encode(s, "UTF-8") + "\"");
        GridFSBucket gridFSBucket = GridFSBuckets.create(mongoTemplate.getDb());
        GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(fsFiles.getObjectId());
        //获取mongodb的资源
        GridFsResource gridFsResource = new GridFsResource(fsFiles, gridFSDownloadStream);

        //----------------------------测试用的判断格式----------------------------------------------------------------------------
        //加个判断 判断是否png jpg类型的
        if (!s.contains(".png") && !s.contains(".jpg") ) {
            System.out.println("下载的格式不对下载对应png和jpg");
            Preconditions.checkArgument(false,"下载的格式不对下载对应的png格式和jpg");
        }
        //------------------------------------------------------------------------------------------------------------
        //-------------开始添加水印 不管你现在是本地下载还是别的服务器下载 只要给他传入InputStream 就行了----------------------------------------------------------------------------
        // 水印颜色
        Color color = new Color(255, 200, 0, 118);
        //水印字体
        Font font = new Font("微软雅黑", Font.ITALIC, 45);
        //水印内容
        String waterMarkContent = "赖伟强";
        //不管是本地下载还是其他服务器只要传入流的方式就行了
        BufferedImage buImage = ImageIO.read(gridFsResource.getInputStream());
        //图片宽
        int width = buImage.getWidth();
        //图片高
        int height = buImage.getHeight();

        //添加水印
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
        Graphics2D g = bufferedImage.createGraphics();
        g.drawImage(buImage, 0, 0, width, height, null);
        //水印颜色
        g.setColor(color);
        //水印字体
        g.setFont(font);

        //这是一个计算水印位置的函数,可以根据需求添加
        int x = width - 2 * getWatermarkLength(waterMarkContent, g);
        int y = height - 1 * getWatermarkLength(waterMarkContent, g);
        //水印位置可以自己定义
        //g.drawString(waterMarkContent, 400, 300);
        //水印位置 位置在右下角
        g.drawString(waterMarkContent, x, y);
        //释放资源
        g.dispose();

        ServletOutputStream outputStream = response.getOutputStream();
        ImageIO.write(bufferedImage, "jpg", outputStream);
        System.out.println("添加水印完成");

        outputStream.flush();
        outputStream.close();
    }



    /**
     * 计算文字的高度和宽度
     *
     * @param waterMarkContent 字体
     * @param g                画布
     * @return
     */
    public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
        return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
    }

1-1 结果样式图右下角出现了水印  位置也是可以自己定义的

 2- 图片 以画布得方式添加水印 铺满的水印

   /**
     * 图片 以画布得方式添加水印  铺满的水印
     *
     * @param objectid
     * @param response
     * @throws IOException
     */
    @RequestMapping("/download3")
    public void downloadWatermark3(String objectid, HttpServletResponse response) throws IOException {
        System.out.println("---------下传文件");
        //根据id 查询数据
        Query id = Query.query(Criteria.where("_id").is(objectid));
        GridFSFile fsFiles = gridFsTemplate.findOne(id);
        if (fsFiles == null) {
            System.out.println("没用获取到文件");
        }
        //文件名称
        String s = fsFiles.getFilename();
        //文件类型
        org.bson.Document metadata = fsFiles.getMetadata();
        if (metadata == null) {
            System.out.println("\"获取文件为空\";");
        }
        String contentType = fsFiles.getMetadata().get("_contentType").toString();
        System.out.println("文件类型:" + contentType);
        //通知下载
        response.setContentType(contentType);
        response.setHeader("Content-Disposition", "attachment;filename=\"" + URLEncoder.encode(s, "UTF-8") + "\"");
        GridFSBucket gridFSBucket = GridFSBuckets.create(mongoTemplate.getDb());
        GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(fsFiles.getObjectId());
        //获取mongodb的资源
        GridFsResource gridFsResource = new GridFsResource(fsFiles, gridFSDownloadStream);
        //----------------------------测试用的判断格式----------------------------------------------------------------------------
        //加个判断 判断是否png jpg类型的
        if (!s.contains(".png") && !s.contains(".jpg") ) {
            System.out.println("下载的格式不对下载对应png和jpg");
            Preconditions.checkArgument(false,"下载的格式不对下载对应的png格式和jpg");
        }
        //------------------------------------------------------------------------------------------------------------
        //-------------开始添加水印 不管你现在是本地下载还是别的服务器下载 只要给他传入InputStream 就行了---------------------------------------------------------------------------

        // 设置水印文字透明度
        // 水印透明度
        float alpha = 0.5f;
        // 水印文字大小
        int FONT_SIZE = 18;
        // 水印文字字体
        Font font = new Font("宋体", Font.PLAIN, FONT_SIZE);
        // 水印文字颜色
        Color color = Color.gray;
        // 水印之间的间隔
        int XMOVE = 80;
        // 水印之间的间隔
        int YMOVE = 80;
        //水印内容
        String waterMarkContent = "赖伟强";   
        BufferedImage buImage = ImageIO.read(gridFsResource.getInputStream());
        //图片宽
        int width = buImage.getWidth();
        //图片高
        int height = buImage.getHeight();
        BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        // 得到画笔对象
        Graphics2D g = buffImg.createGraphics();
        // 设置对线段的锯齿状边缘处理
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g.drawImage(buImage.getScaledInstance(width, height, Image.SCALE_SMOOTH),
                0, 0, null);
        // 设置水印旋转角度
        g.rotate(Math.toRadians(-40), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);

        // 设置水印文字颜色
        g.setColor(color);
        // 设置水印文字Font
        g.setFont(font);

        int x = -width / 2;
        int y = -height / 2;
        int markWidth = FONT_SIZE * getTextLength(waterMarkContent);// 字体长度
        int markHeight = FONT_SIZE;// 字体高度

        // 循环添加水印
        while (x < width * 1.5) {
            y = -height / 2;
            while (y < height * 1.5) {
                g.drawString(waterMarkContent, x, y);

                y += markHeight + YMOVE;
            }
            x += markWidth + XMOVE;
        }
        // 释放资源
        g.dispose();
        // 生成图片
        ServletOutputStream outputStream = response.getOutputStream();
        ImageIO.write(buffImg, "JPG", outputStream);
        System.out.println("添加水印文字成功!");

        outputStream.flush();
        outputStream.close();
    }


    /**
     * 获取文本长度。汉字为1:1,英文和数字为2:1
     */
    private static int getTextLength(String text) {
        int length = text.length();
        for (int i = 0; i < text.length(); i++) {
            String s = String.valueOf(text.charAt(i));
            if (s.getBytes().length > 1) {
                length++;
            }
        }
        length = length % 2 == 0 ? length / 2 : length / 2 + 1;
        return length;
    }

2-1 结果样式

 

 3- pdf 添加水印 右下角单个水印

    /**
     * pdf 添加水印  右下角单个水印
     *
     * @param objectid 下载的id
     * @param response 请求
     * @throws IOException
     */
    @RequestMapping("/download5")
    public void downloadWatermark5(String objectid, HttpServletResponse response) throws
            IOException, DocumentException, DocumentException {
        System.out.println("---------下传文件");
        //根据id 查询数据
        Query id = Query.query(Criteria.where("_id").is(objectid));
        GridFSFile fsFiles = gridFsTemplate.findOne(id);
        if (fsFiles == null) {
            System.out.println("没用获取到文件");
        }
        //文件名称
        String s = fsFiles.getFilename();
        //文件类型
        org.bson.Document metadata = fsFiles.getMetadata();
        if (metadata == null) {
            System.out.println("\"获取文件为空\";");
        }
        String contentType = fsFiles.getMetadata().get("_contentType").toString();
        System.out.println("文件类型:" + contentType);
        //通知下载
        response.setContentType(contentType);
        response.setHeader("Content-Disposition", "attachment;filename=\"" + URLEncoder.encode(s, "UTF-8") + "\"");
        GridFSBucket gridFSBucket = GridFSBuckets.create(mongoTemplate.getDb());
        GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(fsFiles.getObjectId());
        //获取mongodb的资源
        GridFsResource gridFsResource = new GridFsResource(fsFiles, gridFSDownloadStream);
        //----------------------------测试用的判断格式----------------------------------------------------------------------------
        //加个判断 判断是否pdf类型的
        if (!s.contains(".pdf")) {
            System.out.println("下载的格式不对下载对应pdf");
            Preconditions.checkArgument(false,"下载的格式不对下载对应的pdf格式");
        }
        //------------------------------------------------------------------------------------------------------------
        //-------------开始添加水印 不管你现在是本地下载还是别的服务器下载 只要给他传入InputStream 就行了----------------------------------------------------------------------------

        //pdf 下载
        //pdf 的输入文件  不管是本地的还是其他服务器都只要输入 流就行了
        PdfReader reader = new PdfReader(gridFsResource.getInputStream());
        //输入和输出
        PdfStamper stamper = new PdfStamper(reader, response.getOutputStream());
        //获取总页数+1,下面从1开始遍历
        int total = reader.getNumberOfPages() + 1;
        // 使用calsspath 下面字体库
        BaseFont base = null;
        //字体库 具体可以百度
        base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);

        // 设置水印透明度
        PdfGState gs = new PdfGState();
        gs.setFillOpacity(0.4f);
        gs.setStrokeOpacity(0.4f);

        PdfContentByte content = null;
        for (int i = 1; i < total; i++) {
            // 在内容上方加水印
            content = stamper.getOverContent(i);
            // 在内容下方加水印
            // content = stamper.getUnderContent(i);
            content.saveState();
            content.setGState(gs);

            // 设置字体和字体大小
            content.beginText();
            content.setFontAndSize(base, 20);

            // 设置字体样式
            float ta = 1F, tb = 0F, tc = 0F, td = 1F, tx = 0F, ty = 0F;
            // 设置加粗(加粗)
            ta += 0.25F;
            td += 0.05F;
            ty -= 0.2F;
            // 设置倾斜(倾斜程序自己改)
            tc += 0.8F;
            content.setTextMatrix(ta, tb, tc, td, tx, ty);

            // 设置相对于左下角位置(向右为x,向上为y)
            content.moveText(400F, 5F);
            // 显示text
            content.showText("赖伟强");

            content.endText();
            content.stroke();
            content.restoreState();
        }

        // 关流
        stamper.close();
        reader.close();

    }

3-1 结果展示

4-  pdf 添加水印 铺满水印

    /**
     * pdf 添加水印  铺满水印
     *
     * @param objectid 下载的id
     * @param response 请求
     * @throws IOException
     */
    @RequestMapping("/download4")
    public void downloadWatermark4(String objectid, HttpServletResponse response) throws
            IOException, DocumentException, DocumentException {
        System.out.println("---------下传文件");
        //根据id 查询数据
        Query id = Query.query(Criteria.where("_id").is(objectid));
        GridFSFile fsFiles = gridFsTemplate.findOne(id);
        if (fsFiles == null) {
            System.out.println("没用获取到文件");
        }
        //文件名称
        String s = fsFiles.getFilename();
        //文件类型
        org.bson.Document metadata = fsFiles.getMetadata();
        if (metadata == null) {
            System.out.println("\"获取文件为空\";");
        }
        String contentType = fsFiles.getMetadata().get("_contentType").toString();
        System.out.println("文件类型:" + contentType);
        //通知下载
        response.setContentType(contentType);
        response.setHeader("Content-Disposition", "attachment;filename=\"" + URLEncoder.encode(s, "UTF-8") + "\"");
        GridFSBucket gridFSBucket = GridFSBuckets.create(mongoTemplate.getDb());
        GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(fsFiles.getObjectId());
        //获取mongodb的资源
        GridFsResource gridFsResource = new GridFsResource(fsFiles, gridFSDownloadStream);

        //----------------------------测试用的判断格式----------------------------------------------------------------------------
        //加个判断 判断是否pdf类型的
        if (!s.contains(".pdf")) {
            System.out.println("下载的格式不对下载对应pdf");
            Preconditions.checkArgument(false, "下载的格式不对下载对应的pdf格式");
        }
        //------------------------------------------------------------------------------------------------------------
        //-------------开始添加水印 不管你现在是本地下载还是别的服务器下载 只要给他传入InputStream 就行了----------------------------
        // pdf 下载
        //pdf 的输入文件
        //pdf 的输入文件  不管是本地的还是其他服务器都只要输入 流就行了
        PdfReader reader = new PdfReader(gridFsResource.getInputStream());
        //输入和输出
        PdfStamper stamper = new PdfStamper(reader, response.getOutputStream());
        //获取总页数+1,下面从1开始遍历
        int total = reader.getNumberOfPages() + 1;
        // 使用calsspath 下面字体库
        BaseFont base = null;
        //字体库 具体可以百度
        base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);

        //间隔
        int interval = -5;
        // 获取水印文字的高度和宽度
        int texh = 0;
        int textw = 0;
        JLabel label = new JLabel();
        //水印名称
        label.setText("赖伟强");
        //字体的高度和宽度
        FontMetrics metrics = label.getFontMetrics(label.getFont());
        texh = metrics.getHeight();
        textw = metrics.stringWidth(label.getText());
        System.out.println("textH: " + texh);
        System.out.println("textW: " + textw);

        // 设置水印透明度
        PdfGState gs = new PdfGState();
        gs.setFillOpacity(0.4f);
        gs.setStrokeOpacity(0.4f);

        com.itextpdf.text.Rectangle pageSizeWithRotation = null;
        PdfContentByte content = null;
        for (int i = 1; i < total; i++) {
            // 在内容上方加水印
            //content = stamper.getOverContent(i);
            //在内容下下方加水印
            content = stamper.getUnderContent(i);
            System.out.println(gs);
            content.setGState(gs);
            content.saveState();

            //设置字体和字体大小
            content.beginText();
            content.setFontAndSize(base, 20);

            //获取每一页的高度 宽度
            pageSizeWithRotation = reader.getPageSizeWithRotation(i);
            float pageHeight = pageSizeWithRotation.getHeight();
            float pageWidth = pageSizeWithRotation.getWidth();

            // 铺满 根据纸张大小多次添加, 水印文字成30度角倾斜
            for (int height = interval + texh; height < pageHeight; height = height + textw * 3) {
                for (int width = interval + textw; width < pageWidth + textw; width = width + textw * 2) {
                    content.showTextAligned(Element.ALIGN_LEFT, "赖伟强", width - textw, height - texh, 30);
                }
            }
            content.endText();

        }
        // 关流
        stamper.close();
        reader.close();

    }

4-1 结果图展示 

猜你喜欢

转载自blog.csdn.net/qq_38062838/article/details/123556151