添加和删除 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>10.10.7</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 天的临时许可证。