如何在 Java 中取代 PDF 文字

在本完整指南中,您將學習如何使用 GroupDocs.Annotation for Java 取代 PDF 文字,同時保持低記憶體使用量並加入協作評論串。無論您是要現代化舊有文件工作流程,或是打造全新審閱平台,以下步驟皆提供可投入生產環境的程式碼與可擴展的最佳實踐技巧。

快速解答

  • 在 Java 中,哪個函式庫最適合 PDF 文字取代? GroupDocs.Annotation.
  • 我可以取代掃描的 PDF 文字嗎? 只能在 OCR 之後;此函式庫適用於可搜尋的 PDF。
  • 如何避免記憶體洩漏? 釋放 Annotator 實例並使用絕對路徑。
  • 生產環境是否需要授權? 是——商業授權會移除浮水印。
  • 是否可以為取代建議加入回覆? 當然可以,透過 Reply 模型。

為何在 Java 應用程式中需要 PDF 文字取代

載入目標 PDF,疊加取代建議,讓審閱者接受或拒絕——此整個流程在一般 10 頁合約下可於一秒內完成。GroupDocs.Annotation 支援 50 多種輸入與輸出格式,且能處理 數百頁的 PDF 而不需將整個檔案載入記憶體,十分適合企業級文件管線。

什麼是 PDF 文字取代?

PDF text replacement 是一種註解,視覺上建議變更,同時在建議被接受前保持底層 PDF 內容不變。它的運作類似文字處理器的「變更追蹤」,保留誰在何時、以何種原因提出何種變更的稽核紀錄,這對合規審查與協作編輯至關重要。

前置條件

  • JDK 8 或更新版本(相容於 JDK 21)
  • Maven 或 Gradle 用於相依管理
  • GroupDocs.Annotation 25.2(或更新版本)
  • 具備 Java 例外處理與檔案 I/O 的基本知識

可選但有幫助的項目: 如 IntelliJ IDEA 等 IDE,以及測試用的範例 PDF。

將 GroupDocs.Annotation 加入您的專案

Maven 設定(最常見方式)

將儲存庫與相依項目加入您的 pom.xml。遺漏儲存庫區塊是常見的「找不到 artifact」錯誤來源,請務必如範例般完整複製程式碼段。

<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>

處理授權問題

GroupDocs 提供三種授權層級:

  1. 免費試用 – 從 GroupDocs releases 頁面下載。每個輸出檔案皆會出現浮水印。
  2. 暫時授權 – 適合延長評估;可於 GroupDocs Purchase 入口取得。
  3. 完整商業授權 – 移除浮水印並解鎖無限制部署。可於 GroupDocs website 購買。

專業提示: 在應用程式啟動時載入授權檔案一次,以避免重複的 I/O 開銷。

建置您的第一個文字取代功能

了解文字取代註解

TextReplacementAnnotation 是 GroupDocs.Annotation 用於建議編輯的核心類別。它儲存原始文字位置、取代字串以及可選的樣式資訊。由於原始 PDF 保持不變,您隨時可以還原或稽核變更。

步驟式實作

我們將逐步說明每個階段,強調其重要性,並嵌入 java pdf memory management 的最佳實踐。

步驟 1:建立基礎

首先,建立指向來源 PDF 並定義輸出位置的 Annotator 實例。使用絕對路徑可防止程式在伺服器上執行時出現「找不到檔案」錯誤。

import com.groupdocs.annotation.Annotator;
import java.util.Calendar;

