ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java实现PDF文件添加水印

2022-06-06 15:31:57  阅读:249  来源: 互联网

标签:Java stream color 水印 import apache PDF pdfbox


引入

近期项目中需要实现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);

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

            // 加载水印字体
            PDFont font = PDType0Font.load(document, new FileInputStream("D://pdf//汉仪花木兰 W.ttf"), 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);
    }


}

效果图如下:

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

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

标签:Java,stream,color,水印,import,apache,PDF,pdfbox
来源: https://www.cnblogs.com/hzauxx/p/16348339.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有