java对pdf文件添加水印

java对pdf文件添加水印

添加依赖

xml 复制代码
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.10</version>
        </dependency>

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

参考代码

java 复制代码
private final static Map<String,Object> pdfConfig = getPdfDefaultConfig();



    public static Map<String,Object> getPdfDefaultConfig(){
        Map<String, Object> config = new HashMap<>();
        try {
            config.put("baseFont", BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",   BaseFont.EMBEDDED));
        } catch (IOException | DocumentException e) {
            throw new RuntimeException(e);
        }
        config.put("fillOpacity",0.3f);// 填充透明度
        config.put("strokeOpacity",0.4f);// 笔划不透明度
        config.put("fontSize",16);//字体大小
        config.put("interval",-15);// 水印间隔
        config.put("rotation",30);// 旋转角度
        return config;
    }

    public static void pdfByText(InputStream inputStream, OutputStream outputStream, String waterMarkName, Map<String,Object> config) throws DocumentException, IOException {
        PdfReader reader = new PdfReader(inputStream);
        PdfStamper stamper = new PdfStamper(reader, outputStream);
        try {

            BaseFont base = (BaseFont) config.getOrDefault("baseFont",pdfConfig.get("baseFont"));

            com.itextpdf.text.Rectangle pageRect;
            PdfGState gs = new PdfGState();
            gs.setFillOpacity((Float) config.getOrDefault("fillOpacity",pdfConfig.get("fillOpacity")));
            gs.setStrokeOpacity((Float) config.getOrDefault("strokeOpacity",pdfConfig.get("strokeOpacity")));
            int total = reader.getNumberOfPages() + 1;

            JLabel label = new JLabel();
            FontMetrics metrics;
            int textH;
            int textW;
            label.setText(waterMarkName);
            metrics = label.getFontMetrics(label.getFont());
            textH = metrics.getHeight();
            textW = metrics.stringWidth(label.getText());

            PdfContentByte under;
            int interval = (int) config.getOrDefault("interval", pdfConfig.get("interval"));
            int rotation = (int) config.getOrDefault("rotation", pdfConfig.get("rotation"));
            int fontSize = (int) config.getOrDefault("fontSize", pdfConfig.get("fontSize"));
            for (int i = 1; i < total; i++) {
                pageRect = reader.getPageSizeWithRotation(i);
                under = stamper.getOverContent(i);
                under.saveState();
                under.setGState(gs);
                under.beginText();
                under.setFontAndSize(base, fontSize);


                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, rotation);
                    }
                }
                // 添加水印文字
                under.endText();
            }

        } finally {
            stamper.close();
            reader.close();
        }
    }

测试

java 复制代码
public static void main(String[] args) throws IOException, DocumentException {
        pdfByText( new FileInputStream("F:\\tmp\\1\\python基于深度学习的音乐推荐方法研究系统.pdf"), new FileOutputStream("F:\\tmp\\1\\python基于深度学习的音乐推荐方法研究系统-pdf.pdf"),"测试水印-abments", new HashMap<>());
    }

效果展示

说明

方法pdfByText的参数设置为InputStream inputStream, OutputStream outputStream,是为了方便java中直接输出给响应体对象。

在使用过程如果遇到问题欢迎留言讨论。

相关推荐
Dovis(誓平步青云)8 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
HEJOO98 小时前
指针的算术运算详解
java·数据结构·算法
sunshine22 girl8 小时前
Java学习六 Java常见API-2--String-3-字符串的截取替换和其他方法
java·开发语言·学习
lsc_blog8 小时前
远程和居家办公的经历,技术简历上怎么摆
面试·职场和发展·重构·pdf·求职招聘
EatFan8 小时前
从“框架混战“到“运行时收敛“:2026 年 AI Agent 开发框架的三条路线之争
java·数据库·人工智能·多智能体·ai agent·mcp·agent 框架
小蒜学长8 小时前
基于SpringBoot的佳新超市管理系统设计与实现系统(代码+数据库+LW)
java·数据库·spring boot·后端·佳新超市管理系统
sunshine22 girl9 小时前
Java学习六 Java常见API-1-Radom随机数
java·开发语言·学习
wangbing112510 小时前
使用jps jstack排查系统问题
java
于指尖飞舞10 小时前
java面试题总结
java·开发语言
ZealSinger10 小时前
LangChain4j用AiServices拼Tool
java·rag·ai智能体·langchain4j