博客 / 詳情

返回

使用 Java 對 PDF 添加水印:提升文檔安全與版權保護

在當今數字化辦公環境中,PDF 文檔作為信息交流和存儲的重要載體,其安全性和版權保護變得尤為關鍵。企業常常需要對內部敏感文檔或對外發布的資料添加水印,以防止未經授權的使用、泄露或篡改。那麼,如何通過 Java 編程高效、靈活地實現 PDF 水印的添加呢?

本文將為您揭示這一問題的解決方案。我們將深入探討如何利用功能強大且易於集成的 Spire.PDF for Java 庫,為您的 PDF 文檔添加專業的文本水印圖片水印。通過本文提供的詳細教程和可運行的代碼示例,您將能夠輕鬆掌握 PDF 水印技術,有效提升文檔的安全性和專業性。


認識 Spire.PDF for Java 及其在水印處理中的優勢

Spire.PDF for Java 是一款專為 Java 應用程序設計的專業 PDF 文檔處理庫。它提供了豐富的功能,包括 PDF 的創建、編輯、轉換、合併、分割、加密解密以及各種高級操作,如表單填充、電子簽名和我們今天要重點討論的水印添加

該庫具有以下顯著優勢:

  • 跨平台兼容性:支持 Windows、Linux、macOS 等多種操作系統,確保您的應用在不同環境下穩定運行。
  • 功能豐富:不僅限於水印,還涵蓋了 PDF 處理的方方面面,滿足企業級應用需求。
  • 易於集成:提供清晰的 API 接口和詳細的文檔,開發者可以快速上手並將其集成到現有項目中。
  • 高性能:優化了處理效率,能夠快速處理大量 PDF 文檔。
  • 靈活的水印配置:允許開發者精細控制水印的文本內容、字體、顏色、大小、透明度、旋轉角度、位置等,以及圖片水印的尺寸、位置和透明度。

如何獲取和配置 Spire.PDF for Java 依賴

要開始使用 Spire.PDF for Java,您需要將其作為依賴添加到您的 Maven 項目中。

Maven 依賴示例:

<repositories>
    <repository>
        <id>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>5.12.7</version> <!-- 請替換為最新版本 -->
    </dependency>
</dependencies>

如何使用 Java 添加文本水印到 PDF

添加文本水印是保護文檔版權和防止濫用的常見方法。Spire.PDF for Java 提供了強大的功能來定製文本水印的外觀。

以下是添加文本水印的詳細步驟和代碼示例:

  1. 加載 PDF 文檔:使用 PdfDocument 類加載現有 PDF 文件。
  2. 創建水印內容:定義水印文本、字體、大小、顏色、旋轉角度和透明度等屬性。
  3. 遍歷頁面並應用水印:遍歷 PDF 文檔的每一個頁面,並在頁面上繪製水印。為了實現頁面的平鋪效果,通常會創建一個 PdfTilingBrush。
  4. 保存文檔:將修改後的 PDF 文檔保存到新文件或覆蓋原文件。

關鍵文本水印屬性及 API 方法

屬性 描述 對應 API 方法/類
內容 水印顯示的文字 PdfTilingBrush.getGraphics().drawString()
字體 水印文本的字體 PdfFont
大小 水印文本的字號 PdfFont
顏色 水印文本的顏色 PdfBrushes.getColor()
透明度 水印的透明度(0-1,1為完全不透明) PdfTilingBrush.getGraphics().setTransparency()
旋轉角度 水印文本的旋轉角度 PdfTilingBrush.getGraphics().rotateTransform()
位置 水印在頁面上的起始位置 PdfTilingBrush.getGraphics().translateTransform()

Java 代碼示例:添加文本水印

import com.spire.pdf.*;
import com.spire.pdf.graphics.*;

import java.awt.*;
import java.awt.geom.Dimension2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.io.IOException;

