套用浮水印於所有頁面 – Java PDF 浮水印指南

在本完整教學中,您將學習 如何在所有頁面套用浮水印 到 PDF 文件,使用 Java 與 GroupDocs.Annotation。無論您是需要保護機密報告、為行銷 PDF 加上品牌標誌,或在整個檔案上添加「CONFIDENTIAL」印章,以下步驟將從 Maven 設定到進階客製化,帶您一步步完成,讓您在數分鐘內實作可靠的解決方案。

快速解答

  • 什麼函式庫可以在 Java 中為多頁 PDF 添加浮水印? GroupDocs.Annotation for Java.
  • 我需要授權嗎? 是的,免費試用可用於開發;正式環境需購買完整授權。
  • 我可以一次為所有頁面加浮水印嗎? 可以 – 在迴圈中為每一頁建立浮水印註解。
  • 需要哪個 Java 版本? JDK 8 以上(建議使用 JDK 11 以上)。
  • 如何控制不透明度? 使用 setOpacity(double),其中 0.0 為完全透明,1.0 為完全不透明。

為何需要 PDF 浮水印(以及 Java 如何讓它變得簡單)

是否曾擔心機密 PDF 會在未經授權的情況下被分享?或需要快速為銷售手冊的每一頁加上品牌標誌?以程式方式添加浮水印可省去手動操作,確保一致性,並加強文件安全性。使用 Java 與 GroupDocs.Annotation——最強大的 java add watermark pdf 函式庫之一,您可以細緻控制浮水印的位置、旋轉、顏色與不透明度,同時高效處理大型檔案。

本指南結束後您將掌握的內容:

  • 設定 GroupDocs.Annotation 於 Java 的浮水印
  • 建立自訂浮水印註解,套用於 所有頁面
  • 處理大型 PDF 而不耗盡記憶體
  • 排除常見問題並優化效能

什麼是 PDF 浮水印,以及為何在多頁上使用它?

PDF 浮水印是一層覆蓋於文件內容之上的圖層,並不會改變底層的文字或影像。將浮水印套用於 所有頁面 可確保每一頁都帶有相同的品牌或機密聲明,避免未加標記的頁面被意外散佈。

前置條件

必要條件

  • Java 環境: JDK 8 或以上(建議 JDK 11 以上),Maven 3.6+,任意 IDE(IntelliJ、Eclipse、VS Code)。
  • 知識前置: 基本 Java 語法、檔案 I/O、Maven 依賴管理。
  • 專案權限: 具寫入輸出目錄的權限,且有足夠記憶體處理大型 PDF(建議 ≥ 4 GB RAM 以處理超過 200 頁的檔案)。

設定 Java PDF 浮水印環境

將 GroupDocs.Annotation 加入您的專案

首先,加入 GroupDocs.Annotation 的 Maven 套件。此依賴會自動下載所有必需的二進位檔與傳遞性函式庫。

定義:Maven 的 <dependency> 元素宣告了 GroupDocs.Annotation 函式庫,讓編譯器在建置時能找到相應的 JAR 檔。

<!-- Maven dependency for GroupDocs.Annotation -->
<dependency>
    <groupId>com.groupdocs</groupId>
    <artifactId>groupdocs-annotation</artifactId>
    <version>25.2</version>
</dependency>
<repositories>
   <repository>
      <id>repository.groupdocs.com</id>
      <name>GroupDocs Repository</name>
      <url>https://releases.groupdocs.com/annotation/java/</url>
   </repository>
</repositories>
<dependencies>
   <dependency>
      <groupId>com.groupdocs</groupId>
      <artifactId>groupdocs-annotation</artifactId>
      <version>25.2</version>
   </dependency>
</dependencies>

專業提示:始終使用最新發佈的版本(範例顯示 25.2,為 2025 年最新),以獲得錯誤修正與效能提升。

取得授權

正式環境部署需要有效授權。請依需求選擇以下方案:

  1. 免費試用: 適合開發與測試。從 GroupDocs Downloads 下載。
  2. 暫時授權: 完整功能供評估使用。可於 Temporary License Page 取得。
  3. 正式授權: 商業使用必須購買。請至 GroupDocs Purchase Page 購買。

可行的基本設定

加入依賴並取得授權檔後,初始化 Annotator 物件。此物件會將 PDF 載入記憶體,並提供建立註解的 API。

