如何在 Java 中為 PDF 添加條碼 - 完整 2025 指南與 GroupDocs.Signature

介紹

是否曾需要為數百份 PDF 自動化文件簽署,卻發現手動簽名根本無法擴展?你並不孤單。許多開發者都面臨以程式方式保護文件,同時保留驗證功能的挑戰。如何添加條碼 簽名完美解決此問題:它們可機器讀取、防篡改,且能無縫整合到自動化工作流程中。無論你是在構建發票系統、合約管理平台,或是文件追蹤解決方案,在 Java 中為 PDF 添加條碼都能同時提供安全性與自動化。

在本指南中,你將學會如何使用 GroupDocs.Signature for Java 為 PDF 文件添加條碼簽名——這是一個能為你處理繁重工作負載的強大函式庫。我們將涵蓋從基本設定到上線最佳實踐的全部內容,並包括常見問題的排除方法。

你將掌握的內容

  • 在 Java 專案中設定 GroupDocs.Signature(Maven、Gradle 或手動下載)
  • 只需幾行程式碼即可為 PDF 添加條碼簽名
  • 為你的使用情境選擇合適的條碼類型
  • 處理常見實作挑戰
  • 為大規模文件處理優化效能

讓我們一步步走過整個流程,讓你能安全且高效地簽署 PDF。

快速解答

  • 哪個函式庫可以在 Java 中為 PDF 添加條碼? GroupDocs.Signature for Java。
  • 基本條碼需要多少行程式碼? 在初始化 Signature 物件後,只需兩行程式碼。
  • 哪種條碼類型適用於字母與數字混合資料? Code128 是最通用的。
  • 我可以一次批次處理 100 多份 PDF 嗎? 可以——重複使用 Signature 實例並排隊處理。
  • 生產環境需要付費授權嗎? 生產使用需永久授權;提供免費試用供評估。

如何在 Java 中為 PDF 添加條碼

為 PDF 添加條碼是一個三步驟的流程:初始化文件、設定條碼、並儲存簽署後的檔案。使用 new Signature("input.pdf") 載入 PDF,設定條碼文字與類型、定位於頁面,最後呼叫 sign(outputPath)。此模式適用於 GroupDocs.Signature 支援的任何條碼格式。

前置條件

在深入程式碼之前,請先確保以下基礎已就緒:

您需要的內容

必備函式庫與工具

  • GroupDocs.Signature for Java(版本 23.12 或更新)— 支援 50+ 輸入與輸出格式,包括 PDF、DOCX、XLSX、PPTX、HTML 以及常見影像類型。
  • JDK 8 或更新版本
  • IntelliJ IDEAEclipse 等 IDE(任何文字編輯器皆可)
  • 基本的 Java 知識(類別、方法與物件導向基礎)

系統需求

  • 最低 2 GB 記憶體(大型 PDF 建議 4 GB)
  • 約 50 MB 磁碟空間供函式庫及其相依套件使用

環境設定需求

你的開發環境應支援 Java 應用程式。大多數現代系統都能輕鬆處理,但仍請確認以下項目:

  1. 檢查 JDK 版本 – 執行 java -version;需要 Java 8 或更新版本。
  2. 建置工具 – Maven 或 Gradle(我們將同時示範兩種設定方式)。
  3. PDF 範例 – 準備一個測試用 PDF,以便嘗試程式碼範例。

全部準備好了嗎?太好了——讓我們開始設定函式庫。

如何設定 GroupDocs.Signature for Java?

設定 GroupDocs.Signature 非常簡單:將函式庫加入建置系統、取得授權,並初始化核心 Signature 類別。整個流程通常不到一分鐘,讓你立即開始簽署 PDF,無論是使用 Maven、Gradle,或是手動下載 JAR。

將函式庫載入專案的三種方法如下,完成後即可開始簽署 PDF。