public class AddTextWatermark {
    public static void main(String[] args) throws IOException {
        // 1. 加載PDF文檔
        PdfDocument doc = new PdfDocument();
        doc.loadFromFile("input.pdf"); // 確保input.pdf存在

        // 水印文本
        String watermarkText = "公司機密 嚴禁轉載";

        // 遍歷PDF文檔的每個頁面
        for (int i = 0; i < doc.getPages().getCount(); i++) {
            PdfPageBase page = doc.getPages().get(i);

            // 創建一個尺寸與頁面相同的模板,用於繪製水印
            PdfTemplate template = new PdfTemplate(page.getClientSize().getWidth(), page.getClientSize().getHeight());

            // 繪製水印到模板
            drawTextWatermarkToTemplate(template, watermarkText);

            // 創建一個矩形,覆蓋整個頁面,用於放置水印
            Rectangle2D loRect = new Rectangle2D.Float();
            loRect.setFrame(new Point2D.Float(0, 0), page.getClientSize());

            // 創建水印註釋
            PdfWatermarkAnnotation watermarkAnnotation = new PdfWatermarkAnnotation(loRect);
            PdfAppearance appearance = new PdfAppearance(watermarkAnnotation);
            appearance.setNormal(template); // 將繪製了水印的模板設為水印註釋的正常外觀
            watermarkAnnotation.setAppearance(appearance);
            
            // 將水印註釋添加到當前頁面的註釋集合中
            page.getAnnotationsWidget().add(watermarkAnnotation);
        }

        // 4. 保存帶有水印的PDF文檔
        doc.saveToFile("output_text_watermark.pdf");
        doc.close();
        System.out.println("文本水印添加成功!文件已保存為 output_text_watermark.pdf");
    }

    private static void drawTextWatermarkToTemplate(PdfTemplate template, String watermark) {
        // 創建一個刷子,用於平鋪水印
        // 水印的尺寸設為模板寬度的一半,高度的三分之一,以實現重複平鋪效果
        Dimension2D dimension2D = new Dimension();
        dimension2D.setSize(template.getWidth() / 2, template.getHeight() / 3);
        PdfTilingBrush brush = new PdfTilingBrush(dimension2D);

        // 設置水印的透明度為 0.3 (30%)
        brush.getGraphics().setTransparency(0.3f);

        // 保存當前圖形狀態
        brush.getGraphics().save();

        // 旋轉水印,通常為負45度
        brush.getGraphics().rotateTransform(-45);

        // 設置字體和顏色
        PdfFont font = new PdfFont(PdfFontFamily.Helvetica, 24f, PdfFontStyle.Bold);
        PdfStringFormat format = new PdfStringFormat();
        format.setAlignment(PdfStringAlignment.Center);
        format.setLineAlignment(PdfVerticalAlignment.Middle);

        // 在刷子上繪製水印文本
        // 調整繪製位置,使其在刷子區域內居中
        brush.getGraphics().drawString(watermark, font, PdfBrushes.getGray(),
                (float) brush.getSize().getWidth() / 2, (float) brush.getSize().getHeight() / 2, format);

        // 恢復圖形狀態
        brush.getGraphics().restore();

        // 將繪製了水印的刷子應用到模板上
        template.getGraphics().drawRectangle(brush, new Rectangle2D.Float(0, 0, template.getWidth(), template.getHeight()));
    }
}

如何使用 Java 添加圖片水印到 PDF

除了文本水印,圖片水印(如公司 Logo、保密圖章等)也是一種常見的文檔保護手段。Spire.PDF for Java 同樣支持添加圖片水印,並提供靈活的配置選項。

以下是添加圖片水印的詳細步驟和代碼示例:

  1. 加載 PDF 文檔:使用 PdfDocument 加載現有 PDF 文件。
  2. 加載圖片文件:使用 PdfImage.fromFile() 方法加載圖片文件作為水印。
  3. 設置圖片水印屬性:定義圖片水印的位置、大小、透明度和旋轉角度。
  4. 遍歷頁面並應用水印:遍歷 PDF 文檔的每個頁面,並在指定位置繪製圖片。
  5. 保存文檔:將修改後的 PDF 文檔保存。

