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();
        }
    }
}
相关推荐
Pluto_CSND3 分钟前
Java中的静态代理与动态代理(Proxy.newProxyInstance)
java·开发语言
百***46451 小时前
Java进阶-在Ubuntu上部署SpringBoot应用
java·spring boot·ubuntu
serve the people1 小时前
Prompts for Chat Models in LangChain
java·linux·langchain
一叶飘零_sweeeet1 小时前
不止于 API 调用:解锁 Java 工具类设计的三重境界 —— 可复用性、线程安全与性能优化
java·工具类
惊讶的猫2 小时前
LSTM论文解读
开发语言·python
獨枭2 小时前
C# 本地项目引用失效与恢复全攻略
开发语言·c#·visual studio
国服第二切图仔3 小时前
Rust开发之Trait 定义通用行为——实现形状面积计算系统
开发语言·网络·rust
mjhcsp3 小时前
C++ 循环结构:控制程序重复执行的核心机制
开发语言·c++·算法
A阳俊yi3 小时前
Spring Data JPA
java·开发语言