Java 打印pdf添加水印实现

Java 打印pdf添加水印实现

添加水印工具类

复制代码
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Element;
import com.itextpdf.text.pdf.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.io.FileInputStream;
import java.io.FileOutputStream;

@Slf4j
public class PdfUtils {

    /**
     * pdf添加文字水印
     * @param waterMark 水印内容
     * @param sourcePath 源文件路径
     * @param targetPath 目标文件路径
     * @param fontSize 字体大小
     */
    public static String addWatermark(String waterMark, String sourcePath, String targetPath, int fontSize) throws Exception {
        if (StringUtils.isBlank(waterMark) || StringUtils.isBlank(sourcePath) || StringUtils.isBlank(targetPath)) {
            return sourcePath;
        }
        PdfReader reader = null;
        PdfStamper stamp = null;
        try {
            //待加水印文件
            reader = new PdfReader(new FileInputStream(sourcePath));
            //加完水印输入的文件
            stamp = new PdfStamper(reader, new FileOutputStream(targetPath));
            // 设置字体(需要考虑pdf中文无法显示的问题),Itext内置了一些中文字体,STSongStd-Light,STSong-Light
            BaseFont font = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", true);

            //设置透明度
            PdfGState pdfGState = new PdfGState();
            pdfGState.setFillOpacity(0.5f);   //设置透明度为0.5,值的范围是0.0到1.0,其中0.0代表完全透明(即不可见),1.0代表完全不透明(即完全可见)

            // 源PDF文件的总页数
            int pageSize = reader.getNumberOfPages();

            //循环对每页添加水印
            for (int i = 1; i <= pageSize; i++) {
//            PdfContentByte under = stamp.getUnderContent(i);  //水印在之前的文本下,文本会盖住水印,如果需要文本水印一起出现,不要使用该方法
                PdfContentByte under = stamp.getOverContent(i);   //水印在之前的文本上

                //平铺水印
                for (int x = 100; x < 750; x += 200) { // 控制水印在横向上的间距
                    for (int y = 100; y < 1000; y += 300) { // 控制水印在纵向上的间距
                        under.beginText();     //开始
                        under.setFontAndSize(font, 40);    //应用字体,并将字体大小改为40
                        under.setColorFill(BaseColor.LIGHT_GRAY);     //设置字体颜色
                        under.setGState(pdfGState);  //将透明度应用到水印里
                        under.showTextAligned(Element.ALIGN_CENTER, waterMark, x, y, 45);//居中;水印内容;水印x坐标;水印y坐标;45°角
                        under.endText();
                    }
                }
            }
        }finally {
            if (stamp != null) {
                stamp.close();
            }
            if (reader != null) {
                reader.close();
            }
        }
        return targetPath;
    }
}

调用添加水印代码

复制代码
	    String waterMark = "预览";
        String sourcePath= "D:\\project\\code\\Att\\Templates\\111.pdf";
        String targetPath= "D:\\project\\code\\Att\\Templates\\222.pdf";
        String fontSize = 40;
        path = PdfUtils.addWatermark(waterMark, sourcePath, targetPath, fontSize);

打印如下:

相关推荐
雄哥00719 小时前
spring 升级记录
java·后端·spring·spring升级
卓怡学长19 小时前
m320基于Java的网络音乐系统的设计与实现
java·数据库·spring·tomcat·maven
yaaakaaang19 小时前
五、原型模式
java·原型模式
如竟没有火炬19 小时前
搜索二维矩阵
数据结构·python·算法·leetcode·矩阵
chh56319 小时前
从零开始学C++--类和对象
java·开发语言·c++·学习·算法
郝学胜-神的一滴19 小时前
自动微分实战:梯度下降的迭代实现与梯度清零核心解析
人工智能·pytorch·python·深度学习·算法·机器学习
用户97514707513619 小时前
Tomcat安装及配置教程(保姆级)
java
PILIPALAPENG19 小时前
第1周 Day 5:前端转型AI,回顾总结🎯
前端·人工智能·python
列星随旋19 小时前
基于 Redis + Lua,实现“多维度原子限流”(令牌桶 + 滑动窗口)
java·redis·lua
一定要AK19 小时前
Spring 核心容器从入门到精通
java·后端·spring