IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> java monogodb 图片 pdf 下载添加单个水印 铺满水印 -> 正文阅读

[移动开发]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 结果图展示?

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 21:02:21  更:2022-03-21 21:05:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 19:15:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码