前言

最近公司做一个需求,给用户上传的文件word和pdf文件进行添加水印,若是doc、docx文件先进行word转pdf然后加水印,如果是pdf文件直接进行加水印。

word转pdf以前服务已经实现了直接复用代码,pdf添加水印通过itextpdf可以直接使用,本文仅做备忘。

使用步骤

一、导入依赖

        <!-- 对PDF文件的操作 -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13.1</version>
        </dependency>
        <!-- PDF文件 字体 防止中文乱码 -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>

二、工具类代码

import com.itextpdf.text.Element;
import com.itextpdf.text.pdf.*;
import org.apache.commons.io.IOUtils;

import java.io.FileInputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Optional;

/**
 * WatermarkUtils
 * PDF添加水印工具类
 *
 * @author Lcry
 */
public class WaterMarkUtils {
    public static final String DEFAULT_WATERMARK_TEXT = "绝密资料";

    /**
     * pdf添加水印
     *
     * @param waterMarkText  水印文字
     * @param pdfFileBytes   pdf
     * @param outputFilePath 输出流
     */
    public static void addWaterMark(String waterMarkText, byte[] pdfFileBytes, OutputStream outputFilePath) {
        try {
            // 原PDF文件
            PdfReader reader = new PdfReader(pdfFileBytes);
            // 输出的PDF文件内容
            PdfStamper stamper = new PdfStamper(reader, outputFilePath);
            // 字体 来源于 itext-asian jar包
            BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", true);
            PdfGState gs = new PdfGState();
            // 设置透明度
            gs.setFillOpacity(0.2f);
            gs.setStrokeOpacity(0.3f);

            int totalPage = reader.getNumberOfPages() + 1;
            for (int i = 1; i < totalPage; i++) {
                // 内容上层
                PdfContentByte content = stamper.getOverContent(i);
                content.beginText();
                // 字体添加透明度
                content.setGState(gs);
                // 添加字体大小等
                content.setFontAndSize(baseFont, 170);
                // 添加范围
                content.showTextAligned(Element.ALIGN_BOTTOM, Optional.ofNullable(waterMarkText).orElse(""), 100, 100, 45);
                content.endText();
            }
            // 关闭
            stamper.close();
            reader.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

三、测试

    public static void main(String[] args) throws Exception {
        FileInputStream fileInputStream = new FileInputStream("C:\\Users\\lcry\\Downloads\\2021sj.pdf");
        addWaterMark("保密资料", IOUtils.toByteArray(fileInputStream), Files.newOutputStream(Paths.get("C:\\Users\\lcry\\Downloads\\2021sj-mark.pdf")));
    }

效果预览

未加水印效果:

Java一个工具类实现PDF加水印

加水印后效果:

Java一个工具类实现PDF加水印

参考文章

java实现给PDF文件添加图片水印,java实现给PDF文件添加文字水印

java pdf添加文字水印(非常专业)

给pdf加水印的方法

Java项目使用itextpdf给pdf文件添加水印

文章目录