GroupDocs.Signature 可透過 Maven、Gradle 或手動下載 JAR 方式加入。三種方式皆會拉取相同的核心二進位檔,你可以依 CI/CD 流程選擇最合適的方式。函式庫的 Maven 坐標為 com.groupdocs:groupdocs-signature:23.12。使用 Maven 可自動取得最新相容的修補版。

選項 1:Maven 設定

如果你使用 Maven,請在 pom.xml 中加入以下相依性:

<dependency>
    <groupId>com.groupdocs</groupId>
    <artifactId>groupdocs-signature</artifactId>
    <version>23.12</version>
</dependency>

Maven 會在建置專案時自動下載函式庫及其相依套件。這是大多數 Java 開發者最簡便的方式。

選項 2:Gradle 設定

對於 Gradle 使用者,請在 build.gradle 中加入以下行:

implementation 'com.groupdocs:groupdocs-signature:23.12'

Gradle 會負責相依性解析,讓你的專案保持最新且易於管理。

選項 3:手動下載

想要手動控制?直接從 GroupDocs.Signature releases 下載 JAR,並將其加入專案的 classpath。此方式適合無法連網的環境或需要特定版本控制的情況。

取得授權

GroupDocs.Signature 提供彈性的授權選項:

  • 免費試用 – 完美用於測試功能與評估函式庫,無需信用卡。
  • 臨時授權 – 需要更長時間?可申請臨時授權,在試用期間取得完整功能。
  • 購買授權 – 準備上線?取得永久授權,即可無限制使用。

專業提示:先使用免費試用,確定函式庫符合需求後再考慮購買。

基本初始化(您的第一行程式碼)

Signature 類別是 GroupDocs.Signature 的核心類別,代表要簽署的文件。安裝套件後,需要匯入相應的命名空間,然後以檔案路徑建立 Signature 物件。

Signature signature = new Signature("YOUR_DOCUMENT_DIRECTORY/sample.pdf");

這裡發生了什麼? Signature 物件會將 PDF 載入記憶體,並為你執行的任何簽署操作做好準備。請將 "YOUR_DOCUMENT_DIRECTORY/sample.pdf" 替換為實際的 PDF 路徑,支援絕對與相對路徑。

步驟說明:為您的 PDF 添加條碼簽名

現在進入重點——將條碼簽名加入 PDF。這個過程出奇地簡單,但了解每一步有助於你依需求自行客製化。

完整實作說明

步驟 1:初始化 Signature 物件

首先,建立指向欲簽署 PDF 的 Signature 實例:

Signature signature = new Signature(filePath);

為什麼重要:此物件管理文件狀態,並提供所有簽署操作的介面。可將其視為以編輯模式開啟 PDF,等待你的修改。

步驟 2:設定條碼選項

接著,設定條碼簽名的選項。在此你可以定義條碼要包含的資料與編碼方式:

BarcodeSignOptions options = new BarcodeSignOptions("JohnSmith");
options.setEncodeType(BarcodeTypes.Code128);

BarcodeOptions 類別定義了條碼簽名的視覺與資料屬性,例如文字、類型、尺寸與顏色。

拆解說明

  • "JohnSmith" 為條碼中編碼的文字。這可以是姓名、ID、交易代碼或任何你需要嵌入的字串。
  • setEncodeType(BarcodeTypes.Code128) 指定條碼格式。Code128 多功能,支援字母、數字與特殊字元,適合大多數商業應用。

實務範例:若你在簽署發票,可能會使用 "INV-" + invoiceNumber 產生每份文件唯一且可掃描的識別碼。

步驟 3:設定條碼位置

現在決定條碼在 PDF 上的顯示位置:

options.setLeft(100); // X-coordinate (pixels from left edge)
options.setTop(100);  // Y-coordinate (pixels from top edge)

定位說明

  • 座標以頁面左上角 (0,0) 為原點。
  • setLeft(100) 使條碼向右移動 100 像素。
  • setTop(100) 使條碼向下移動 100 像素。

專業建議:在正式文件中,建議將條碼放置於固定位置——如右下角或頁首區域,既方便掃描,又不會干擾主要內容。

