如何在Java中应用自定义水印到PDF

This article was translated from English: Does it need improvement?
Translated
View the article in English

IronPDF使Java开发人员能够使用具有完整CSS支持的HTML字符串将自定义水印应用于PDF文档,允许完全控制文本、图像、不透明度、旋转和定位,以进行品牌或安全目的。

快速入门:在 Java 中为 PDF 添加水印

  1. 将IronPDF添加到您的Maven或Gradle项目中并设置您的许可证密钥
  2. 使用 PdfDocument.fromFile() 加载您的 PDF 文档
  3. 为您的水印创建一个HTML字符串(文本、图像或两者)
  4. 使用 pdf.applyWatermark(watermarkHtml) 添加水印
  5. 保存带有水印的 PDF 文件 pdf.saveAs()

```java :title=QuickStartWatermark.java //:path=/static-assets/pdf/content-code-examples/how-to/custom-watermark/quickstart.java PdfDocument pdf = PdfDocument.fromFile(Paths.get("sample.pdf")); pdf.applyWatermark(""); pdf.saveAs("watermarked.pdf");


水印可以保护PDF文档并传达所有权或文档状态。 常见的使用场景包括将草稿标记为"保密",在每页上嵌入公司徽标,或表明文件正在等待批准。 IronPDF采用HTML和CSS的方法,这意味着您在浏览器中可以表达的任何样式(自定义字体、不透明度、旋转、绝对定位)在水印中同样有效。

本指南涵盖 `text` 水印、`image` 水印、不透明度和位置控制,以及使用 [`TextStamper`](https://ironpdf.com/java/how-to/stamp-text-image-pdf/) 和 [`ImageStamper`](https://ironpdf.com/java/how-to/stamp-text-image-pdf/) 进行的高级加盖操作。 有关相关的PDF操作技术,请参阅[从HTML创建PDF](https://ironpdf.com/java/how-to/java-create-pdf-tutorial/)指南或有关[添加背景和前景](https://ironpdf.com/java/how-to/background-foreground/)的概述。

<div class="hsg-featured-snippet">
    <h3>如何在 Java 中应用水印</h3>
     <ol>
        <li><a class="js-modal-open" data-modal-id="download-modal" href="#download-modal">下载将水印应用到 PDF 的 Java 库</a>。</li>
        <li>渲染一个新 PDF 或加载一个已有的</li>
        <li>配置要用作水印的 HTML 字符串或图像</li>
        <li>使用适当的方法应用水印</li>
        <li>根据需要调整不透明度、旋转和位置参数</li>
    </ol>
</div>

## 如何在 PDF 上应用文本水印?

使用 `applyWatermark` 方法将文本水印添加到 PDF 文档的每一页。 该方法接受HTML字符串,因此您可以使用任何CSS属性来设置水印的样式:字体系列、大小、颜色、字符间距或文本阴影。 下面的示例将文档标记为红色的"保密",涵盖最常见的审计跟踪和访问控制场景。

```java
//:path=/static-assets/pdf/content-code-examples/how-to/custom-watermark/text-watermark.java
import java.io.IOException;
import java.nio.file.Paths;

import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;

public class Main {
    public static void main(String[] args) throws IOException {
        // Set the license key for IronPDF
        License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");

        // Load an existing PDF document from file
        PdfDocument pdf = PdfDocument.fromFile(Paths.get("sample.pdf"));

        // HTML string defines the watermark appearance via CSS
        String watermarkHtml = "<h1 style='color:red;'>Confidential</h1>";

        // Apply the watermark to every page
        pdf.applyWatermark(watermarkHtml);

        // Save the watermarked PDF to a new file
        pdf.saveAs("text_watermark.pdf");
    }
}

applyWatermark 调用可通过单次操作将水印添加到所有页面。 默认情况下,水印以50%不透明度呈现,并在每页上居中。 要激活库的所有功能,请在任何PDF操作之前配置您的IronPDF许可证密钥。 传递给 applyWatermark 的 HTML 支持任何有效的 HTML 元素,因此您可以包含 <span> 或带样式的 <p> 标签来实现多行水印。

