java 给 pdf文件添加水印 | Itext7 | 文字水印 | 图片水印 | 多重水印

本文档展示了如何使用Java的iText7库在PDF上添加文字和图片水印。通过引入必要的maven依赖,创建测试类并定义事件处理器,实现了在PDF的每一页上动态添加水印的功能。水印可以设置透明度、位置、角度,并支持自定义字体和图片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java | Itext7 水印 | 文字水印 | 图片水印


本地开发环境:jdk1.8
效果图:
在这里插入这是带水印图片描述

maven依赖:

  <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>io</artifactId>
            <version>7.0.0</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>layout</artifactId>
            <version>7.0.0</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>pdfa</artifactId>
            <version>7.0.0</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>pdftest</artifactId>
            <version>7.0.0</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>forms</artifactId>
            <version>7.0.0</version>
            <scope>compile</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.itextpdf/font-asian -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>font-asian</artifactId>
            <version>7.0.0</version>
            <scope>test</scope>
        </dependency>

测试类:

    @org.junit.Test
    public void  pdfWaterMark() throws Exception {
        PdfUtils.setWaterMark("D:/鲁迅-水印.pdf","D:/鲁迅.pdf");
        // 删除旧文件,在同样的路径下 把新文件名改成旧文件名
        //File file = new File("D:/鲁迅.pdf");
        //if (file.delete()){
        //    file=new File("D:/鲁迅-水印.pdf");
        //    file.renameTo(new File("D:/鲁迅.pdf"));
        //}
    }
import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.color.Color;
import com.itextpdf.kernel.events.Event;
import com.itextpdf.kernel.events.IEventHandler;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.extgstate.PdfExtGState;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.VerticalAlignment;
import org.springframework.util.ResourceUtils;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;

  public static void setWaterMark(String newFileName, String readFileName) throws Exception {
        FileOutputStream outputStream = new FileOutputStream(new File(newFileName));
        PdfWriter pdfWriter = new PdfWriter(outputStream);
        PdfDocument outDocument = new PdfDocument(pdfWriter);

        PdfReader pdfReader = new PdfReader(readFileName);
        PdfDocument redDocument = new PdfDocument(pdfReader);
        //文字水印
        WaterMarkText waterMark = new WaterMarkText();

        //图片水印
        //WaterMarkImage waterMark = new WaterMarkImage();
        outDocument.addEventHandler(PdfDocumentEvent.INSERT_PAGE, waterMark);

        int total = redDocument.getNumberOfPages() + 1;
        for (int i = 1; i < total; i++) {
            PdfPage page = redDocument.getPage(i);
            //复制每页内容添加到新的文件中
            outDocument.addPage(page.copyTo(outDocument));
        }

        outDocument.close();
        redDocument.close();
        pdfReader.close();
    }

文字水印:

 protected static class WaterMarkText implements IEventHandler {
        @Override
        public void handleEvent(Event event) {
            PdfDocumentEvent documentEvent = (PdfDocumentEvent) event;
            PdfDocument document = documentEvent.getDocument();
            PdfPage page = documentEvent.getPage();
            Rectangle pageSize = page.getPageSize();

            PdfFont pdfFont = null;
            try {
                // Constants.PDF_FONT 自定义字体  PDF_FONT = "classpath:pdf/MSYH.TTF"
                pdfFont = PdfFontFactory.createFont(ResourceUtils.getFile(Constants.PDF_FONT).getPath(), PdfEncodings.IDENTITY_H, true);
            } catch (IOException e) {
                e.printStackTrace();
            }

            // 透明度
            PdfExtGState gs = new PdfExtGState();
            gs.setFillOpacity(0.5f);
            PdfCanvas canvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), document);
            canvas.setExtGState(gs);

            // 两个for循环 是多个水印 去掉之后就只有一个水印
            for (int i = 0; i < 10; i++) {     // i 从左往右 平铺水印
                for (int j = 0; j < 10; j++) { // j 从下往上 平铺水印
                    new Canvas(canvas, document, pageSize)
                            .setFontColor(Color.LIGHT_GRAY)   //颜色
                            .setFontSize(15)                //字体大小
                            .setFont(pdfFont)               //字体的格式   即导入的字体包
                            //水印的内容(中英文都支持)    坐标(例如:250f, 250f)  当前页数     最后的值为倾斜度(19.5f)
                            .showTextAligned(new Paragraph("广信玖逸"), (50.5f + i * 100f), (40.0f + j * 100f), document.getPageNumber(page),
                                    TextAlignment.CENTER, VerticalAlignment.MIDDLE, 19.5f
                            );
                }
            }
        }
    }

图片水印:

    protected static class WaterMarkImage implements IEventHandler {
        @Override
        public void handleEvent(Event event) {
            PdfDocumentEvent documentEvent = (PdfDocumentEvent) event;
            PdfDocument document = documentEvent.getDocument();
            PdfPage page = documentEvent.getPage();
            Rectangle pageSize = page.getPageSize();

            ImageData imageData = null;
            try 
                imageData = ImageDataFactory.create(ResourceUtils.getFile("classpath:pdf/WaterMark.png").getPath());
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            // 两个for循环 是多个水印 去掉之后就只有一个水印
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    Image image = new Image(imageData);

                    // 水印位置
                    image.setFixedPosition((50.5f + i * 150f), (40.0f + j * 250f));
                    // 水印倾斜度
                    image.setRotationAngle(170.5f);

                    //  setFillOpacity 透明度
                    PdfExtGState gs = new PdfExtGState();
                    gs.setFillOpacity(0.1f);
                    PdfCanvas canvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), document);
                    canvas.setExtGState(gs);

                    new Canvas(canvas, document, pageSize)
                            .add(image);
                }
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值