步驟 4:簽署文件

最後,套用簽名並儲存結果:

signature.sign(outputFilePath, options);

背後發生的事:GroupDocs.Signature 會將條碼以向量圖形嵌入 PDF,確保在任何縮放比例下都能保持清晰。原始文件保持不變,你會得到一個全新的已簽署版本。

重要提醒outputFilePath 必須與輸入檔案不同。直接覆寫開啟中的原始 PDF 可能導致錯誤。

完整範例程式

以下是將上述步驟整合於單一方法的完整範例:

public void signPdfWithBarcode(String inputPath, String outputPath) {
    // Initialize signature object
    Signature signature = new Signature(inputPath);
    
    // Configure barcode options
    BarcodeSignOptions options = new BarcodeSignOptions("JohnSmith");
    options.setEncodeType(BarcodeTypes.Code128);
    options.setLeft(100);
    options.setTop(100);
    
    // Sign and save
    signature.sign(outputPath, options);
}

你可以在任何需要簽署 PDF 的時候呼叫此方法——簡潔、可重用且適合上線使用。

為您的需求選擇合適的條碼類型

並非所有條碼皆適用於每種情境。GroupDocs.Signature 支援多種條碼格式,選擇正確的類型取決於你要編碼的資料與掃描設備。

常見條碼類型說明

Code128(上述範例)

  • 最佳用途:字母與數字混合資料、一般商業使用
  • 容量:最多 128 個字元
  • 使用原因:大多數掃描器皆支援,能處理產品代碼或 ID 等複雜資料
  • 避免情境:若僅需數字,可考慮 Code39,較為簡單

Code39

  • 最佳用途:純數字資料、簡易追蹤系統
  • 容量:較 Code128 少
  • 使用原因:僅編碼數字時實作更簡單
  • 避免情境:需要字母或特殊字元時不適用

QR Code(替代方案)

  • 最佳用途:大量資料、URL 編碼、手機掃描
  • 容量:最高可達 3 KB 資料
  • 使用原因:智慧型手機可直接掃描,無需專用設備
  • 避免情境:若需傳統條碼掃描器相容性則不建議使用

如何切換條碼類型

想改用 Code39 嗎?只需要更改一行程式碼:

options.setEncodeType(BarcodeTypes.Code39);

其餘程式碼保持不變。這種彈性讓你能快速測試,找出最適合掃描硬體與資料需求的格式。

決策指引

  • 編碼姓名或混合資料? → Code128
  • 只需數字? → Code39
  • 需要手機掃描? → 考慮 QR Code(GroupDocs 亦支援)
  • 符合國際標準? → 依行業慣例選擇相應格式

真實案例:何時在 PDF 中添加條碼

了解 何時 使用條碼簽名,有助於你有效運用此技術。以下是開發者常見的實作情境:

1. 自動化合約簽署工作流程

問題:法務部門每月處理數百份合約,手動簽署造成瓶頸。
解決方案:在合約中加入條碼簽名,編碼合約 ID、日期與簽署人資訊。文件管理系統可透過掃描條碼自動驗證合約,完全不需人工介入。
為什麼可行:條碼具防篡改特性,若 PDF 被修改,條碼關聯會失效,偽造行為一目了然。

2. 發票追蹤與驗證

問題:會計團隊需要快速比對實體發票與數位紀錄。
解決方案:在發票中嵌入條碼,內含發票號碼與供應商 ID。收到發票時,只要掃描條碼即可即時呼叫對應的資料庫條目。
額外好處:減少手動輸入錯誤,提升發票處理效率。

3. 文件真偽證明

問題:教育機構、政府單位與認證機構需要可驗證的文件真偽證明。
解決方案:產生唯一的條碼識別碼,連結至驗證資料庫。任何人只要掃描條碼,即可確認文件的合法性。
實務範例:許多大學已採用此方式發放數位畢業證書,讓雇主能即時驗證學歷。

4. 製造與供應鏈文件