文本水印看起来像什么?

输出文件 text_watermark.pdf 显示"Confidential"一词以红色呈现,并在每页的水平和垂直方向居中。 50%的默认不透明度使文档内容在水印下仍然可读。 对于多页文档,每页接收相同的印记,无需逐页循环。

提示对于复杂的文本格式设置(如对角线多行水印),您可以在单个 HTML 字符串中组合多个 CSS 变换:transform: rotate(-45deg) scale(1.5)

对于更深层次的HTML渲染技术,适用于水印,请参见HTML到PDF转换教程


如何为PDF添加图像水印?

图像水印通过相同的方法实现,即在 HTML 字符串中包裹 <img> 标签。 具有透明背景的PNG文件是徽标水印的理想选择,因为当图像合成到PDF页面上时,透明度得以保留。 JPEG、GIF、SVG和BMP格式也支持。

//:path=/static-assets/pdf/content-code-examples/how-to/custom-watermark/image-watermark.java
import java.io.IOException;
import java.nio.file.Paths;

import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;

public class Main {
    public static void main(String[] args) throws IOException {
        // Set the license key for IronPDF
        License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");

        // Load an existing PDF document from file
        PdfDocument pdf = PdfDocument.fromFile(Paths.get("sample.pdf"));

        // Reference the image file path relative to the runtime working directory
        String watermarkHtml = "<img src='logo.png' style='width:100px;'/>";

        // Apply the image watermark to all pages
        pdf.applyWatermark(watermarkHtml);

        // Save the result
        pdf.saveAs("image_watermark.pdf");
    }
}
//:path=/static-assets/pdf/content-code-examples/how-to/custom-watermark/image-watermark.java
import java.io.IOException;
import java.nio.file.Paths;

import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;

public class Main {
    public static void main(String[] args) throws IOException {
        // Set the license key for IronPDF
        License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");

        // Load an existing PDF document from file
        PdfDocument pdf = PdfDocument.fromFile(Paths.get("sample.pdf"));

        // Reference the image file path relative to the runtime working directory
        String watermarkHtml = "<img src='logo.png' style='width:100px;'/>";

        // Apply the image watermark to all pages
        pdf.applyWatermark(watermarkHtml);

        // Save the result
        pdf.saveAs("image_watermark.pdf");
    }
}
JAVA

<img> 标签中的 CSS 属性用于控制大小、位置和透明度:

//:path=/static-assets/pdf/content-code-examples/how-to/custom-watermark/image-watermark-advanced.java
// Apply a 150px logo at 50% opacity, rotated 45 degrees counterclockwise
String advancedWatermarkHtml =
    "<img src='logo.png' style='width:150px; opacity:0.5; transform:rotate(-45deg);'/>";
//:path=/static-assets/pdf/content-code-examples/how-to/custom-watermark/image-watermark-advanced.java
// Apply a 150px logo at 50% opacity, rotated 45 degrees counterclockwise
String advancedWatermarkHtml =
    "<img src='logo.png' style='width:150px; opacity:0.5; transform:rotate(-45deg);'/>";
JAVA

运行时,图像路径必须可在 JVM 工作目录下访问。对于服务器部署,请使用绝对路径,或将图像作为 Base64 数据 URI 嵌入 src 属性中,以避免路径解析问题。

图像水印支持哪些文件格式?

IronPDF在水印中支持PNG、JPEG、GIF、SVG和BMP图像格式。 具有透明背景的PNG为徽标水印提供了最干净的效果。 输出文件 image_watermark.pdf 显示的图片宽度为 100 像素,每页居中显示,默认不透明度为 50%。 若要从现有PDF中提取图像以用于另一个水印,请参见从PDF中提取图像的指南


如何控制水印的不透明度和对齐方式?

applyWatermark 方法在 HTML 字符串之后接受不透明度和对齐参数。 不透明度是介于0(完全透明)到100(完全不透明)之间的整数。 值在20到40之间最适合大多数文档,保持水印可见而不遮挡正文文本。 VerticalAlignmentHorizontalAlignment 枚举控件用于指定水印在页面上的具体位置(角落或边缘)。

