使用Java为PDF添加水印图片的完整指南

在这篇文章中,我们将学习如何在Java中为PDF文件添加水印图片。这个过程包括几个简单的步骤。通过以下流程表,你可以快速了解整个过程。

步骤 操作
1 设置项目依赖
2 加载PDF文件
3 创建水印图片
4 将水印添加到PDF
5 保存新的PDF文件

接下来让我们详细了解每个步骤。

步骤1:设置项目依赖

我们将使用一个名为 Apache PDFBox 的库,它是处理PDF文件的强大工具。你可以在你的项目中通过Maven添加依赖:

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.24</version>
</dependency>

步骤2:加载PDF文件

我们需要从磁盘中加载要添加水印的PDF文件。以下是加载PDF的代码:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;

// 加载PDF文件的函数
public PDDocument loadPDF(String filePath) throws IOException {
    // 使用PDFBox加载PDF
    return PDDocument.load(new File(filePath));
}

这里,loadPDF 方法接收一个文件路径并返回 PDDocument 对象,即加载的PDF文件。

步骤3:创建水印图片

这一步我们需要准备一个图片作为水印。对于图片的加载,我们可以使用以下代码:

import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

// 创建水印图片的函数
public PDImageXObject createWatermarkImage(String imagePath, PDDocument document) throws IOException {
    // 从磁盘加载图片并返回PDImageXObject
    return PDImageXObject.createFromFile(imagePath, document);
}

这里,createWatermarkImage 方法接收图片文件路径和 PDDocument 对象,并返回一个可以添加到PDF的图像对象。

步骤4:将水印添加到PDF

在此步骤中,我们将水印图片添加到每一页的PDF中:

public void addWatermarkToPDF(PDDocument document, PDImageXObject watermarkImage) throws IOException {
    // 遍历每一页
    for (PDPage page : document.getPages()) {
        // 在指定位置添加水印图片
        PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true);
        contentStream.drawImage(watermarkImage, 100, 100, 200, 100); // x,y,宽,高
        contentStream.close();
    }
}

addWatermarkToPDF 方法中,遍历所有页面并在指定位置绘制水印,指定位置和大小可以根据需求调整。

步骤5:保存新的PDF文件

最后一步是将修改后的PDF保存到磁盘:

public void savePDF(PDDocument document, String outputPath) throws IOException {
    // 保存PDF文件
    document.save(outputPath);
    document.close();
}

这里,savePDF 方法接收 PDDocument 对象和输出文件路径,并将文件保存到指定位置。

整合代码

以下是将这几个步骤整合在一起的代码示例:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

import java.io.File;
import java.io.IOException;

public class PDFWatermark {

    public static void main(String[] args) throws IOException {
        PDFWatermark watermark = new PDFWatermark();
        PDDocument document = watermark.loadPDF("input.pdf");
        PDImageXObject watermarkImage = watermark.createWatermarkImage("watermark.png", document);
        watermark.addWatermarkToPDF(document, watermarkImage);
        watermark.savePDF(document, "output.pdf");
    }

    // 之前的步骤代码...
}

状态图

以下是状态图,展示程序的状态。

stateDiagram
    [*] --> LoadPDF
    LoadPDF --> CreateWatermarkImage
    CreateWatermarkImage --> AddWatermarkToPDF
    AddWatermarkToPDF --> SavePDF
    SavePDF --> [*]

类图

以下是类图,表示程序的类及其关系。

classDiagram
    class PDFWatermark {
        +loadPDF(filePath: String) : PDDocument
        +createWatermarkImage(imagePath: String, document: PDDocument) : PDImageXObject
        +addWatermarkToPDF(document: PDDocument, watermarkImage: PDImageXObject) : void
        +savePDF(document: PDDocument, outputPath: String) : void
    }

结尾

通过以上步骤,你现在可以使用Java向PDF文件添加水印图片。这个过程非常简单,只需几个步骤和少量代码即可实现。而且通过利用Apache PDFBox这个强大的库,你可以对子类的PDF操作进行更多的自定义和扩展。希望这篇指南对你有所帮助,祝你编程愉快!