問題:需要在供應鏈各階段追蹤產地證明、品質報告與出貨文件。
解決方案:條碼簽署的 PDF 內編碼批號、時間戳記與品質檢驗點。供應鏈每個環節的掃描器可自動驗證文件真偽,提升流程自動化。

整合可能性

這些條碼簽署的 PDF 可無縫結合以下系統:

  • 文件管理系統(SharePoint、Alfresco)
  • 企業資源規劃(ERP)平台
  • 客戶關係管理(CRM)工具
  • 自動化工作流引擎

關鍵優勢在於:條碼橋接了數位系統與實體文件的差距,使自動化流程更可靠。

常見問題與解決方法

即使是最簡單的實作,有時也會遇到障礙。以下列出開發者最常碰到的問題與對應解決方案。

問題 1:「找不到檔案」或路徑錯誤

徵兆:程式拋出 FileNotFoundException 或類似錯誤。

常見原因

  • 在不同目錄執行時相對路徑失效
  • 檔案路徑拼寫錯誤
  • 權限不足導致無法存取

解決方案

// Use absolute paths for reliability
String absolutePath = new File("sample.pdf").getAbsolutePath();

// Or verify the file exists before processing
File pdfFile = new File(filePath);
if (!pdfFile.exists()) {
    throw new IllegalArgumentException("PDF not found at: " + filePath);
}

專業提示:開發階段可印出實際路徑以確認:System.out.println("Processing: " + absolutePath);

問題 2:條碼顯示過小或被截斷

徵兆:條碼雖然出現,但難以辨識或部分被裁切。

原因:預設尺寸未考慮不同 PDF 頁面大小或 DPI 設定。

解決方案

// Adjust barcode dimensions
options.setWidth(200);  // Width in pixels
options.setHeight(50);  // Height in pixels

// Ensure positioning keeps it on the page
options.setLeft(50);    // Leave margin from edges
options.setTop(50);

測試建議:產生測試 PDF 後,用實體掃描器驗證條碼可否順利掃描;若無法,請增大尺寸。

問題 3:大型 PDF 記憶體問題

徵兆:出現 OutOfMemoryError 或處理大型文件時效能緩慢。

原因:函式庫會將 PDF 載入記憶體處理,若檔案過大(50 MB 以上)會超出 JVM 預設記憶體。

解決方案

// Increase JVM heap size when running your application
// Add to your JVM arguments: -Xmx2G

// In code, dispose of objects when done
try (Signature signature = new Signature(filePath)) {
    signature.sign(outputPath, options);
} // Auto-closes and releases memory

替代方案:若一次處理多個檔案,建議分批處理,而非一次全部載入。

問題 4:條碼編碼遇到特殊字元失敗

徵兆:在編碼含特殊字元或表情符號的文字時拋出例外。

根本原因:所選條碼類型(如 Code128)不支援全部 Unicode 字元。

解決方案

// Sanitize input before encoding
String safeText = input.replaceAll("[^A-Za-z0-9]", "");
options.setText(safeText);

// Or switch to a format that supports more characters
// (though this may reduce scanner compatibility)

最佳實踐:為確保與條碼掃描器相容,盡量使用英數字元。

問題 5:簽署後的 PDF 無法開啟或顯示損毀

徵兆:輸出 PDF 在檢視器中顯示損毀或根本無法開啟。

可能原因

  • 輸入與輸出使用同一檔案路徑
  • 磁碟空間不足
  • 程式提前終止導致寫入不完整

解決方案

// Always write to a different file
String outputPath = inputPath.replace(".pdf", "_signed.pdf");

// Verify the write completed successfully
File output = new File(outputPath);
if (output.length() == 0) {
    throw new IOException("Output PDF is empty - signing failed");
}

除錯步驟:先確認原始 PDF 能正常開啟;若已損毀,簽署程序無法修復。

生產環境最佳實踐

從開發階段過渡到上線,需要關注一些看似微小卻能避免未來頭痛的細節。

安全性考量

