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

打印如下:

相关推荐
PILIPALAPENG14 分钟前
Python 语法速成指南:前端开发者视角(JS 类比版)
前端·人工智能·python
她的男孩24 分钟前
从零搭一个企业后台,为什么我把能力拆成 Starter 和 Plugin
java·后端·架构
RainCity27 分钟前
Java Swing 自定义组件库分享(七)
java·笔记·后端
Sam_Deep_Thinking32 分钟前
连锁门店的外卖订单平台对接
java·微服务·架构·系统架构
_遥远的救世主_1 小时前
从一次结果集密集型查询 OOM 看 Java 服务的稳定性架构治理
java·后端
用户8356290780511 小时前
Python 操作 PowerPoint 页眉与页脚指南
后端·python
一楼的猫1 小时前
从工具链视角对比:番茄作家助手 vs 第三方写作辅助方案
java·服务器·开发语言·前端·学习·chatgpt·ai写作
枫叶林FYL2 小时前
项目九:异步高性能爬虫与数据采集中枢 —— 基于 Crawl<sub>4</sub>AI 与 Playwright 的现代化数据采集平台 项目总览
爬虫·python·深度学习·wpf
likerhood2 小时前
Java static 关键字从浅入深
java·开发语言
猫猫的小茶馆2 小时前
【Python】函数与模块化编程
linux·开发语言·arm开发·驱动开发·python·stm32