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();
        }
    }
}
相关推荐
全栈凯哥6 分钟前
16.Spring Boot 国际化完全指南
java·spring boot·后端
M1A113 分钟前
Java集合框架深度解析:LinkedList vs ArrayList 的对决
java·后端
Tanecious.13 分钟前
C++--红黑树
开发语言·c++
Top`17 分钟前
Java 泛型 (Generics)
java·开发语言·windows
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ42 分钟前
如何使用Java WebSocket API实现客户端和服务器端的通信?
java·开发语言·websocket
Shartin1 小时前
Can201-Introduction to Networking: Application Layer应用层
服务器·开发语言·php
是小崔啊1 小时前
tomcat源码02 - 理解Tomcat架构设计
java·tomcat
没有bug.的程序员1 小时前
JAVA面试宝典 -《安全攻防:从 SQL 注入到 JWT 鉴权》
java·安全·面试
栈溢出了1 小时前
MyBatis实现分页查询-苍穹外卖笔记
java·笔记·mybatis
morningcat20181 小时前
java17 gc笔记
java·jvm·笔记