3分钟实现pdf文件添加文字水印及图片水印

1,620 阅读2分钟

刚刚工位边上的产品同学,说为了给PPT方案文档添加水印,网上找了,都需要冲会员,WPS添加水印也需要VIP会员,问我能快速添加个图片水印吗? 我呵呵了,肯定没毛病。。。三分钟给弄好了。

废话不多说,先展示下结果如下:

1、原pdf文件:

水印2.png

2、添加水印pdf文件:

水印1.png

slog:人是会骗人的,代码不会骗人。

上代码:

项目mvn引入jar包依赖: 就下面这2个货

<!-- 对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.BaseColor;
import com.itextpdf.text.Element;
import com.itextpdf.text.Image;
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;

import java.io.FileOutputStream;

/**
 * @author houxiurong
 * @date 2022/4/8
 */
public class PdfWaterPaperTest {

    /**
     * 给pdf文档添加文本水印
     */
    public static void addWaterMark(String pdfFilePath, String outputFilePath) {
        try {
            // 原PDF文件
            PdfReader reader = new PdfReader(pdfFilePath);
            // 输出的PDF文件内容
            PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputFilePath));

            // 字体 来源于 itext-asian JAR包
            BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", true);
            PdfGState gs = new PdfGState();
            // 设置透明度
            gs.setFillOpacity(0.3f);
            gs.setStrokeOpacity(0.4f);

            int totalPage = reader.getNumberOfPages() + 1;

            //文本水印
            for (int pageNum = 1; pageNum < totalPage; pageNum++) {
                // 内容上层
                PdfContentByte content = stamper.getOverContent(pageNum);
                // 内容下层
                //PdfContentByte content = stamper.getUnderContent(pageNum);
                content.beginText();
                // 字体添加透明度
                content.setGState(gs);
                // 添加字体大小等
                content.setFontAndSize(baseFont, 50);
                // 添加范围
                content.setTextMatrix(70, 200);
                // 具体位置 内容 旋转多少度 共360度
                content.showTextAligned(Element.ALIGN_CENTER, "houxiurong.com", 300, 350, 300);
                content.showTextAligned(Element.ALIGN_TOP, "houxiurong.com", 100, 100, 5);
                content.showTextAligned(Element.ALIGN_BOTTOM, "houxiurong.com", 400, 400, 75);
                content.endText();
            }
            // 关闭
            stamper.close();
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(e);
        }
    }

    /**
     * 图片水印
     * @param inputFile
     * @param outputFile
     * @param imgFilePath
     * @return
     */
    public static String addImgWaterMaker(String inputFile, String outputFile, String imgFilePath) {
        System.out.println("==========addImgWaterMaker==========start");
        try {
            PdfReader reader = new PdfReader(inputFile);
            PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputFile));
            PdfGState gs1 = new PdfGState();
            // 设置透明度
            gs1.setFillOpacity(0.7f);
            Image image = Image.getInstance(imgFilePath);
            // 获取PDF页数
            int numberOfPages = reader.getNumberOfPages();
            PdfContentByte under;
            for (int page = 1; page <= numberOfPages; page++) {
                PdfContentByte pdfContentByte = stamper.getOverContent(page);
                // 获得PDF最顶层
                under = stamper.getOverContent(page);
                pdfContentByte.setGState(gs1);
                // 行
                for (int y = 0; y < 10; y++) {
                    // 列
                    for (int x = 0; x < 8; x++) {
                        // 设置旋转角度
                        image.setRotationDegrees(30);// 旋转 角度
                        // 设置等比缩放
                        under.setColorFill(BaseColor.GRAY);
                        image.scaleToFit(80, 120);
                        image.setRotation(30);
                        image.setAbsolutePosition(60 + 140 * x, 110 * y);
                        pdfContentByte.addImage(image);
                    }
                }
            }
            stamper.close();
            reader.close();
            System.out.println("==========addImgWaterMaker==========end");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("文件增加水印异常:" + inputFile);
            return inputFile;
        }
        return outputFile;
    }

    //文件路径根据Mac文件,windos使用windos路径
    public static void main(String[] args) {
        System.out.println("==水印添加开始处理==");
        addWaterMark("/Users/.../Downloads/go-fastdfs文件系统部署.pdf", "/Users/houxiurong/Downloads/go-fastdfs文件系统部署water.pdf");
        System.out.println("==水印添加处理结束==");

        System.out.println("==图片水印添加开始处理==");
        addImgWaterMaker("/Users/.../Downloads/go-fastdfs文件系统部署water.pdf", "/Users/houxiurong/Downloads/go-fastdfs文件系统部署png.pdf", "/Users/houxiurong/Downloads/nacos-full.png");
        System.out.println("==图片水印添加处理结束==");
    }

}
3、总结

对于一般的小功能,小任务能很好的表现及展示自己的动手能力!!!