iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java PDF加水印
  • 592
分享到

Java PDF加水印

javapdf 2023-10-20 17:10:46 592人浏览 泡泡鱼
摘要

自适应文字长度水印 1.效果图 2.代码 2.1.pom com.itextpdf itextpdf 5.5.13.1

自适应文字长度水印

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

--结束END--

本文标题: Java PDF加水印

本文链接: https://www.lsjlt.com/news/433137.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作