//:path=/static-assets/pdf/content-code-examples/how-to/custom-watermark/watermark-opacity-alignment.java
import java.io.IOException;
import java.nio.file.Paths;

import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.stamp.HorizontalAlignment;
import com.ironsoftware.ironpdf.stamp.VerticalAlignment;

public class Main {
    public static void main(String[] args) throws IOException {
        // Set the license key for IronPDF
        License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");

        // Load an existing PDF document from file
        PdfDocument pdf = PdfDocument.fromFile(Paths.get("sample.pdf"));

        // Define the watermark HTML
        String watermarkHtml = "<h1 style='color:blue;'>Confidential</h1>";

        // Apply at 30% opacity, anchored to the top-left corner of each page
        pdf.applyWatermark(watermarkHtml, 30, VerticalAlignment.TOP, HorizontalAlignment.LEFT);

        // Save the result
        pdf.saveAs("watermark_opacity_alignment.pdf");
    }
}
//:path=/static-assets/pdf/content-code-examples/how-to/custom-watermark/watermark-opacity-alignment.java
import java.io.IOException;
import java.nio.file.Paths;

import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.stamp.HorizontalAlignment;
import com.ironsoftware.ironpdf.stamp.VerticalAlignment;

public class Main {
    public static void main(String[] args) throws IOException {
        // Set the license key for IronPDF
        License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");

        // Load an existing PDF document from file
        PdfDocument pdf = PdfDocument.fromFile(Paths.get("sample.pdf"));

        // Define the watermark HTML
        String watermarkHtml = "<h1 style='color:blue;'>Confidential</h1>";

        // Apply at 30% opacity, anchored to the top-left corner of each page
        pdf.applyWatermark(watermarkHtml, 30, VerticalAlignment.TOP, HorizontalAlignment.LEFT);

        // Save the result
        pdf.saveAs("watermark_opacity_alignment.pdf");
    }
}
JAVA

组合三个可选参数可以得到九种独特的定位选项,每个选项对应于垂直和水平对齐的交集。 对于需要在同一页面上的多个位置上添加水印或仅应用于特定页面范围的用例,盖章类提供了更精细的控制。 请参阅背景和前景指南以获取分层合成技术。

有哪些对齐选项?

applyWatermark 方法支持以下对齐常量:

垂直对齐 (VerticalAlignment):

  • TOP - 固定在顶部的浮水印
  • MIDDLE - 垂直居中水印
  • BOTTOM - 固定在底部边缘的水印

水平对齐 (HorizontalAlignment):

  • LEFT - 左对齐水印
  • CENTER - 水印水平居中
  • RIGHT - 水印锚定于右侧边缘

请注意默认调用 applyWatermark(html) 且不带额外参数时,等同于传入不透明度 50、VerticalAlignment.MIDDLE 以及 HorizontalAlignment.CENTER。

将任何垂直值与任何水平值配对以实现精准控制。 对于需要多个重叠印章的文档(例如右上角的徽标和对角线居中的草稿标记),请将每个印章作为独立的 applyWatermark 调用进行应用。 对于基于注释的覆盖层,请参阅注释示例


我如何使用TextStamper和ImageStamper应用高级水印?

applyWatermark 方法可满足大多数水印需求,但当需要精确的像素坐标、页面范围定位或动态文本生成时,TextStamperImageStamper 类可提供程序化控制。 这两个类均属于 com.ironsoftware.ironpdf.stamp 包。

TextStamper 接受字符串值,并提供字体、字号、字体颜色、水平和垂直对齐以及透明度等属性。 它还支持整数(度数)旋转。 ImageStamper 接受图像的文件路径或字节数组,并提供与 TextStamper 相同的对齐和不透明度控制选项。

applyWatermark 相比,stamper 类的主要优势在于能够针对特定页面进行操作。 向 stamp 方法传递一个从零开始的页码列表,仅对需要添加水印的页面应用水印,例如仅在报告的封面页或合同的最终审批页上添加水印。

