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);

打印如下:

相关推荐
要开心吖ZSH26 分钟前
一文搞懂:JDK 21 虚拟线程 vs N种异步方案,到底该怎么选?
java·数据库·jdk·虚拟线程
guodingdingh5 小时前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯7 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育7 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵7 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
想会飞的蒲公英8 小时前
计算机怎样读取中文文本:编码、清洗与标准化
人工智能·python·自然语言处理
腻害兔9 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
SeaTunnel9 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
深度研习笔记9 小时前
OpenCV工业视觉实战09|项目EXE打包+工控机无环境部署+后台常驻运行,彻底脱离Python环境,完成项目最终交付
python·opencv·webpack
碎光拾影9 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库