添加和删除 PDF 文档中的水印在文档管理、版权保护、信息安全等领域扮演着重要角色。水印可以是一种视觉标记,如公司 Logo、版权信息或“机密”字样,用于表明文档的来源、状态或所有权。添加水印可以增强文档的版权保护,防止未经授权的复制和分发。同时,在某些情况下,如当文档被合法购买或授权使用后,可能需要删除水印以提供更清晰的阅读体验或进一步的编辑权限。本文将介绍如何使用 Spire.PDF for Java 在 Java 项目中添加和移除 PDF 文档中的水印。
安装 Spire.PDF for Java
首先,您需要在 Java 程序中添加 Spire.Pdf.jar 文件作为依赖项。JAR 文件可以从此链接下载。如果您使用 Maven,则可以将以下代码添加到项目的 pom.xml 文件中,从而在应用程序中导入 JAR 文件。
<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.pdf</artifactId>
        <version>11.10.3</version>
    </dependency>
</dependencies>
Java 在 PDF 文档中添加水印
Spire.PDF 提供了一个通过 PdfWatermarkAnnotation 对象向 PDF 页面添加水印的方法。值得注意的是,采用此方法添加的水印,日后可以被轻易地移除。以下是主要的关键步骤:
- 初始化一个 PdfDocument 实例。
 - 使用 PdfDocument.loadFromFile() 方法加载一个 PDF 文档。
 - 创建一个 PdfTrueTypeFont 字体对象,用户绘制水印文本。
 - 创建一个 Rectangle2D 类型对象,用于定义页面的边界。
 - 使用 for 循环迭代 PDF 文档中的所有的 PdfPageBase 页面对象。
 - 创建一个 PdfTemplate 对象用于绘制水印,设置其尺寸与当前页面相同。
 - 调用自定义的 insertWatermark() 方法,在 PdfTemplate 对象上绘制水印内容。
 - 创建一个 PdfWatermarkAnnotation 对象,并定义水印放置的位置。
 - 创建一个 PdfAppearance 对象,用于配置水印的视觉效果。
 - 使用 PdfAppearance.setNormal(PdfTemplate) 方法将 PdfTemplate 对象关联到 PdfAppearance 对象。
 - 使用 PdfWatermarkAnnotation.setAppearance(PdfAppearance) 方法将 PdfAppearance 对象关联到 PdfWatermarkAnnotation 对象。
 - 通过 PdfPageBase.getAnnotationsWidget().add(PdfWatermarkAnnotation) 方法将水印注释添加到页面中。
 - 使用 PdfDocument.saveToFile() 方法保存到文件中。
 
- Java
 