//:path=/static-assets/pdf/content-code-examples/how-to/custom-watermark/text-stamper.java
import java.io.IOException;
import java.nio.file.Paths;
import java.util.Arrays;

import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.stamp.HorizontalAlignment;
import com.ironsoftware.ironpdf.stamp.TextStamper;
import com.ironsoftware.ironpdf.stamp.VerticalAlignment;

public class Main {
    public static void main(String[] args) throws IOException {
        // Set the license key for IronPDF
        License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");

        // Load the target PDF document
        PdfDocument pdf = PdfDocument.fromFile(Paths.get("sample.pdf"));

        // Configure a TextStamper with custom font, rotation, and opacity
        TextStamper stamper = new TextStamper();
        stamper.setText("DRAFT");
        stamper.setFontSize(72);
        stamper.setFontColor("gray");
        stamper.setOpacity(40);
        stamper.setRotation(45);
        stamper.setVerticalAlignment(VerticalAlignment.MIDDLE);
        stamper.setHorizontalAlignment(HorizontalAlignment.CENTER);

        // Apply the stamp only to pages 0 and 1 (zero-indexed)
        pdf.stamp(stamper, Arrays.asList(0, 1));

        // Save the stamped PDF
        pdf.saveAs("text_stamped.pdf");
    }
}
//:path=/static-assets/pdf/content-code-examples/how-to/custom-watermark/text-stamper.java
import java.io.IOException;
import java.nio.file.Paths;
import java.util.Arrays;

import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.stamp.HorizontalAlignment;
import com.ironsoftware.ironpdf.stamp.TextStamper;
import com.ironsoftware.ironpdf.stamp.VerticalAlignment;

public class Main {
    public static void main(String[] args) throws IOException {
        // Set the license key for IronPDF
        License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");

        // Load the target PDF document
        PdfDocument pdf = PdfDocument.fromFile(Paths.get("sample.pdf"));

        // Configure a TextStamper with custom font, rotation, and opacity
        TextStamper stamper = new TextStamper();
        stamper.setText("DRAFT");
        stamper.setFontSize(72);
        stamper.setFontColor("gray");
        stamper.setOpacity(40);
        stamper.setRotation(45);
        stamper.setVerticalAlignment(VerticalAlignment.MIDDLE);
        stamper.setHorizontalAlignment(HorizontalAlignment.CENTER);

        // Apply the stamp only to pages 0 and 1 (zero-indexed)
        pdf.stamp(stamper, Arrays.asList(0, 1));

        // Save the stamped PDF
        pdf.saveAs("text_stamped.pdf");
    }
}
JAVA

stamp 方法接受一个 List<Integer> 零起始的页码数组,从而能够精确控制哪些页面需要添加水印。 如果没有提供页面列表,印章将应用于所有页面。 这使得 TextStamper 成为您的理想选择,尤其当您的应用程序需要动态生成水印时,例如在生成的每个 PDF 中嵌入唯一的交易 ID、用户名或时间戳。

重要TextStamperImageStamper 类共享一个共同的 Stamper 基类。 每当您的应用程序动态生成水印,例如在每个生成的PDF上嵌入唯一的交易ID或用户名时,使用盖章方法。)}]

对于批量处理,例如在数百个 PDF 上添加独特的客户专属水印,请在循环中加载并处理每个 PdfDocument,然后在下一轮迭代前调用 saveAs。 IronPDF独立处理每个文档,因此内存使用保持在有限范围。 Java PDF 水印指南详细介绍了 ImageStamper 以及其他水印选项,而 IronPDF for Java 文档则提供了完整的 API 参考。

TextStamper与applyWatermark有何不同?

applyWatermark 方法经过优化,可从 HTML 字符串中快速、一致地生成多页水印。 TextStamperImageStamper 针对 applyWatermark 无法满足的场景:针对特定页面子集、应用多个配置不同的独立水印,或通过编程方式从数据库或用户输入中构建水印参数。 两种方法都产生嵌入在PDF内容流中的矢量质量输出,因此水印可以在重新保存、打印和不存储可选内容层的PDF阅读器中存活。

