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();
        }
    }
}
相关推荐
Ajiang282473530427 分钟前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
幽兰的天空31 分钟前
Python 中的模式匹配:深入了解 match 语句
开发语言·python
Theodore_10223 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸5 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象5 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了5 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
----云烟----5 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024066 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
小二·6 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic6 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端