Java对Word文档里面的图片批量添加水印

在我们的日常工作中,经常会遇到需要给Word文档中的图片添加水印的情况。有时候我们可能需要手动一个一个地添加水印,这不仅费时费力,还容易出错。那么有没有一种简单的方法可以批量给Word文档中的图片添加水印呢?答案是肯定的,使用Java编程语言可以轻松实现这个需求。

1. 需求分析

我们需要实现的功能是批量给Word文档中的图片添加水印。具体来说,我们需要解决以下几个问题:

  • 如何读取Word文档中的图片?
  • 如何给图片添加水印?
  • 如何保存修改后的Word文档?

接下来,我们将一步步来解决这些问题。

2. 读取Word文档中的图片

要读取Word文档中的图片,我们可以使用Apache POI库。Apache POI是一个开源的Java库,它提供了操作Microsoft Office格式文件的API。我们可以使用它来读取和修改Word文档。

首先,我们需要导入Apache POI的相关依赖。在Maven项目中,可以在pom.xml文件中添加以下内容:

<dependencies>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>4.1.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.1.2</version>
    </dependency>
</dependencies>

接下来,我们可以使用以下代码读取Word文档中的图片:

import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xwpf.usermodel.XWPFPictureData;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

public class WordImageUtils {

    public static List<XWPFPictureData> readImages(String filePath) throws IOException {
        try (FileInputStream fis = new FileInputStream(filePath);
             XWPFDocument document = new XWPFDocument(OPCPackage.open(fis))) {
            return document.getAllPictures();
        }
    }

    public static void main(String[] args) throws IOException {
        List<XWPFPictureData> images = readImages("example.docx");
        for (int i = 0; i < images.size(); i++) {
            XWPFPictureData image = images.get(i);
            byte[] data = image.getData();
            String fileName = "image" + (i+1) + ".png";
            try (FileOutputStream fos = new FileOutputStream(fileName)) {
                fos.write(data);
            }
        }
    }
}

上述代码中,我们首先使用XWPFDocument类打开Word文档,然后通过调用getAllPictures()方法获取文档中的所有图片。接下来,我们遍历图片列表,使用FileOutputStream将图片数据写入到文件中。

3. 给图片添加水印

要给图片添加水印,我们可以使用Java的图形处理库,比如javax.imageio.ImageIO。下面是一个简单的示例代码:

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ImageUtils {

    public static void addWatermark(String imagePath, String watermarkText) throws IOException {
        File imageFile = new File(imagePath);
        BufferedImage image = ImageIO.read(imageFile);

        Graphics2D g2d = (Graphics2D) image.getGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g2d.setFont(new Font("Arial", Font.BOLD, 36));
        g2d.setColor(Color.RED);
        g2d.drawString(watermarkText, 50, 50);
        g2d.dispose();

        ImageIO.write(image, "png", imageFile);
    }

    public static void main(String[] args) throws IOException {
        addWatermark("image.png", "Watermark");
    }
}

上述代码中,我们首先使用ImageIO.read()方法读取图片文件,并创建一个Graphics2D对象。然后,我们可以设置文字的字体、颜色等属性,并调用drawString()方法在图片上绘制水印。最后,我们使用ImageIO.write()