使用Apache PDFBox库进行水印的开发人员会发现IronPDF的方法要简单得多。 PDFBox 需要手动构建内容流并管理资源,而 applyWatermark 则接受纯 HTML 字符串。 Baeldung 上的 iText 水印指南展示了一个使用 iText 实现的类似任务,该任务涉及创建 PdfStampAnnotation 对象并通过 PdfCanvas 管道将其添加。而 IronPDF 仅需一次方法调用即可完成此操作。

提示若需通过编程方式验证水印输出效果,请使用 PdfDocument.extractAllText() 提取文本内容并检查是否包含预期水印字符串;或参考 Stack Overflow 社区关于 Java PDF 处理的讨论,了解常见的故障排除模式。


Java中PDF水印的下一步是什么?

本指南介绍了使用 IronPDF for Java 对 PDF 添加水印的四种方法:通过 applyWatermark 添加简单文本水印,使用 HTML <img> 标签添加图片水印、通过方法参数控制不透明度和对齐方式,以及针对高级用例使用 TextStamperImageStamper 进行程序化加盖。

开始您的免费试用,在您的Java应用程序中测试水印。 试用版包括对所有盖章和水印功能的完整访问,没有评估时间限制。 当您准备好部署时,查看许可选项以找到适合您使用的级别。

准备好看看您还能做些什么吗? 在此查看完整的教程页面:IronPDF for Java 使用指南

常见问题解答

如何在 Java 中为 PDF 添加文本水印?

使用PdfDocument.fromFile()加载您的PDF,然后调用pdf.applyWatermark()和HTML字符串。由于IronPDF渲染任何有效的HTML和CSS,您可以直接在元素上设置颜色、字体大小和不透明度。

我可以在Java中使用图像作为水印吗?

可以。将标签放入HTML字符串中传递给applyWatermark()。使用透明背景的PNG文件可产生最清晰的效果。您也可以使用ImageStamper类进行页面范围定位。

如何控制水印的不透明度?

将从0(完全透明)到100(完全不透明)的整数作为第二个参数传给applyWatermark()。20到40之间的值对于大多数文档表现良好且不会妨碍正文。

我可以对水印进行对角旋转吗?

是的。 在将HTML元素传递给applyWatermark()之前,向其添加CSS transform: rotate(-45deg)样式。 IronPDF在渲染期间应用所有标准的CSS3变换。

applyWatermark 和 TextStamper 之间有什么区别?

applyWatermark() 是将相同的基于HTML的印章应用到每一页的最快方法。 TextStamper 为字体、旋转和用于定位特定页面的分页列表提供了程序化控制。

如何将水印放置在特定位置?

VerticalAlignmentHorizontalAlignment枚举值作为第三和第四个参数传递给applyWatermark()。 可用位置包括TOP、MIDDLE、BOTTOM与LEFT、CENTER、RIGHT结合使用。

我可以对不同的页面应用不同的水印吗?

可以。 使用TextStamperImageStamper并将从零开始的页面编号列表传递给stamp()方法,仅针对需要特定水印的页面。

我可以在同一个PDF中组合文字和图像水印吗?

可以。 在保存之前多次调用applyWatermark()或多次调用stamp()。 每次调用都会独立向PDF内容流添加一个新图层。

Darrius Serrant
全栈软件工程师(WebOps)

Darrius Serrant 拥有迈阿密大学的计算机科学学士学位,目前在 Iron Software 担任全栈 WebOps 市场工程师。从小就被编码吸引,他认为计算机既神秘又易于接触,使其成为创意和问题解决的理想媒介。

在 Iron Software,Darrius 喜欢创造新事物,并简化复杂概念以使其更易理解。作为我们常驻的开发者之一,他还自愿教授学生,与下一代分享他的专业知识。

对于 Darrius 来说,他的工作令人满意,因为它被重视并产生真正的影响。

准备开始了吗?
版本: 2026.5 just released
Still Scrolling Icon

还在滚动吗?

想快速获得证据?
运行示例看着你的HTML代码变成PDF文件。