1. 保護授權檔案
不要在程式碼中硬編授權金鑰。建議使用環境變數或安全的設定管理機制:

// Good: Load from environment
String licenseKey = System.getenv("GROUPDOCS_LICENSE");

// Bad: Hardcoded (never do this)
// String licenseKey = "ABC123...";

2. 驗證輸入檔案
對使用者上傳的 PDF 必須先行驗證:

public boolean isValidPdf(String filePath) {
    try {
        // Attempt to open the file
        Signature signature = new Signature(filePath);
        signature.dispose();
        return true;
    } catch (Exception e) {
        // File is corrupted or not a valid PDF
        return false;
    }
}

3. 清理條碼資料
若條碼內容來源於使用者輸入,務必進行清理,以防注入攻擊或編碼問題:

String sanitizedText = userInput
    .replaceAll("[^A-Za-z0-9\\s-]", "")  // Allow only safe characters
    .trim()
    .substring(0, Math.min(50, userInput.length()));  // Limit length

效能最佳化技巧

1. 盡可能重複使用 Signature 物件
建立 Signature 實例的成本較高。在批次處理時可重複使用:

// Good for batch processing
try (Signature signature = new Signature(templatePath)) {
    for (String dataItem : dataList) {
        BarcodeSignOptions options = new BarcodeSignOptions(dataItem);
        signature.sign(getOutputPath(dataItem), options);
    }
}

2. 監控記憶體使用情形
高流量應用建議加入記憶體監控:

Runtime runtime = Runtime.getRuntime();
long usedMemory = runtime.totalMemory() - runtime.freeMemory();
System.out.println("Memory used: " + (usedMemory / 1024 / 1024) + " MB");

若記憶體持續上升,可能存在未釋放的物件,需檢查是否有記憶體洩漏。

3. 最佳化檔案 I/O
大量文件處理時,建議批次執行檔案操作:

// Process files in chunks of 100 to avoid overwhelming the system
List<String> files = getAllPdfFiles();
int batchSize = 100;

for (int i = 0; i < files.size(); i += batchSize) {
    List<String> batch = files.subList(i, Math.min(i + batchSize, files.size()));
    processBatch(batch);
    System.gc(); // Suggest garbage collection between batches
}

日誌與錯誤處理

在上線環境加入完整日誌,方便問題追蹤:

import java.util.logging.*;

public class PdfSigner {
    private static final Logger logger = Logger.getLogger(PdfSigner.class.getName());
    
    public void signDocument(String input, String output) {
        try {
            logger.info("Starting signature process for: " + input);
            Signature signature = new Signature(input);
            
            // Your signing logic here
            
            logger.info("Successfully signed: " + output);
        } catch (Exception e) {
            logger.severe("Failed to sign document: " + e.getMessage());
            throw new RuntimeException("Signing failed", e);
        }
    }
}

為什麼重要:當系統在生產環境發生故障(這是必然的),詳細的日誌能讓你快速定位問題,而不必依賴原始環境。

測試策略

上線前請覆蓋以下測試情境:

  1. 邊界案例 – 空字串、最大長度文字、特殊字元
  2. 不同 PDF 類型 – 掃描文件、文字型 PDF、加密 PDF
  3. 同時使用 – 多執行緒同時簽署文件
  4. 錯誤復原 – 磁碟空間耗盡或檔案被鎖定時的行為

自動化測試範例

@Test
public void testBarcodeSigningWithEmptyText() {
    assertThrows(IllegalArgumentException.class, () -> {
        BarcodeSignOptions options = new BarcodeSignOptions("");
        // Should fail gracefully, not crash
    });
}

效能:實務使用預期

了解效能特性有助於設定合理的系統容量與規劃。

常見處理時間

根據在標準硬體(Intel i5、8 GB RAM)上的測試結果:

  • 單一 PDF(<5 MB):每個條碼約 500‑800 ms
  • 大型 PDF(20‑50 MB):每個條碼約 2‑4 秒
  • 批次處理(100 份文件):總計約 60‑90 秒