定義:Annotator 為 GroupDocs.Annotation 的主要入口點,負責 PDF 載入、註解建立與儲存。

// Initialize Annotator with a license and input PDF
Annotator annotator = new Annotator("input.pdf", "GroupDocs.Annotation.lic");
import com.groupdocs.annotation.Annotator;

public class WatermarkSetup {
    public static void main(String[] args) {
        String inputFilePath = "YOUR_DOCUMENT_DIRECTORY/input.pdf";
        Annotator annotator = new Annotator(inputFilePath);
        
        // Your watermark code goes here...
        // Always remember to dispose!
        annotator.dispose();
    }
}

常見錯誤避免: 處理完畢後忘記呼叫 annotator.dispose(),可能導致記憶體洩漏,尤其在批次處理多個文件時。

如何在 Java 中套用浮水印於所有頁面

要為每一頁套用浮水印,您需要建立 WatermarkAnnotation,設定其視覺屬性,然後在迴圈中為每一頁新增此註解的獨立實例。迴圈會使用文件的頁數,指派正確的頁碼,最後儲存修改後的 PDF。

了解浮水印註解

WatermarkAnnotation 代表一個可包含文字、自訂顏色、旋轉與不透明度的覆蓋層。與單純的文字加入不同,它以註解形式儲存,之後可移除或編輯。

定義:WatermarkAnnotation 為 GroupDocs.Annotation 中的類別,封裝了浮水印覆蓋層的所有視覺屬性。

WatermarkAnnotation watermark = new WatermarkAnnotation();
import com.groupdocs.annotation.Annotator;
import com.groupdocs.annotation.models.Reply;
import com.groupdocs.annotation.models.Rectangle;
import com.groupdocs.annotation.models.annotationmodels.WatermarkAnnotation;
import java.util.ArrayList;
import java.util.Calendar;

步驟 1:匯入所需類別

在使用 API 前,先匯入必要的類別。

定義:匯入語句將所需的 GroupDocs.Annotation 類別帶入當前 Java 檔案,使您無需使用完整限定名即可引用。

import com.groupdocs.annotation.Annotator;
import com.groupdocs.annotation.models.annotation.WatermarkAnnotation;
import com.groupdocs.annotation.models.common.Rectangle;
import com.groupdocs.annotation.models.annotation.Reply;
String inputFilePath = "YOUR_DOCUMENT_DIRECTORY/input.pdf";
String outputPath = "YOUR_OUTPUT_DIRECTORY/AddWatermarkAnnotation.pdf";

final Annotator annotator = new Annotator(inputFilePath);

步驟 2:載入 PDF 文件

建立指向來源 PDF 的 Annotator 實例。

定義:Annotator 建構子會將 PDF 檔載入可管理的物件,為註解操作做準備。

Annotator annotator = new Annotator("sample.pdf");
Reply reply1 = new Reply();
reply1.setComment("First comment");
reply1.setRepliedOn(Calendar.getInstance().getTime());

Reply reply2 = new Reply();
reply2.setComment("Second comment");
reply2.setRepliedOn(Calendar.getInstance().getTime());

專業提示: 若 PDF 大於 50 MB,建議增大 JVM 堆積 (-Xmx4g) 並以順序方式處理檔案,以降低記憶體使用量。

步驟 3:(可選)準備回覆中繼資料

若需為浮水印附加評論或核准備註,可建立 Reply 物件。

定義:Reply 用於儲存隨註解一起的使用者評論,對稽核追蹤很有幫助。

Reply reply = new Reply();
reply.setComment("Confidential – Internal Use Only");
ArrayList<Reply> replies = new ArrayList<>();
replies.add(reply1);
replies.add(reply2);

WatermarkAnnotation watermark = new WatermarkAnnotation();
watermark.setAngle(75.0); // Set the angle of the watermark.
watermark.setBox(new Rectangle(200, 200, 100, 50)); // Define position and size with a rectangle.
watermark.setCreatedOn(Calendar.getInstance().getTime());
watermark.setText("Watermark");
watermark.setFontColor(65535); // Yellow color in ARGB format
watermark.setFontSize(12.0);
watermark.setMessage("This is a watermark annotation");
watermark.setOpacity(0.7);
watermark.setPageNumber(0);
watermark.setReplies(replies);

步驟 4:設定浮水印外觀

設定文字、顏色、旋轉、大小與不透明度等視覺屬性。

