java對PDF文件添加水印(文本水印、圖片水印)

java對PDF文件添加水印(文本水印、圖片水印)

添加 pom 依賴

		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>itextpdf</artifactId>
			<version>5.5.13</version>
		</dependency>

文本水印

 	public static String addTxtWaterMaker(String inputFile, String outputFile, String waterMarkName){
        logger.debug("==========addTxtWaterMaker==========start");
        try {
            PdfReader reader = new PdfReader(inputFile);
            PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputFile));
            // 使用系統字體
            BaseFont base = BaseFont.createFont("STSong-Light","UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            Rectangle pageRect;
            PdfGState gs = new PdfGState();
            //設置文字透明度
            gs.setFillOpacity(0.6f);
            gs.setStrokeOpacity(0.6f);
            //獲取pdf總頁數
            int total = reader.getNumberOfPages() + 1;
            JLabel label = new JLabel();
            FontMetrics metrics;
            int textH;
            int textW;
            label.setText(waterMarkName);
            metrics = label.getFontMetrics(label.getFont());
            //得到文字的寬高
            textH = metrics.getHeight();
            textW = metrics.stringWidth(label.getText());
            PdfContentByte under;
            for (int i = 1; i < total; i++) {
                pageRect = reader.getPageSizeWithRotation(i);
                //得到一個覆蓋在上層的水印文字
                under = stamper.getOverContent(i);
                under.saveState();
                under.setGState(gs);
                under.beginText();
                //設置水印文字顏色
                under.setColorFill(BaseColor.LIGHT_GRAY);
                //設置水印文字和大小
                under.setFontAndSize(base, 12);
                //這個position主要是爲了在換行加水印時能往右偏移起始座標
                int position = 0;
                int interval = -3;
                for (int height = interval + textH; height < pageRect.getHeight(); height = height + textH * 3) {
                    for (int width = interval + textW -position * 150; width < pageRect.getWidth() + textW; width = width + textW) {
                        //添加水印文字,水印文字成25度角傾斜
                        under.showTextAligned(Element.ALIGN_LEFT, waterMarkName, width - textW , height - textH, 25);
                    }
                    position++;
                }
                // 添加水印文字
                under.endText();
            }
            //關閉流
            stamper.close();
            reader.close();
            logger.debug("==========addTxtWaterMaker==========end");
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("文件{}增加水印異常:{}",inputFile,e.getMessage());
            return inputFile;
        }
        return outputFile;
    }

圖片水印

	public static String addImgWaterMaker(String inputFile, String outputFile, String imgFilePath) {
        logger.debug("==========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 num = reader.getNumberOfPages();
            PdfContentByte under;
            for (int i = 1; i <= num; i++) {
                PdfContentByte pdfContentByte = stamper.getOverContent(i);
                // 獲得PDF最頂層
                under = stamper.getOverContent(i);
                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();
            logger.debug("==========addImgWaterMaker==========end");
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("文件{}增加水印異常:{}",inputFile,e.getMessage());
            return inputFile;
        }
        return outputFile;
    }

Main 測試

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Element;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.swing.*;
import java.awt.*;
import java.io.FileOutputStream;

/**
 * @Describe: PDF文件加水印工具
 * @Author: zml
 * @Date: 2020-5-19 09:08:40
 */
public class PDFWaterUtils {

    private static Logger logger = LoggerFactory.getLogger(PDFWaterUtils.class);

    public static void main(String[] args) {
        String inputFile = "D:\\liang\\office加水印\\水印測試-前.pdf";
        // 文字水印
//        String outputFile = "D:\\liang\\office加水印\\水印測試-後-文字.pdf";
//        String waterMarkName = "成長的小亮亮";
//        addTxtWaterMaker(inputFile, outputFile, waterMarkName);

        // 圖片水印
        String outputFile = "D:\\liang\\office加水印\\水印測試-後-圖片.pdf";
        String imgFilePath = "D:\\liang\\office加水印\\圖片1.png";
        addImgWaterMaker(inputFile, outputFile, imgFilePath);
    }
}

示例
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章