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();
        }
    }
}
相关推荐
九圣残炎15 分钟前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
wclass-zhengge18 分钟前
Netty篇(入门编程)
java·linux·服务器
童先生20 分钟前
Go 项目中实现类似 Java Shiro 的权限控制中间件?
开发语言·go
lulu_gh_yu21 分钟前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
Re.不晚1 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
老秦包你会1 小时前
Qt第三课 ----------容器类控件
开发语言·qt
凤枭香1 小时前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
雷神乐乐1 小时前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven
ULTRA??1 小时前
C加加中的结构化绑定(解包,折叠展开)
开发语言·c++
码农派大星。1 小时前
Spring Boot 配置文件
java·spring boot·后端