關鍵圖片水印屬性及 API 方法

屬性 描述 對應 API 方法/類
來源 水印圖片文件的路徑 PdfImage.fromFile()
位置 水印在頁面上的 X, Y 座標 page.getCanvas().drawImage()
大小 水印圖片的寬度和高度 page.getCanvas().drawImage()
透明度 水印的透明度(0-1,1為完全不透明) PdfGraphics.setTransparency()
旋轉角度 水印圖片的旋轉角度 PdfGraphics.rotateTransform()

Java 代碼示例:添加圖片水印

import com.spire.pdf.*;
import com.spire.pdf.graphics.*;

import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.io.IOException;

public class AddImageWatermark {
    public static void main(String[] args) throws IOException {
        // 1. 加載PDF文檔
        PdfDocument doc = new PdfDocument();
        doc.loadFromFile("input.pdf"); // 確保input.pdf存在

        // 2. 加載圖片文件作為水印
        PdfImage image = PdfImage.fromFile("watermark.png"); // 確保watermark.png存在

        // 遍歷PDF文檔的每個頁面
        for (int i = 0; i < doc.getPages().getCount(); i++) {
            PdfPageBase page = doc.getPages().get(i);

            // 創建一個尺寸與頁面相同的模板
            PdfTemplate template = new PdfTemplate(page.getClientSize().getWidth(), page.getClientSize().getHeight());

            // 設置模板的圖形透明度
            template.getGraphics().setTransparency(0.2f); // 20% 透明度

            // 計算圖片水印的位置和大小
            float imgWidth = image.getWidth() * 0.5f; // 圖片寬度縮放為原始的50%
            float imgHeight = image.getHeight() * 0.5f; // 圖片高度縮放為原始的50%
            
            // 將水印放置在頁面中心
            float x = (page.getClientSize().getWidth() - imgWidth) / 2;
            float y = (page.getClientSize().getHeight() - imgHeight) / 2;

            // 繪製圖片水印到模板
            template.getGraphics().drawImage(image, x, y, imgWidth, imgHeight);

            // 創建一個矩形,覆蓋整個頁面,用於放置水印
            Rectangle2D loRect = new Rectangle2D.Float();
            loRect.setFrame(new Point2D.Float(0, 0), page.getClientSize());

            // 創建水印註釋
            PdfWatermarkAnnotation watermarkAnnotation = new PdfWatermarkAnnotation(loRect);
            PdfAppearance appearance = new PdfAppearance(watermarkAnnotation);
            appearance.setNormal(template); // 將繪製了水印的模板設為水印註釋的正常外觀
            watermarkAnnotation.setAppearance(appearance);

            // 將水印註釋添加到當前頁面的註釋集合中
            page.getAnnotationsWidget().add(watermarkAnnotation);
        }

        // 4. 保存帶有水印的PDF文檔
        doc.saveToFile("output_image_watermark.pdf");
        doc.close();
        System.out.println("圖片水印添加成功!文件已保存為 output_image_watermark.pdf");
    }
}

總結

通過本文的詳細教程,您已經掌握瞭如何使用 Spire.PDF for Java 庫為 PDF 文檔添加文本水印圖片水印的關鍵技術。我們深入探討了 Spire.PDF for Java 的優勢、依賴配置,並提供了清晰、可操作的代碼示例,涵蓋了水印內容設置、樣式調整、透明度控制以及頁面應用等核心環節。

Spire.PDF for Java 憑藉其強大的功能和靈活的 API 設計,使得在 Java 應用程序中實現專業的 PDF 水印功能變得異常簡單和高效。無論是為了保護企業機密、確保版權所有,還是提升文檔的專業形象,掌握這一技術都將為您的項目帶來顯著價值。

現在,您可以將這些知識和代碼應用於您的實際項目中,提升文檔的安全性和管理水平。希望本文能為您在 Java PDF 處理領域提供有益的參考和幫助!

user avatar mokeywie 頭像 u_16213560 頭像 mysteryjack 頭像 onekbitdaohang 頭像
4 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.