定義:以下 setter 方法可自訂浮水印在每頁的外觀與位置。

watermark.setText("CONFIDENTIAL");
watermark.setAngle(75.0);                     // Diagonal orientation
watermark.setBox(new Rectangle(200, 200, 300, 100)); // Position & size
watermark.setFontColor(65535);               // Yellow (ARGB)
watermark.setOpacity(0.7);                   // 70% opacity
watermark.setReply(reply);                   // Attach the optional reply
annotator.add(watermark);
annotator.save(outputPath);
annotator.dispose();

步驟 5:遍歷所有頁面並套用浮水印

要 套用浮水印於所有頁面,請遍歷文件的頁數,將註解指派給每一頁。

定義:annotator.getPageCount() 會回傳總頁數,讓您能在迴圈中為每頁建立獨立的 WatermarkAnnotation。

int pageCount = annotator.getPageCount();
for (int i = 0; i < pageCount; i++) {
    WatermarkAnnotation pageWatermark = watermark.clone(); // Duplicate settings
    pageWatermark.setPageNumber(i);                       // Zero‑based index
    annotator.add(pageWatermark);                         // Add to current page
}
// Get total page count first
int pageCount = annotator.getDocument().getPages().size();

for (int i = 0; i < pageCount; i++) {
    WatermarkAnnotation watermark = new WatermarkAnnotation();
    // Reuse the same configuration or customize per page
    watermark.setAngle(45.0);
    watermark.setText("CONFIDENTIAL");
    watermark.setFontColor(16711680); // Red
    watermark.setOpacity(0.3);
    watermark.setFontSize(24.0);
    watermark.setBox(new Rectangle(100, 300, 400, 100));
    watermark.setPageNumber(i);
    annotator.add(watermark);
}
annotator.save(outputPath);
annotator.dispose();

步驟 6:儲存加了浮水印的 PDF

最後,將變更寫入新檔案。原始 PDF 保持不變。

定義:annotator.save("output.pdf") 會將所有新增的註解持久化為新的 PDF 檔案。

annotator.save("output_watermarked.pdf");
annotator.dispose(); // Release resources
// Better error handling approach
try {
    File inputFile = new File(inputFilePath);
    if (!inputFile.exists()) {
        throw new FileNotFoundException("Input PDF not found: " + inputFilePath);
    }
    
    Annotator annotator = new Annotator(inputFilePath);
    // ... your watermark code
} catch (Exception e) {
    System.err.println("Error processing PDF: " + e.getMessage());
}

以上即為使用 GroupDocs.Annotation for Java 套用浮水印於所有頁面 的完整流程。

常見問題與解決方法

「找不到檔案」錯誤

// Example of handling missing file paths
File inputFile = new File("nonexistent.pdf");
if (!inputFile.exists()) {
    throw new IllegalArgumentException("Input PDF not found at: " + inputFile.getAbsolutePath());
}
WatermarkAnnotation confidentialWatermark = new WatermarkAnnotation();
confidentialWatermark.setAngle(45.0);
confidentialWatermark.setText("CONFIDENTIAL");
confidentialWatermark.setFontColor(16711680); // Red
confidentialWatermark.setOpacity(0.3); // Subtle but visible
confidentialWatermark.setFontSize(24.0);
confidentialWatermark.setBox(new Rectangle(100, 300, 400, 100));
  • 核對絕對路徑並確認檔案存在。
  • 檢查輸入與輸出目錄的讀寫權限。
  • 若輸出資料夾不存在,請先建立。

大型 PDF 的記憶體問題

  • 處理完畢後務必呼叫 annotator.dispose()。
  • 一次處理一個 PDF;除非函式庫已證實為執行緒安全,否則避免使用平行串流。
  • 對於超過 200 頁的檔案,請增大 JVM 堆積 (-Xmx4g 或更高)。

浮水印位置不如預期

  • PDF 座標原點位於 左下角;請相應調整 Rectangle 的數值。
  • 測試不同頁面尺寸(A4 與 Letter),因尺寸會影響定位。
  • 若浮水印在高對比背景下過於淡薄,可使用 setOpacity(0.5)。

字型顏色問題

GroupDocs.Annotation 需要 ARGB 整數值。常用顏色如下:

  • 紅色:16711680
  • 藍色:255
  • 綠色:65280
  • 黑色:0
  • 白色:16777215
  • 黃色:65535(範例中使用)

Java PDF 浮水印的實務應用案例