public class AddTextReplacementAnnotationFeature {
    public static void main(String[] args) {
        String outputPath = "YOUR_OUTPUT_DIRECTORY/AddTextReplacementAnnotation.pdf";
        final Annotator annotator = new Annotator("YOUR_DOCUMENT_DIRECTORY/input.pdf");

定義說明: Annotator 類別是 GroupDocs.Annotation 所有註解操作的入口,負責 PDF 載入、修改與儲存。

步驟 2:建立具回覆功能的協作特性

回覆讓審閱者能直接在 PDF 上討論建議。每則回覆會記錄作者、時間戳記與評論文字,形成完整的討論串。

import com.groupdocs.annotation.models.Reply;
import java.util.ArrayList;
import java.util.List;

// Create replies for collaborative feedback
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());

List<Reply> replies = new ArrayList<>();
replies.add(reply1);
replies.add(reply2);

定義說明: Reply 模型代表附加於註解的單一評論,支援串狀討論與稽核紀錄。

步驟 3:定義目標區域

精確定位註解需要指定頁碼與矩形座標。請記得 PDF 座標系統的原點在 左下角。

import com.groupdocs.annotation.models.Point;
import java.util.List;

// Define the bounding box for your annotation
Point point1 = new Point(80, 730);   // Top-left
Point point2 = new Point(240, 730);  // Top-right  
Point point3 = new Point(80, 650);   // Bottom-left
Point point4 = new Point(240, 650);  // Bottom-right

List<Point> points = new ArrayList<>();
points.add(point1);
points.add(point2);
points.add(point3);
points.add(point4);

定義說明: 矩形 (Rectangle) 使用 PDF 座標系統定義註解在頁面上的視覺範圍。

步驟 4:建立核心 – 取代註解

現在實例化 TextReplacementAnnotation,設定取代文字、樣式,並附加先前建立的回覆。

import com.groupdocs.annotation.models.annotationmodels.ReplacementAnnotation;

// Configure your replacement annotation
ReplacementAnnotation replacement = new ReplacementAnnotation();
replacement.setCreatedOn(Calendar.getInstance().getTime());
replacement.setFontColor(65535); // Yellow highlight - easy to spot
replacement.setFontSize(8.0);
replacement.setMessage("This is a replacement annotation");
replacement.setOpacity(0.7); // Semi-transparent so original text shows through
replacement.setPageNumber(0); // First page (zero-indexed)
replacement.setPoints(points);
replacement.setReplies(replies);
replacement.setTextToReplace("replaced text");

// Add the annotation and save
annotator.add(replacement);
annotator.save(outputPath);
annotator.dispose(); // Critical for memory management!

定義說明: TextReplacementAnnotation 在 PDF 上疊加建議的文字變更,直到您接受前不會修改底層內容。

效能提示: 在完成每個文件的處理後呼叫 annotator.dispose()。若未釋放會使 PDF 檔案在記憶體中保持鎖定,長時間服務可能導致 OutOfMemoryError。

常見問題與解決方法

檔案路徑問題

Problem: 「找不到檔案」即使檔案確實存在。
Solution: 使用 Path.toAbsolutePath() 解析路徑,並避免在 Windows 上混用正斜線與反斜線。

大型 PDF 的記憶體問題

Problem: 處理 200 頁合約時發生 OutOfMemoryError。
Solution: 分批處理文件、增加 JVM 堆積 (-Xmx4g),並始終釋放 Annotator 物件。

註解定位問題

Problem: 註解出現偏移或超出頁面。
Solution: 使用能顯示座標的 PDF 檢視器,或編寫小工具列印頁面大小與矩形值以驗證。

授權問題

Problem: 出現意外的浮水印或 LicenseException。
Solution: 確認授權檔案位於 classpath 且在任何 Annotator 建立前已載入。請記得試用版每份文件僅限 5 頁。

真實世界中實際重要的應用

文件審閱流程

法律團隊可建議條款變更,系統會記錄每項建議的提出者與時間,滿足合規稽核需求。

內容管理整合

當產品規格變更時,自動執行工作以更新目錄中所有價格清單 PDF,並通知下游系統。

協作編輯平台

打造類似 Google Docs 的 PDF 介面,讓多位使用者同時建議編輯;回覆功能即成為討論串。

合規與法規更新

掃描儲存庫中過時的法規用語,產生取代建議,讓合規人員批次批准。

效能最佳化策略

記憶體管理最佳實踐

  • 在每個檔案處理完畢後釋放 Annotator。
  • 使用串流 API 讀寫大型 PDF。
  • 使用 JMX 或 VisualVM 監控堆積使用情況。

高量能擴充

  • 使用具有限制執行緒池的 executor service 以平行處理檔案。
  • 將 PDF 存於分散式檔案系統(如 AWS S3),直接串流至 Annotator。
  • 將常存取的文件快取於唯讀記憶體映射檔,以降低 I/O 延遲。

監控與除錯

  • 記錄每個階段(load、annotate、save)所花費的時間。
  • 捕捉例外與堆疊追蹤,並加入 PDF 名稱以便除錯。
  • 設定記憶體使用超過分配堆積 80% 時的警示。

常見問答

Q: 我可以在掃描的 PDF 中取代文字嗎?
A: 不能直接取代——掃描的 PDF 只包含影像,沒有可搜尋的文字。請先執行 OCR,然後對 OCR 產生的文字層套用文字取代。

Q: 如何處理特殊字元或 Unicode 文字?
A: GroupDocs.Annotation 完全支援 Unicode。確保來源檔案使用 UTF‑8 編碼,並以 Java String 物件傳遞取代字串。

Q: 同時取代的文字量有上限嗎?
A: 沒有硬性上限,但大量取代會影響效能。請將龐大更新分割為較小批次以提升順暢度。

Q: 我可以程式化接受或拒絕取代建議嗎?
A: 可以——遍歷註解,呼叫 accept() 永久套用變更,或 remove() 丟棄它。

Q: 若嘗試取代不存在的文字會發生什麼?
A: 註解仍會被建立,但因找不到匹配文字而保持不可見。請在建立註解前驗證目標字串,以避免靜默失敗。

Q: 如何處理同時存取同一個 PDF 的情況?
A: Annotator 對單一文件並非執行緒安全。請使用檔案鎖或排程機制將存取序列化。

Q: 我可以自訂取代註解的外觀嗎?
A: 當然可以。您可透過註解的樣式屬性設定字型大小、顏色、不透明度與邊框樣式。

Q: 這能用於受密碼保護的 PDF 嗎?
A: 能——在初始化 Annotator 時提供密碼,API 會在記憶體中解密文件後再套用註解。

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

相關教學