import com.spire.pdf.*;
import com.spire.pdf.annotations.*;
import com.spire.pdf.annotations.appearance.*;
import com.spire.pdf.graphics.*;
import java.awt.*;
import java.awt.geom.*;
public class AddWatermarkInPDF {
    public static void main(String[] args) {
        // 创建PdfDocument对象
        PdfDocument pdfDocument = new PdfDocument();
        // 从文件加载PDF文档
        pdfDocument.loadFromFile("示例.pdf");
        // 设置字体样式,这里选择"微软雅黑",字号为22
        Font font = new Font("微软雅黑", java.awt.Font.PLAIN, 22);
        // 创建PdfTrueTypeFont对象用于后续的文本渲染
        PdfTrueTypeFont trueTypeFont = new PdfTrueTypeFont(font);
        // 获取页面对象
        PdfPageBase page;
        // 定义水印文本
        String watermarkAnnotationText = "ID_0";
        // 创建尺寸对象
        Dimension2D dimension2D = new Dimension();
        // 创建矩形对象
        Rectangle2D loRect = new Rectangle2D.Float();
        // 遍历PDF中的每一页
        for (int i = 0; i < pdfDocument.getPages().getCount(); i++) {
            // 获取当前页
            page = pdfDocument.getPages().get(i);
            // 设置尺寸对象大小为当前页的大小
            dimension2D.setSize(page.getClientSize().getWidth(), page.getClientSize().getHeight());
            // 设置矩形对象框架,即整个页面的范围
            loRect.setFrame(new Point2D.Float(0, 0), dimension2D);
            // 创建PdfTemplate对象,用于绘制水印
            PdfTemplate template = new PdfTemplate(page.getClientSize().getWidth(),page.getClientSize().getHeight());
            // 插入水印
            insertWatermark(template,trueTypeFont,"禁止修改");
            // 创建PdfWatermarkAnnotation对象,定义水印位置
            PdfWatermarkAnnotation watermarkAnnotation=new PdfWatermarkAnnotation(loRect);
            // 创建PdfAppearance对象,设置水印外观
            PdfAppearance appearance=new PdfAppearance(watermarkAnnotation);
            // 设置水印的正常状态模板
            appearance.setNormal(template);
            // 将外观设置到水印对象中
            watermarkAnnotation.setAppearance(appearance);
            // 设置水印文本
            watermarkAnnotation.setText(watermarkAnnotationText);
            // 设置水印打印矩阵,用于控制水印的位置和大小
            watermarkAnnotation.getFixedPrint().setMatrix(new float[]{1,0,0,1,0,0});
            // 设置水平偏移量
            watermarkAnnotation.getFixedPrint().setHorizontalTranslation(0.5f);
            // 设置垂直偏移量
            watermarkAnnotation.getFixedPrint().setVerticalTranslation(0.5f);
            // 将水印添加到页面的注释小部件中
            page.getAnnotationsWidget().add(watermarkAnnotation);
        }
        // 保存PDF文档至文件
        pdfDocument.saveToFile("添加水印.pdf");
        // 关闭并释放PDF文档资源
        pdfDocument.dispose();
    }
    // 定义一个静态方法用于向PDF模板中插入水印
    static void insertWatermark(PdfTemplate template, PdfTrueTypeFont font, String watermark) {
        // 创建一个Dimension2D对象,用于设置水印刷子的大小
        Dimension2D dimension2D = new Dimension();
        // 设置水印刷子的大小为模板宽度和高度的一半和三分之一
        dimension2D.setSize(template.getWidth() / 2, template.getHeight() / 3);
        // 创建一个PdfTilingBrush对象,用于重复填充水印图案
        PdfTilingBrush brush = new PdfTilingBrush(dimension2D);
        // 设置水印的透明度为0.3
        brush.getGraphics().setTransparency(0.3F);
        // 开始一组图形状态保存
        brush.getGraphics().save();
        // 平移图形上下文,使其中心与水印刷子的中心对齐
        brush.getGraphics().translateTransform((float) brush.getSize().getWidth() / 2, (float) brush.getSize().getHeight() / 2);
        // 旋转图形上下文,使水印倾斜45度
        brush.getGraphics().rotateTransform(-45);
        // 在图形上下文中绘制水印文字,使用指定的字体、颜色和居中对齐方式
        brush.getGraphics().drawString(watermark, font, PdfBrushes.getViolet(), 0, 0, new PdfStringFormat(PdfTextAlignment.Center));
        // 结束一组图形状态保存并恢复
        brush.getGraphics().restore();
        // 重置水印透明度为1,即完全不透明
        brush.getGraphics().setTransparency(1);
        // 创建一个Rectangle2D对象,用于定义水印的填充区域
        Rectangle2D loRect = new Rectangle2D.Float();
        // 设置水印的填充区域为整个模板的大小
        loRect.setFrame(new Point2D.Float(0, 0), template.getSize());
        // 使用水印刷子在模板上绘制水印
        template.getGraphics().drawRectangle(brush, loRect);
    }
}

Java 从 PDF 文档中移除水印
Spire.PDF 可以移除通过 PdfWatermarkAnnotation 对象向 PDF 页面添加的水印。以下是详细的步骤:
- 初始化一个 PdfDocument 实例。
 - 使用 PdfDocument.loadFromFile() 方法加载一个 PDF 文档。
 - 通过 for 循环迭代 PDF 文档中的每一个 PdfPageBase 页面对象。
 - 使用 PdfPageBase.getAnnotationsWidget() 方法获取当前页面的所有注释。
 - 再次使用 for 循环遍历当前页面的每一个注释对象, 筛选出 PdfWatermarkAnnotationWidget 类型的注释。
 - 通过 PdfWatermarkAnnotationWidget.getText() 方法来判断出目标水印注释并执行删除操作。
 - 使用 PdfDocument.saveToFile() 方法保存到文件中。
 
- Java
 
import com.spire.pdf.*;
import com.spire.pdf.annotations.*;
public class RemoveWatermarkFromPDF {
    public static void main(String[] args) {
        // 创建PdfDocument对象
        PdfDocument pdfDocument = new PdfDocument();
        // 从文件加载PDF文档
        pdfDocument.loadFromFile("水印.pdf");
        // 定义一个字符串id,用于匹配和删除特定的水印
        String id = "ID_0";
        // 遍历PDF文档中的每一页
        for (int i = 0; i < pdfDocument.getPages().getCount(); i++) {
            // 获取当前页面的所有注释
            PdfAnnotationCollection annotationWidget = pdfDocument.getPages().get(i).getAnnotationsWidget();
            // 遍历当前页面的所有注释
            for (int j = 0; j < annotationWidget.getCount(); j++) {
                // 检查当前注释是否为水印注释
                if (annotationWidget.get(j) instanceof PdfWatermarkAnnotationWidget) {
                    // 如果水印文本与id相等,则删除该水印
                    if (annotationWidget.get(j).getText().equals(id)) {
                        annotationWidget.remove(annotationWidget.get(j));
                    }
                }
            }
        }
        // 将修改后的PDF文档保存到新文件
        pdfDocument.saveToFile("移除水印.pdf");
        // 释放PdfDocument对象资源
        pdfDocument.dispose();
    }
}

申请临时 License
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。
    


					



