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

打印如下:

相关推荐
ANnianStriver10 分钟前
PetLumina-02-后端开发与前后端联调
java·ai·sa-token
杨了个杨89821 小时前
Keepalived + Nginx + HAProxy 高可用架构部署实战案例
java·nginx·架构
xsc6996751 小时前
从零搭建大模型与智能体平台 - 完整技术详解
python
无风听海2 小时前
多租户系统中的 OIDC:Discovery 端点与联合登录的深度实践
后端·python·flask
CTA终结者3 小时前
期货量化主力换月程序怎么移仓:天勤 underlying_symbol 与任务切换
python·区块链
马士兵教育3 小时前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习
snow@li3 小时前
Java:理解 Gradle / 后端项目的管家 / 打包SpringBoot 应用 / 完成编译、下载依赖、运行测试、打包 JAR/WAR / 速查表
java
KaMeidebaby3 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
Cloud_Shy6183 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 30 - 32)
开发语言·人工智能·笔记·python·学习方法
云烟成雨TD4 小时前
Spring AI 1.x 系列【57】动态工具发现:Tool Search Tool
java·人工智能·spring