我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java PDF加水印

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java PDF加水印

自适应文字长度水印

1.效果图

2.代码

2.1.pom

                            com.itextpdf            itextpdf            5.5.13.1                                    com.itextpdf            itext-asian            5.2.0        

2.2.水印工具类(自动调节文字个数)

import cn.hutool.core.date.DateUtil;import com.itextpdf.text.Element;import com.itextpdf.text.Rectangle;import com.itextpdf.text.pdf.*;import javax.swing.*;import java.awt.*;import java.io.*;import java.net.URL;import java.nio.file.Files;import java.nio.file.Paths;import static com.shinkeer.common.utils.SecurityUtils.getUsername;public class PdfWatermarkUtil {    public static void main(String[] args) {        PdfWatermarkLocal("C:\\Users\\Pictures\\pdf水印测试.pdf", "C:\\Users\\Pictures\\pdf(加).pdf",                "一二三四五六七八九十十九八七六五四三二一");    }    public static void main2(String[] args) throws Exception {        File file = new File("C:\\Users\\Pictures\\pdf水印测试.pdf");        InputStream inputStream = file.toURL().openStream();        InputStream stream = PdfWatermarkTool.addPdfWatermark(inputStream, "这是水印" + DateUtil.now(), 10, 30, 50);        writeToLocal("C:\\Users\\Pictures\\AAA" + System.currentTimeMillis() + ".pdf", stream);    }        private static void writeToLocal(String destination, InputStream input) throws IOException {        int index;        byte[] bytes = new byte[1024];        FileOutputStream downloadFile = new FileOutputStream(destination);        while ((index = input.read(bytes)) != -1) {            downloadFile.write(bytes, 0, index);            downloadFile.flush();        }        downloadFile.close();        input.close();    }        public static void PdfWatermarkLocal(String inputFile, String outputFile, String waterMarkName) {        try {            // 切记这里的参数是文件的路径 ,路径必须是双斜杠的如F:\\test.pdf,不能是F:/test.pdf 或者F:\test.pdf            PdfReader reader = new PdfReader(inputFile);            PdfStamper stamper = new PdfStamper(reader, Files.newOutputStream(Paths.get(outputFile)));            BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);            PdfGState gs = new PdfGState();            gs.setFillOpacity(0.2f);//改透明度            gs.setStrokeOpacity(0.4f);            int total = reader.getNumberOfPages() + 1;            JLabel label = new JLabel();            label.setText(waterMarkName);            PdfContentByte under;            // 可添加多个水印            Rectangle pageRect = null;            label.setText(waterMarkName);            for (int i = 1; i < total; i++) {                pageRect = reader.getPageSizeWithRotation(i);                int width1 = (int) pageRect.getWidth();                int height1 = (int) pageRect.getHeight();                int fontSize = (width1 + height1) / 80;                // 间隔距离(参数可调节)                int interval = fontSize * 2;                // 文字占用的宽度                int xWidth = getStrWidth(waterMarkName, fontSize);                // x,y可以绘制的数量,多加一个补充空白                int xCanNum = width1 / xWidth + 1;                int yCanNum = height1 / fontSize + 1;                // 在内容上方加水印                under = stamper.getOverContent(i);                // 在内容下方加水印                //under = stamper.getUnderContent(i);                under.saveState();                under.setGState(gs);                under.beginText();                //水印字体和大小                under.setFontAndSize(base, fontSize);                // 水印文字成30度角倾斜                for (int ii = 1; ii <= yCanNum; ii++) {                    int y = fontSize * ii + interval * ii;                    for (int jj = 0; jj < xCanNum; jj++) {                        int x = xWidth * jj + interval * jj;                        under.showTextAligned(Element.ALIGN_LEFT    , waterMarkName, x, y - (fontSize + interval) * jj, 30);                    }                }                // 添加水印文字                under.endText();            }            stamper.close();            reader.close();        } catch (Exception e) {            e.printStackTrace();        }    }        public static OutputStream PdfWatermarkOut(InputStream inputStream, String waterMarkName) {        try {            PdfReader reader = new PdfReader(inputStream);            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();            PdfStamper stamper = new PdfStamper(reader, outputStream);            BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);            PdfGState gs = new PdfGState();            gs.setFillOpacity(0.2f);//改透明度            gs.setStrokeOpacity(0.4f);            int total = reader.getNumberOfPages() + 1;            JLabel label = new JLabel();            label.setText(waterMarkName);            PdfContentByte under;            // 可添加多个水印            Rectangle pageRect = null;            label.setText(waterMarkName);            for (int i = 1; i < total; i++) {                pageRect = reader.getPageSizeWithRotation(i);                int width1 = (int) pageRect.getWidth();                int height1 = (int) pageRect.getHeight();                int fontSize = (width1 + height1) / 80;                // 间隔距离(参数可调节)                int interval = fontSize * 2;                // 文字占用的宽度                int xWidth = getStrWidth(waterMarkName, fontSize);                // x,y可以绘制的数量,多加一个补充空白                int xCanNum = width1 / xWidth + 1;                int yCanNum = height1 / fontSize + 1;                // 在内容上方加水印                under = stamper.getOverContent(i);                // 在内容下方加水印                //under = stamper.getUnderContent(i);                under.saveState();                under.setGState(gs);                under.beginText();                //水印字体和大小                under.setFontAndSize(base, fontSize);                // 水印文字成30度角倾斜                for (int ii = 1; ii <= yCanNum; ii++) {                    int y = fontSize * ii + interval * ii;                    for (int jj = 0; jj < xCanNum; jj++) {                        int x = xWidth * jj + interval * jj;                        under.showTextAligned(Element.ALIGN_LEFT    , waterMarkName, x, y - (fontSize + interval) * jj, 30);                    }                }                // 添加水印文字                under.endText();            }            stamper.close();            reader.close();            return outputStream;        } catch (Exception e) {            throw new RuntimeException(e);        }    }        public static InputStream PdfWatermarkInt(InputStream inputStream, String waterMarkName) {        try {            PdfReader reader = new PdfReader(inputStream);            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();            PdfStamper stamper = new PdfStamper(reader, outputStream);            BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);            PdfGState gs = new PdfGState();            gs.setFillOpacity(0.2f);//改透明度            gs.setStrokeOpacity(0.4f);            int total = reader.getNumberOfPages() + 1;            JLabel label = new JLabel();            label.setText(waterMarkName);            PdfContentByte under;            // 可添加多个水印            Rectangle pageRect = null;            label.setText(waterMarkName);            for (int i = 1; i < total; i++) {                pageRect = reader.getPageSizeWithRotation(i);                int width1 = (int) pageRect.getWidth();                int height1 = (int) pageRect.getHeight();                int fontSize = (width1 + height1) / 80;                // 间隔距离(参数可调节)                int interval = fontSize * 2;                // 文字占用的宽度                int xWidth = getStrWidth(waterMarkName, fontSize);                // x,y可以绘制的数量,多加一个补充空白                int xCanNum = width1 / xWidth + 1;                int yCanNum = height1 / fontSize + 1;                // 在内容上方加水印                under = stamper.getOverContent(i);                // 在内容下方加水印                //under = stamper.getUnderContent(i);                under.saveState();                under.setGState(gs);                under.beginText();                //水印字体和大小                under.setFontAndSize(base, fontSize);                // 水印文字成30度角倾斜                for (int ii = 1; ii <= yCanNum; ii++) {                    int y = fontSize * ii + interval * ii;                    for (int jj = 0; jj < xCanNum; jj++) {                        int x = xWidth * jj + interval * jj;                        under.showTextAligned(Element.ALIGN_LEFT    , waterMarkName, x, y - (fontSize + interval) * jj, 30);                    }                }                // 添加水印文字                under.endText();            }            stamper.close();            reader.close();            return new ByteArrayInputStream(outputStream.toByteArray());        } catch (Exception e) {            throw new RuntimeException(e);        }    }        public static int getStrWidth(String str, int fontSize) {        char[] chars = str.toCharArray();        int fontSize2 = fontSize / 2;        int width = 0;        for (char c : chars) {            int len = String.valueOf(c).getBytes().length;            // 汉字为3,其余1            // 可能还有一些特殊字符占用2等等,统统计为汉字            if (len != 1) {                width += fontSize;            } else {                width += fontSize2;            }        }        return width == 0 ? 1 : width;    }}

水印工具类(写死文字大小个数)

import cn.hutool.core.date.DateUtil;import com.itextpdf.text.Element;import com.itextpdf.text.Rectangle;import com.itextpdf.text.pdf.*;import javax.swing.*;import java.awt.*;import java.io.*;import java.net.URL;import java.nio.file.Files;import java.nio.file.Paths;import static com.shinkeer.common.utils.SecurityUtils.getUsername;public class PdfWatermarkUtil {    public static void main(String[] args) {        PdfWatermarkLocal("D:\\AAA.pdf", "D:\\BBB.pdf", "这是水印");    }    public static void main2(String[] args) throws Exception {        File file = new File("D:\\AAA.pdf");        InputStream inputStream = file.toURL().openStream();        InputStream stream = PdfWatermarkTool.addPdfWatermark(inputStream, "这是水印" + DateUtil.now(), 10, 30, 50);        writeToLocal("D:\\AAA" + System.currentTimeMillis() + ".pdf", stream);    }        private static void writeToLocal(String destination, InputStream input) throws IOException {        int index;        byte[] bytes = new byte[1024];        FileOutputStream downloadFile = new FileOutputStream(destination);        while ((index = input.read(bytes)) != -1) {            downloadFile.write(bytes, 0, index);            downloadFile.flush();        }        downloadFile.close();        input.close();    }        public static void PdfWatermarkLocal(String inputFile, String outputFile, String waterMarkName) {        try {            // 水印的高和宽(参数可调节)            int textH = 75;            int textW = 170;            // 间隔距离(参数可调节)            int interval = 30;            // 切记这里的参数是文件的路径 ,路径必须是双斜杠的如F:\\test.pdf,不能是F:/test.pdf 或者F:\test.pdf            PdfReader reader = new PdfReader(inputFile);            PdfStamper stamper = new PdfStamper(reader, Files.newOutputStream(Paths.get(outputFile)));            BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);            PdfGState gs = new PdfGState();            gs.setFillOpacity(0.2f);//改透明度            gs.setStrokeOpacity(0.4f);            int total = reader.getNumberOfPages() + 1;            JLabel label = new JLabel();            label.setText(waterMarkName);            PdfContentByte under;            // 可添加多个水印            Rectangle pageRect = null;            FontMetrics metrics;            label.setText(waterMarkName);            metrics = label.getFontMetrics(label.getFont());            for (int i = 1; i < total; i++) {                pageRect = reader.getPageSizeWithRotation(i);                // 在内容上方加水印                under = stamper.getOverContent(i);                // 在内容下方加水印                //under = stamper.getUnderContent(i);                under.saveState();                under.setGState(gs);                under.beginText();                under.setFontAndSize(base, 20);                // 水印文字成30度角倾斜                for (int height = interval + textH; height < pageRect.getHeight();                     height = height + textH * 3) {                    for (int width = interval + textW; width < pageRect.getWidth() + textW;                         width = width + textW * 2) {                        under.showTextAligned(Element.ALIGN_LEFT    , waterMarkName, width - textW,    height - textH, 30);                    }                }                // 添加水印文字                under.endText();            }            stamper.close();            reader.close();        } catch (Exception e) {            e.printStackTrace();        }    }        public static OutputStream PdfWatermarkOut(InputStream inputStream, String waterMarkName) {        try {            // 水印的高和宽(参数可调节)            int textH = 75;            int textW = 170;            // 间隔距离(参数可调节)            int interval = 30;            PdfReader reader = new PdfReader(inputStream);            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();            PdfStamper stamper = new PdfStamper(reader, outputStream);            BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);            PdfGState gs = new PdfGState();            gs.setFillOpacity(0.2f);//改透明度            gs.setStrokeOpacity(0.4f);            int total = reader.getNumberOfPages() + 1;            JLabel label = new JLabel();            label.setText(waterMarkName);            PdfContentByte under;            // 可添加多个水印            Rectangle pageRect = null;            FontMetrics metrics;            label.setText(waterMarkName);            metrics = label.getFontMetrics(label.getFont());            for (int i = 1; i < total; i++) {                pageRect = reader.getPageSizeWithRotation(i);                // 在内容上方加水印                under = stamper.getOverContent(i);                // 在内容下方加水印                //under = stamper.getUnderContent(i);                under.saveState();                under.setGState(gs);                under.beginText();                under.setFontAndSize(base, 20);                // 水印文字成30度角倾斜                for (int height = interval + textH; height < pageRect.getHeight();                     height = height + textH * 3) {                    for (int width = interval + textW; width < pageRect.getWidth() + textW;                         width = width + textW * 2) {                        under.showTextAligned(Element.ALIGN_LEFT    , waterMarkName, width - textW,    height - textH, 30);                    }                }                // 添加水印文字                under.endText();            }            stamper.close();            reader.close();            return outputStream;        } catch (Exception e) {            throw new RuntimeException(e);        }    }        public static InputStream PdfWatermarkInt(InputStream inputStream, String waterMarkName) {        try {            // 水印的高和宽(参数可调节)            int textH = 75;            int textW = 170;            // 间隔距离(参数可调节)            int interval = 30;            PdfReader reader = new PdfReader(inputStream);            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();            PdfStamper stamper = new PdfStamper(reader, outputStream);            BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);            PdfGState gs = new PdfGState();            gs.setFillOpacity(0.2f);//改透明度            gs.setStrokeOpacity(0.4f);            int total = reader.getNumberOfPages() + 1;            JLabel label = new JLabel();            label.setText(waterMarkName);            PdfContentByte under;            // 可添加多个水印            Rectangle pageRect = null;            FontMetrics metrics;            label.setText(waterMarkName);            metrics = label.getFontMetrics(label.getFont());            for (int i = 1; i < total; i++) {                pageRect = reader.getPageSizeWithRotation(i);                // 在内容上方加水印                under = stamper.getOverContent(i);                // 在内容下方加水印                //under = stamper.getUnderContent(i);                under.saveState();                under.setGState(gs);                under.beginText();                under.setFontAndSize(base, 20);                // 水印文字成30度角倾斜                for (int height = interval + textH; height < pageRect.getHeight();                     height = height + textH * 3) {                    for (int width = interval + textW; width < pageRect.getWidth() + textW;                         width = width + textW * 2) {                        under.showTextAligned(Element.ALIGN_LEFT    , waterMarkName, width - textW,    height - textH, 30);                    }                }                // 添加水印文字                under.endText();            }            stamper.close();            reader.close();            return new ByteArrayInputStream(outputStream.toByteArray());        } catch (Exception e) {            throw new RuntimeException(e);        }    }}

来源地址:https://blog.csdn.net/Ying_ph/article/details/131800711

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java PDF加水印

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python添加pdf水印

0、用到两个扩展模块:ReportLab、PyPDF2。1、创建水印PDF。1)、创建文字水印pdf文件代码:#encoding=utf-8#author: walker#date: 2014-03-17#function: 创建文字水印p
2023-01-31

给PDF添加水印(Python+C#)

1、Python + PDFlib   以下是用PDFlib给pdf添加水印的速记,另外PDFStamp是个很好用的pdf水印工具。PDFlib功能比较多、杂;PDFStamp功能单一,更方便使用。据walker测试,PDFlib会比PDF
2023-01-31

SpringBoot实现PDF添加水印的方法

本篇文章和大家了解一下SpringBoot实现PDF添加水印的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。简介PDF(Portable Document Format,便携式文档格式)是一种流行的文件格式,它可以在
2023-08-03

Java使用pdfbox实现给pdf文件加图片水印

有时候需要给pdf加水印,市面上工具都是收费的要会员,还是自食其力吧;尝试过spire.pdf.free那个超过10页就不行了!所以本文还是使用了pdfbox,感兴趣的可以了解一下
2022-11-16

SpringBoot实现PDF添加水印的示例

本文主要介绍了SpringBoot实现PDF添加水印的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-20

Java如何添加水印

这篇文章将为大家详细讲解有关Java如何添加水印,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。JAVA/JSP在图片中添加文字或在图片中添加图片.import java.awt.Color;import
2023-06-03

python opencv加水印 去水印

收到的需求是在一个图上匹配到水印 然后将原来的水印换成一个新水印先要安装一个库 库文件代码如下:# coding=utf-8import cv2import numpy as np# 膨胀算法 Kernel_DILATE_KERNEL =
2023-01-31

如何添加或删除PDF文件中的水印

这篇文章将为大家详细讲解有关如何添加或删除PDF文件中的水印,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、怎样添加水印步骤一:在电脑中找到并打开我们需要使用的迅捷PDF编辑器,进入软件后把需要添加水印
2023-06-05

Java实现添加文字水印和图片水印功能

为图片添加水印是一种常用的图片处理技术,本文主要介绍了Java实现添加文字水印和图片水印功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-18

java怎么实现添加图片水印和文字水印

这篇文章主要介绍java怎么实现添加图片水印和文字水印,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!我们经常会在一些图片或者图片上看到某某公司或品牌的水印,那么我们可不可以自己在喜欢的图片或文件上添加水印呢?答案当然
2023-06-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录