Java实现PDF文件添加水印

引入

近期项目中需要实现PDF文件添加水印的功能,在此记录下实现过程。

主要使用pdfbox实现该功能。

项目环境:

  • JDK>=1.8

  • maven

  • IDE:IDEA

  • pdfbox:2.0.25

        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox-app</artifactId>
            <version>2.0.25</version>
        </dependency>

正文

为文件添加水印,水印字体需要指定并加载到程序,以下程序中使用到的水印字体是我从网上随意找的一个免费字体。

此处将文件及字体文件均放在D:\\pdf路径下。

程序如下:

package waterMark;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
import org.apache.pdfbox.util.Matrix;

import java.io.File;
import java.io.FileInputStream;

/**
 * @author :czc
 * @date :Created in 2022/6/6
 * @description :为PDF文件添加水印
 */

public class WaterMarkUtil {

    public static void main(String[] args) {
        File file=new File("D:\\pdf\\测试文档.pdf");
        String waterMark="测试水印";
        float fontSize=13;
        int[] color={0,200,0};
        int rowSize=150;
        int colSpace=150;
        try{
            pdfWaterMark(file,waterMark,fontSize,color,rowSize,colSpace);
        }catch (Exception e){
            System.out.println("为PDF文件添加水印失败:"+e);
        }


    }

    /**
     * @Author czc
     * @Description 为pdf文件添加水印
     * @Date 2022/6/6
     * @Param [tempFile, waterMark, fontSize, color, rowSpace, colSpace]
     * tempFile     需要添加水印的文件
     * watermark    水印文字
     * fontSize     水印字体大小
     * color        字体颜色{r,g,b}
     * rowSpace     行间距,大中小分别对应150/100/50
     * colSpace     列间距,大中小分别对应150/100/50
     * @return void
     **/

    public static void pdfWaterMark(File tempFile,String waterMark,float fontSize,int[] color,int rowSpace,int colSpace) throws Exception{
        PDDocument document = PDDocument.load(tempFile);
        document.setAllSecurityToBeRemoved(true);
        // 加载水印字体
        PDFont font = PDType0Font.load(document, new FileInputStream("D://pdf//汉仪花木兰 W.ttf"), true);

        // 遍历PDF文件,在每一页加上水印
        for (PDPage page : document.getPages()) {
            PDPageContentStream stream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true);

            

            PDExtendedGraphicsState r = new PDExtendedGraphicsState();

            // 设置透明度
            r.setNonStrokingAlphaConstant(0.2f);
            r.setAlphaSourceFlag(true);
            stream.setGraphicsStateParameters(r);

            // 设置水印字体颜色
            if (color.length == 3) {
                stream.setNonStrokingColor(color[0], color[1], color[2]);
            }
            stream.beginText();
            stream.setFont(font, fontSize);
            stream.newLineAtOffset(0, -15);

            // 获取PDF页面大小
            float pageHeight = page.getMediaBox().getHeight();
            float pageWidth = page.getMediaBox().getWidth();

            // 根据纸张大小添加水印,30度倾斜
            for (int h = 10; h < pageHeight; h = h + rowSpace) {
                for (int w = - 10; w < pageWidth; w = w + colSpace) {
                    stream.setTextMatrix(Matrix.getRotateInstance(0.3, w, h));
                    stream.showText(waterMark);
                }
            }

            // 结束渲染,关闭流
            stream.endText();
            stream.restoreGraphicsState();
            stream.close();
        }
        document.save(tempFile);
        document.close();
    }


}

效果图如下:

image

以上测试文件及字体如有需要,以下百度网盘链接自取:

链接:https://pan.baidu.com/s/1vIviqmsQ7Tq9CL33NUapLQ
提取码:0318

本篇文章参考了以下博客,谨以此表示感谢:

  1. Java针对不同文件加水印,https://blog.csdn.net/jllion/article/details/123394328
  2. 利用PDFBOX给PDF文件添加水印,https://blog.csdn.net/Alan_1024/article/details/118524084

吾生也有涯,而知也无涯。

posted @ 2022-06-06 15:23  V少年如他  阅读(4563)  评论(0编辑  收藏  举报