商業文件保護

// Apply a corporate logo watermark across all pages of a contract
watermark.setText("© Acme Corp – Confidential");
WatermarkAnnotation brandWatermark = new WatermarkAnnotation();
brandWatermark.setText("© YourCompany 2025");
brandWatermark.setFontColor(0); // Black
brandWatermark.setOpacity(0.6);
brandWatermark.setFontSize(10.0);
brandWatermark.setBox(new Rectangle(400, 50, 150, 30));

行銷素材品牌化

// Use a semi‑transparent brand slogan as a watermark
watermark.setText("Acme Marketing 2026");
watermark.setOpacity(0.4);
WatermarkAnnotation versionWatermark = new WatermarkAnnotation();
versionWatermark.setText("DRAFT - v2.1");
versionWatermark.setFontColor(255); // Blue
versionWatermark.setOpacity(0.8);
versionWatermark.setBox(new Rectangle(50, 750, 100, 30));

文件版本控制

// Append version number dynamically
watermark.setText("Version 3.2 – Reviewed");
public void processMultiplePDFs(List<String> pdfPaths) {
    for (String path : pdfPaths) {
        Annotator annotator = null;
        try {
            annotator = new Annotator(path);
            // Add your watermark logic here
            annotator.save(path.replace(".pdf", "_watermarked.pdf"));
        } finally {
            if (annotator != null) {
                annotator.dispose(); // Always dispose, even if exceptions occur
            }
        }
    }
}

效能優化建議

記憶體管理最佳實踐

// Explicitly release resources after each document
annotator.dispose();
System.gc(); // Hint to the JVM (optional)
public class WatermarkTemplates {
    public static WatermarkAnnotation createConfidentialWatermark() {
        WatermarkAnnotation watermark = new WatermarkAnnotation();
        watermark.setAngle(45.0);
        watermark.setText("CONFIDENTIAL");
        watermark.setFontColor(16711680);
        watermark.setOpacity(0.3);
        watermark.setFontSize(24.0);
        return watermark;
    }
    
    public static WatermarkAnnotation createBrandWatermark(String companyName) {
        WatermarkAnnotation watermark = new WatermarkAnnotation();
        watermark.setText("© " + companyName + " 2025");
        watermark.setFontColor(0);
        watermark.setOpacity(0.6);
        watermark.setFontSize(10.0);
        return watermark;
    }
}
  • 依序處理文件,以降低堆積佔用。
  • 為批次作業加入進度指示器,以監控記憶體使用情況。
  • 若僅需為部分頁面加浮水印,避免一次載入整份 PDF;函式庫支援頁面層級載入。

程式碼組織建議

  • 將浮水印建立封裝於工具方法,例如 createWatermark(String text, double opacity, int angle)。
  • 將設定(顏色、字型、不透明度)外部化於 properties 檔,以便在不同環境中輕鬆調整。

常見問答

Q:如何在 PDF 的多頁添加浮水印?
A:遍歷文件的頁數,為每頁克隆已設定好的 WatermarkAnnotation,使用 setPageNumber(i) 設定頁號,然後以 annotator.add() 加入。

Q:我可以為浮水印使用自訂字型嗎?
A:GroupDocs.Annotation 會使用主機作業系統已安裝的字型。請指定伺服器上存在的字型族;若找不到,函式庫會回退至預設字型。

Q:專業浮水印的最佳不透明度設定為何?
A:介於 0.3 與 0.7 之間較為平衡——足以被注意,同時不會妨礙閱讀底層內容。

Q:該如何處理非常大的 PDF 檔案?
A:增大 JVM 堆積 (-Xmx4g 或更高)、一次處理一個檔案,且每處理完文件後務必呼叫 dispose() 以釋放原生資源。

Q:是否可以移除或修改已存在的浮水印?
A:可以——使用 annotator.get() 取得註解,篩選出 WatermarkAnnotation,然後依需求編輯或刪除:

List<AnnotationBase> watermarks = annotator.get().stream()
    .filter(a -> a instanceof WatermarkAnnotation)
    .collect(Collectors.toList());
annotator.delete(watermarks.get(0)); // Example: delete first watermark
// Get existing annotations
List<AnnotationBase> annotations = annotator.get();
// Filter and modify as needed

其他資源


最後更新: 2026-07-30
測試版本: GroupDocs.Annotation 25.2
作者: GroupDocs

相關教學