Java实现对PDF、纵向、横向页面添加自定义水印功能

Java实现对PDF、纵向、横向页面添加自定义水印

  • [效果图 -- 纵向 页面PDF](#效果图 -- 纵向 页面PDF)
  • [使用到JAR Maven依赖版本](#使用到JAR Maven依赖版本)
  • [效果图 -- 横向页面PDF](#效果图 -- 横向页面PDF)

效果图 -- 纵向 页面PDF

代码如下:

使用到JAR Maven依赖版本

java 复制代码
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.27</version>
        </dependency>

--------------------------------------------------------------------------------建议复制测试 --------------------------------------------------------------------------------

java 复制代码
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
import org.apache.pdfbox.util.Matrix;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.UUID;


/**
 *  Java 对PDF 纵向 页面天添加自定义水印
 */


public class PDFWatermark {
    public static void main(String[] args) {
        try {
            // 输入PDF文件
            InputStream inputStream = new FileInputStream("W:\\pdf\\77777.pdf");  //需要更换文件地址

            // 读取PDF文档
            PDDocument document = PDDocument.load(inputStream);

            // 自定义水印内容
            String watermarkText = "lemenpan 2024-05-28 14:23:35 88888888888";

            // 遍历每一页
            for (PDPage page : document.getPages()) {
                // 获取页面宽高
                float pageWidth = page.getMediaBox().getWidth();
                float pageHeight = page.getMediaBox().getHeight();

                // 检查页面是否为纵向
                if (pageHeight > pageWidth) {
                    // 开始添加水印
                    PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true);

                    // 设置水印透明度
                    PDExtendedGraphicsState graphicsState = new PDExtendedGraphicsState();
                    graphicsState.setNonStrokingAlphaConstant(0.5f);
                    contentStream.setGraphicsStateParameters(graphicsState);

                    // 设置水印字体和大小
                    float fontSize = 41.0f;
                    contentStream.setFont(PDType1Font.HELVETICA_BOLD, fontSize);

                    // 设置水印颜色
                    contentStream.setNonStrokingColor(200, 200, 200);

                    // 设置旋转角度,以页面中心为原点
                    contentStream.transform(Matrix.getRotateInstance(Math.toRadians(55), pageWidth / 2, pageHeight / 2));

                    // 计算水印位置(居中)
                    float x = -fontSize * watermarkText.length() / 4; // 基于字符长度和字体大小的估计
                    float y = -fontSize / 4; // 基于字体大小的估计

                    // 添加水印文本
                    contentStream.beginText();
                    contentStream.newLineAtOffset(-400, -30);
                    contentStream.showText(watermarkText);
                    contentStream.endText();

                    // 关闭内容流
                    contentStream.close();
                }
            }


            UUID uuid = UUID.randomUUID();
            // 保存带有水印的PDF
            document.save("W:\\pdf\\" + uuid.toString() + ".pdf");  //需要更换文件地址

            // 关闭文档
            document.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

效果图 -- 横向页面PDF

代码如下:

java 复制代码
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
import org.apache.pdfbox.util.Matrix;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.UUID;

/**
 *  Java 对PDF 横向 页面天添加自定义水印
 */

public class PDFWatermark11HangXiang {
    public static void main(String[] args) {
        try {
            // 输入PDF文件
            InputStream inputStream = new FileInputStream("W:\\pdf\\88888.pdf");  //需要更换文件地址


            // 读取PDF文档
            PDDocument document = PDDocument.load(inputStream);

            // 自定义水印内容
            String watermarkText = "lemenpan 2024-05-28 14:23:35 88888888888";

            // 遍历每一页
            for (PDPage page : document.getPages()) {
                // 获取页面宽高
                float pageWidth = page.getMediaBox().getWidth();
                float pageHeight = page.getMediaBox().getHeight();

                // 检查页面是否为横向
                if (pageWidth > pageHeight) {
                    // 开始添加水印
                    PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true);

                    // 设置水印透明度
                    PDExtendedGraphicsState graphicsState = new PDExtendedGraphicsState();
                    graphicsState.setNonStrokingAlphaConstant(0.5f);
                    contentStream.setGraphicsStateParameters(graphicsState);

                    // 设置水印字体和大小
                    contentStream.setFont(PDType1Font.HELVETICA_BOLD, 50);

                    // 设置水印颜色
                    contentStream.setNonStrokingColor(200, 200, 200);

                    // 计算水印位置(居中)
                    float fontSize = 50.0f;
                    float stringWidth = PDType1Font.HELVETICA_BOLD.getStringWidth(watermarkText) / 1000 * fontSize;
                    float x = (pageWidth - stringWidth) / 2;
                    float y = (pageHeight - fontSize) / 2;

                    // 设置旋转角度
                    contentStream.transform(Matrix.getRotateInstance(Math.toRadians(35), pageWidth / 2, pageHeight / 2));

                    // 添加水印文本
                    contentStream.beginText();
                    contentStream.newLineAtOffset(-420,-40 ); //调节 水印内容位置 ,为 X 、Y 坐标。
                    contentStream.showText(watermarkText);
                    contentStream.endText();

                    // 关闭内容流
                    contentStream.close();
                }
            }

            UUID uuid = UUID.randomUUID();
            // 保存带有水印的PDF
            document.save("W:\\pdf\\" + uuid.toString() + ".pdf");  //需要更换文件地址


            // 关闭文档
            document.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
相关推荐
2401_851272991 分钟前
多平台UI框架C++开发
开发语言·c++·算法
骇客野人4 分钟前
Java实现B+树,体会B+树做索引的精妙
java·开发语言·b树
楼田莉子8 分钟前
C++数据结构:基数树
开发语言·数据结构·c++·学习
m0_518019489 分钟前
C++中的命令模式实战
开发语言·c++·算法
weixin_446260859 分钟前
OpenDataLoader PDF - 高效的PDF解析器,让AI更轻松获取数据!
人工智能·pdf
ProgramHan10 分钟前
十大排行榜——后端语言及要介绍
java·c++·python·php
小江的记录本10 分钟前
【反射】Java反射 全方位知识体系(附 应用场景 + 《八股文常考面试题》)
java·开发语言·前端·后端·python·spring·面试
callJJ14 分钟前
Ant Design Table 批量操作踩坑总结 —— 从三个 Bug 看前端表格开发的共性问题
java·前端·经验分享·bug·管理系统
没有bug.的程序员18 分钟前
100%采样率引发的全线熔断:Spring Boot 链路追踪的性能绞杀与物理级调优
java·spring boot·后端·生产·熔断·调优·链路追踪
不懒不懒21 分钟前
【基于 CNN 的食物图片分类:数据增强、最优模型保存与学习率调整实战】
开发语言·python