影響速度的因素

  • PDF 複雜度(圖片/字型越多處理越慢)
  • 條碼尺寸與編碼複雜度
  • 磁碟 I/O(SSD 明顯較快)
  • 可用記憶體(更多記憶體可減少換頁)

記憶體管理技巧

Java 的垃圾回收器會自動回收大部分記憶體,但仍建議遵循以下做法:

// Use try-with-resources for automatic cleanup
try (Signature signature = new Signature(filePath)) {
    signature.sign(outputPath, options);
} // Automatically disposes resources

長時間執行的應用:持續監控堆疊使用情形

  • 若堆疊持續增長,表示可能有物件未被釋放
  • 使用 VisualVM 等工具分析記憶體洩漏
  • 考慮在處理佇列時實作斷路器模式(circuit‑breaker)

可擴充性考量

若每日需處理上千份文件,建議採取以下策略:

  1. 佇列機制 – 使用 RabbitMQ、Kafka 等訊息佇列管理工作負載
  2. 水平擴充 – 部署多個簽署服務實例
  3. 快取設定 – 快取常用配置以減少初始化開銷
  4. 監控指標 – 追蹤處理時間、錯誤率與資源使用率

範例擴充架構

[Upload Service] → [Queue] → [Multiple Signing Workers] → [Storage]

每個簽署工作者獨立運作,根據需求彈性擴增。

接下來?擴展文件簽署功能

你已掌握條碼簽名的全部技巧,接下來可以探索更豐富的簽名類型、整合驗證服務,並自動化跨文件格式與企業系統的端到端工作流程。

考慮加入 QR Code 條碼以支援手機掃描、使用數位憑證達成具法律效力的電子簽章、以及使用影像簽名保持品牌一致性。將這些與條碼簽名結合,可提供機器可讀與人類可讀的多層安全驗證。

資源

結論

現在你已掌握在 Java 中為 PDF 添加條碼簽名的全部要點。以下重點回顧:

  • 設定 – 透過 Maven、Gradle 或手動下載安裝 GroupDocs.Signature。
  • 實作 – 初始化 Signature、設定 BarcodeOptions、定位條碼,最後儲存簽署檔案。
  • 條碼選擇 – Code128 適用於字母與數字混合,Code39 只需數字,QR Code 則適合手機掃描。
  • 除錯 – 處理路徑錯誤、尺寸問題、記憶體限制與編碼限制。
  • 上線準備 – 保護授權、驗證輸入、監控記憶體、完整日誌。

為什麼重要:條碼簽名將手動文件工作流程轉變為自動、可驗證的流程。無論是處理發票、管理合約,或追蹤供應鏈文件,此方法皆能輕鬆擴展,同時維持安全性。

下一步

  1. 下載 GroupDocs.Signature 並建立測試專案。
  2. 使用提供的範例在自己的 PDF 上執行。
  3. 嘗試不同條碼類型,找出最適合你的工作流程。
  4. 探索進階功能,如 QR Code、數位憑證與驗證 API。

準備好在專案中實作了嗎?先從免費試用開始,驗證你的使用情境,之後再升級永久授權。大多數團隊在自動化後的數週內即可看到明顯的投資回報。


最後更新: 2026-06-06
測試環境: GroupDocs.Signature 23.12 for Java
作者: GroupDocs

QrCodeSignOptions qrOptions = new QrCodeSignOptions("https://yourcompany.com/verify/doc123");
qrOptions.setEncodeType(QRCodeTypes.QR);
// Uses PKI certificates for cryptographic verification
DigitalSignOptions digitalOptions = new DigitalSignOptions("certificate.pfx");
ImageSignOptions imageOptions = new ImageSignOptions("signature.png");
VerificationResult result = signature.verify(verifyOptions);
if (result.isValid()) {
    System.out.println("Signature verified successfully");
}
// Sign with both barcode and image
signature.sign(outputPath, barcodeOptions, imageOptions);

相關教學