给PDF添加水印工具类(JAVA实现)

文章目录

前言

近期有个简单的需求要求给客户上传PDF文件添加水印后保存。下面是将关键代码提取后提供的公共方法。

代码

package com.watermarker.study;

import java.awt.*;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.swing.*;

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;

/**
 * @author bozinan
 */
public class WarterMarkerUtil {
    
    
    /**
     *
     * @param inputFile 原文件
     * @param outputFile 加水印后的文件
     * @param waterMarkName 水印字符
     */
public static void addWaterMark(String inputFile, String outputFile,String waterMarkName) {
    
    
        PdfReader reader = null;
        PdfStamper stamper = null;
        try {
    
    
            reader = new PdfReader(inputFile);
            stamper = new PdfStamper(reader, new FileOutputStream(outputFile));

            //这里字体,记得要放在服务器上对应文件夹下
            BaseFont base = BaseFont.createFont("src/main/webapp/ttf/arial.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            Rectangle pageRect = null;
            PdfGState gs = new PdfGState();
            //填充不透明度  为1完全不透明
            gs.setFillOpacity(0.1f);
            //笔画不透明度, 为1完全不透明
            gs.setStrokeOpacity(0.1f);
            int total = reader.getNumberOfPages() + 1;

            JLabel label = new JLabel();
            FontMetrics metrics;
            int textH = 0;
            int textW = 0;
            label.setText(waterMarkName);
            metrics = label.getFontMetrics(label.getFont());
            textH = metrics.getHeight();
            textW = metrics.stringWidth(label.getText());

            PdfContentByte under;
            int interval = 0;
            for (int i = 1; i < total; i++) {
    
    
                pageRect = reader.getPageSizeWithRotation(i);
                //在字体下方加水印
                under = stamper.getOverContent(i);
                under.beginText();
                under.saveState();
                under.setGState(gs);

                //这里修改水印字体大小
                under.setFontAndSize(base, 36);
                //这里设置字体上下间隔
                for (int height = interval + textH; height < pageRect
                        .getHeight(); height = height + textH * 9) {
    
    
                    //这里设置字体左右间隔
                    for (int width = interval + textW; width < pageRect
                            .getWidth() + textW; width = width + textW * 4) {
    
    
                        //这里设置倾斜角度
                        under.showTextAligned(Element.ALIGN_LEFT,
                                waterMarkName, width - textW, height - textH,
                                45);
                    }
                }
                under.endText();
            }
            stamper.close();
            reader.close();
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            try {
    
    
                if (stamper != null) {
    
    
                    stamper.close();
                }
            } catch (DocumentException e) {
    
    
                e.printStackTrace();
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
            if (reader != null) {
    
    
                reader.close();
            }

        }
    }
}

测试

public class test {
    
    
    public static void main(String[] args) {
    
    
        WarterMarkerUtil.addWaterMark("C:\\Users\\m1347\\Downloads\\ElasticSearch.pdf",
                "C:\\Users\\m1347\\Downloads\\ElasticSearchWithWaterMarker.pdf",
                "TEST");
    }
}

单元测试
测试结果

后记

如果本文有帮助到你,记得点赞收藏!!!

猜你喜欢

转载自blog.csdn.net/qq_34577234/article/details/125278309