Java pdf 添加水印

655 阅读1分钟
<dependency>
   <groupId>org.apache.pdfbox</groupId>
   <artifactId>pdfbox</artifactId>
   <version>2.0.12</version>
</dependency>
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;

import java.awt.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URL;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: ks
 * @Date: 2022/08/19/9:28
 * @Description:
 */
public class PdfUtil {

    private static Logger log = LoggerFactory.getLogger(PdfUtil.class);

    // 水印字体大小
    private static  float fontSize=13;

    // 字体颜色{r,g,b}
    private static   int[] color={0,200,0};

    // 行间距,大中小分别对应150/100/50
    private static   int rowSpace=150;

    // 列间距,大中小分别对应150/100/50
    private static   int colSpace=150;

    public static void main(String[] args) {
        String readPdfUrl ="C:\Users\Administrator\Desktop\a.pdf";
        String outPdfUrl ="C:\Users\Administrator\Desktop\b.pdf";
        String waterMark="2022-08-19 孔繁浩";
        try{
            PdfUtil util = new PdfUtil();
            String url = util.pdfWaterMark(readPdfUrl, outPdfUrl, waterMark);
            System.err.println(url);
        }catch (Exception e){
            log.debug("为PDF文件添加水印失败:{}",e);
        }


    }

    /**
     * pdf  文字水印
     * @param readPdfUrl 读取路径
     * @param outPdfUrl  输出路径
     * @param waterMark  水印
     * @return
     * @throws Exception
     */
    public String pdfWaterMark(String readPdfUrl,String outPdfUrl,String waterMark) throws Exception{
        File file = new File(readPdfUrl);
        PDDocument document = PDDocument.load(file);
        document.setAllSecurityToBeRemoved(true);

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

            ClassPathResource resource = new ClassPathResource("/fonts/pdf.ttf");
            InputStream inputStream = resource.getInputStream();
            // 加载水印字体
            PDFont font = PDType0Font.load(document, inputStream, 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.setStrokingColor(Color.lightGray);
            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(outPdfUrl);
        return  outPdfUrl;
    }

}