如何在 Java 中使用條碼和 QR 代碼為檔案添加數位簽章

介紹

有沒有想過如何使用 digital signature java 來證明檔案未被竄改?或是需要一種以程式方式驗證文件而不必設定複雜加密機制的方法?傳統的數位簽章對某些使用情境來說可能過於繁重。有時只需要一種輕量、可掃描的方式來驗證檔案完整性——尤其在處理壓縮檔、備份或自動化工作流程時。條碼與 QR 代碼簽章正是此時的解決方案。

在本教學中,你將學會如何使用 GroupDocs.Signature 在 Java 中實作數位簽章。我們將重點放在簽署 TAR 壓縮檔(非常適合備份系統與軟體發佈),但這些技巧同樣適用於其他文件格式。無論你是在建構文件管理系統,或只是想為檔案增加額外的安全層,都能在此找到答案。

你將學到的內容:

  • 在 Java 中使用條碼與 QR 代碼簽章的完整實作
  • 何時使用哪種簽章類型(以及背後的原因)
  • 常見簽署挑戰的實務解決方案
  • 可直接套用的真實整合模式
  • 針對生產環境的效能最佳化建議

讓我們立即開始——不需要密碼學學位。

快速答覆

  • 哪個程式庫處理 Java 中的條碼簽章? GroupDocs.Signature for Java。
  • 哪種簽章類型能儲存更多資料? QR 代碼(最多 4,296 個英數字元)。
  • 可以簽署大於 100 MB 的 TAR 檔嗎? 可以——使用背景執行緒並增加 JVM 堆積。
  • 需要網路連線嗎? 不需要,程式庫完全離線運作。
  • 生產環境需要授權嗎? 需要,有效的 GroupDocs.Signature 授權是必須的。

什麼是 Digital Signature Java?

digital signature java 是將可驗證的視覺標記(例如條碼或 QR 代碼)直接嵌入由 Java 產生的檔案中,以證明其真實性與完整性。透過附加這類視覺標記,開發者可以提供一種快速、供人類閱讀的方式來確認檔案自簽署以來未被更改,同時仍能透過 GroupDocs.Signature API 進行程式化驗證。

為什麼使用條碼或 QR 代碼簽章?

GroupDocs.Signature 支援 50+ 輸入與輸出格式(包括 PDF、DOCX、XLSX、HTML、PNG 與 TAR),且可在不將整個檔案載入記憶體的情況下處理上百頁文件。條碼與 QR 代碼提供可掃描、自治的真實性證明,讓許多內部工作流程不必依賴外部憑證機構。

前置條件

  • GroupDocs.Signature for Java Library – 版本 23.12 或更新
  • Java Development Kit (JDK) – 版本 8 以上
  • IDE – IntelliJ IDEA、Eclipse 或任何支援 Java 的編輯器
  • 基本的 Java 知識 – 需要熟悉類別與匯入

環境設定

將 GroupDocs.Signature 加入專案非常簡單。請依你的建置工具選擇以下方式:

Maven(將以下內容加入 pom.xml):

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

Gradle(將以下內容加入 build.gradle):

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

手動下載:不使用 Maven 或 Gradle?直接從 GroupDocs.Signature releases 下載 JAR,並加入 classpath。

授權取得

GroupDocs 提供彈性授權方案:

  • 免費試用:適合測試——不需要信用卡。 立即開始
  • 臨時授權:需要更長的評估時間? 申請臨時授權 以取得開發期間的完整功能
  • 正式授權:準備上線時,依需求 購買授權

其他有用連結

小技巧:先使用免費試用版快速驗證概念,若需要更長時間再換臨時授權。

設定 GroupDocs.Signature for Java

Signature 類別是所有簽署操作的入口點。它代表一個已載入記憶體的單一檔案,並提供新增、搜尋或刪除視覺簽章的方法。

建立指向 TAR 檔的 Signature 實例,即可將檔案載入記憶體以供處理:

import com.groupdocs.signature.Signature;

public class InitializeSignature {
    public static void main(String[] args) {
        Signature signature = new Signature("your-document-path");
        // Additional setup and usage here...
    }
}

重要:使用完畢後務必關閉 Signature 物件(或使用 try‑with‑resources),以避免大型檔案造成記憶體洩漏。

條碼與 QR 代碼簽章的選擇

還不確定要使用哪種簽章類型?以下是快速決策指南:

因素條碼 (Code128)QR 代碼
資料容量約 80 個字元最多 4,296 個英數字元
可讀性需要條碼掃描器手機相機即可
空間效率水平較緊湊需要正方形區域
適用情境簡單 ID、時間戳記、短碼URL、JSON、詳細中繼資料
錯誤更正最低內建(可從損壞中恢復)

經驗法則

  • 使用 條碼 來快速掃描的 ID 或時間戳記。
  • 需要嵌入較豐富資料或手機相容性時,使用 QR 代碼
  • 為了最大冗餘與稽核,可同時使用兩者。

實作指南

使用條碼簽署 TAR 壓縮檔

為什麼選擇條碼?

條碼對於 TAR 壓縮檔非常適合,因為其尺寸緊湊且易於掃描。你可以嵌入時間戳記、版本號、使用者 ID 或雜湊值,以便快速驗證。

步驟

1. 初始化 Signature
先為 TAR 檔建立 Signature 實例:

import com.groupdocs.signature.Signature;

final Signature signature = new Signature("path/to/your/archive.tar");

小技巧:對於超過 100 MB 的 TAR 檔,建議在背景執行緒中執行簽署,以免阻塞 UI。

2. 設定條碼選項
BarcodeSignature 類別負責條碼內容、類型與放置位置。BarcodeOptions 物件保存這些設定:

import com.groupdocs.signature.options.sign.BarcodeSignOptions;
import com.groupdocs.signature.domain.barcodes.BarcodeTypes;

BarcodeSignOptions bcOptions = new BarcodeSignOptions("12345678", BarcodeTypes.Code128);
bcOptions.setLeft(100);  // X position in pixels
bcOptions.setTop(100);   // Y position in pixels

BarcodeOptions 讓你指定條碼的視覺外觀與位置。
BarcodeTypes 為列舉,包含支援的條碼符號,例如 Code128Code39 等。

發生了什麼?

  • "12345678" 為條碼編碼的資料——請自行替換成實際的 ID、時間戳記或驗證碼。
  • BarcodeTypes.Code128 在資料容量與掃描可靠性之間取得平衡。
  • 位置值 (100, 100) 表示條碼距左上角 100 像素。

可能想調整的選項:

bcOptions.setWidth(200);        // Barcode width in pixels
bcOptions.setHeight(50);        // Barcode height in pixels
bcOptions.setForeColor(Color.BLACK);  // Barcode color
bcOptions.setBackgroundColor(Color.WHITE);  // Background color

3. 簽署並儲存文件
執行簽署操作並將結果寫入新檔案:

import com.groupdocs.signature.domain.SignResult;

String outputFilePath = "output/path/SignWithBarcode/archive_signed.tar";
SignResult signResult = signature.sign(outputFilePath, bcOptions);

回傳的 SignResult 物件會告知操作是否成功以及簽章放置位置。
常見陷阱:呼叫 sign() 前務必確保輸出目錄已存在,程式庫不會自動建立父目錄。

使用 QR 代碼簽署 TAR 壓縮檔

何時使用 QR 代碼

當需要儲存結構化資料(JSON、XML)、嵌入驗證 URL,或支援手機掃描時,QR 代碼表現最佳。

步驟

1. 初始化 Signature
同前,建立 Signature 實例:

final Signature signature = new Signature("path/to/your/archive.tar");

2. 設定 QR 代碼選項
設定欲嵌入的資料:

import com.groupdocs.signature.options.sign.QrCodeSignOptions;
import com.groupdocs.signature.domain.qrcodes.QrCodeTypes;

QrCodeSignOptions qrOptions = new QrCodeSignOptions("12345678", QrCodeTypes.QR);
qrOptions.setLeft(400);  // X position
qrOptions.setTop(400);   // Y position

QrCodeTypes 為列舉,指定要產生的 QR 代碼類型(標準 QR、DataMatrix、Aztec 等)。

實務範例 – 嵌入包含驗證資訊的 JSON:

String verificationData = "{\"version\":\"1.0\",\"timestamp\":\"2025-01-02T10:30:00Z\",\"user\":\"john.doe\"}";
QrCodeSignOptions qrOptions = new QrCodeSignOptions(verificationData, QrCodeTypes.QR);

QR 代碼類型選項:

  • QrCodeTypes.QR – 標準 QR 代碼(最常見)
  • QrCodeTypes.DataMatrix – 資料較少時更緊湊
  • QrCodeTypes.Aztec – 適合曲面

3. 簽署並儲存文件
與條碼相同的流程:

String outputFilePath = "output/path/SignWithQRCode/archive_signed.tar";
SignResult signResult = signature.sign(outputFilePath, qrOptions);

效能說明:QR 代碼產生因錯誤更正計算稍慢於條碼,但差異通常只有數毫秒,對大多數使用情境影響不大。

為 TAR 壓縮檔加入多重簽章

為什麼使用多重簽章?

  • 冗餘 – 若其中一個簽章受損,另一個仍可驗證。
  • 不同受眾 – 條碼供掃描器使用,QR 代碼供手機使用。
  • 分層資料 – 條碼提供快速 ID,QR 代碼提供詳細中繼資料。
  • 合規 – 某些法規要求多種驗證方式。

步驟

1. 初始化 Signature
同前:

final Signature signature = new Signature("path/to/your/archive.tar");

2. 設定多重選項
建立兩種簽章並放入清單:

import java.util.ArrayList;
import java.util.List;

// Set up barcode (reusing from earlier example)
BarcodeSignOptions bcOptions = new BarcodeSignOptions("12345678", BarcodeTypes.Code128);
bcOptions.setLeft(100);
bcOptions.setTop(100);

// Set up QR code (different position to avoid overlap)
QrCodeSignOptions qrOptions = new QrCodeSignOptions("12345678", QrCodeTypes.QR);
qrOptions.setLeft(400);
qrOptions.setTop(400);

// Combine them
List<com.groupdocs.signature.options.sign.SignOptions> listOptions = new ArrayList<>();
listOptions.add(bcOptions);
listOptions.add(qrOptions);

小技巧:將簽章放置於角落或不干擾的區域,以免影響 TAR 檔的其他內容。

3. 簽署並儲存文件
將選項清單傳入 sign() 方法:

String outputFilePath = "output/path/SignWithMultipleSignatures/archive_signed.tar";
SignResult signResult = signature.sign(outputFilePath, listOptions);

GroupDocs 會依序處理每個簽章,將其嵌入文件中。清單順序不會影響驗證結果。

真實案例

1. 軟體發佈流水線

情境:以 TAR 壓縮檔發佈軟體套件,需證明未被修改。
解決方案:使用 QR 代碼嵌入 JSON 負載簽署每個版本:

String releaseData = String.format(
    "{\"version\":\"%s\",\"buildDate\":\"%s\",\"sha256\":\"%s\"}",
    version, buildDate, checksum
);

為什麼可行:使用者可掃描 QR 代碼驗證套件完整性,無需管理 GPG 金鑰。

2. 自動化備份系統

情境:每日備份的 TAR 檔需要審計追蹤。
解決方案:在備份檔加入包含時間戳記與伺服器 ID 的條碼:

String backupId = String.format("SRV01-%s", LocalDateTime.now().format(formatter));
BarcodeSignOptions bcOptions = new BarcodeSignOptions(backupId, BarcodeTypes.Code128);

為什麼可行:不必開啟壓縮檔,即可快速目視驗證備份真偽。

3. 文件管理系統

情境:法律文件以壓縮檔保存,需要防篡改驗證。
解決方案:同時在同一檔案上加入條碼(快速掃描)與 QR 代碼(詳細中繼資料)。

4. 供應鏈追蹤

情境:跨組織傳遞檔案包,需要追蹤。
解決方案:嵌入指向驗證 API 的 QR 代碼:

String trackingUrl = "https://verify.yourcompany.com/track/" + uniqueId;
QrCodeSignOptions qrOptions = new QrCodeSignOptions(trackingUrl, QrCodeTypes.QR);

常見問題與解決方案

問題 1:「簽章未找到」於簽署後

症狀sign() 成功,但看不到簽章。
原因:放置位置錯誤、覆寫原檔、TAR 檢視器限制。
解決方式

// Always verify the signing succeeded
SignResult result = signature.sign(outputFilePath, bcOptions);
if (result.getSucceeded().size() > 0) {
    System.out.println("Signature added successfully at: " + outputFilePath);
} else {
    System.err.println("Signing failed: " + result.getFailed());
}

// Use absolute paths to avoid confusion
String absolutePath = new File(outputFilePath).getAbsolutePath();

問題 2:大型 TAR 檔產生 OutOfMemoryError

症狀:超過 500 MB 的檔案導致 JVM 當機。
解決方式:增加堆積大小 (-Xmx) 並及時釋放 Signature 物件:

java -Xmx2G -jar your-application.jar

或採用分塊處理:

// For very large files, consider signing metadata separately
// rather than embedding in the TAR itself

問題 3:簽章資料被截斷

症狀:長字串被切斷。
原因:Code128 容量上限約 80 個字元。
解決方式:改用 QR 代碼以容納較長的負載:

// Bad: Too much data for Code128
BarcodeSignOptions bcOptions = new BarcodeSignOptions(veryLongString, BarcodeTypes.Code128);

// Good: Use QR code instead
QrCodeSignOptions qrOptions = new QrCodeSignOptions(veryLongString, QrCodeTypes.QR);

問題 4:授權驗證錯誤

症狀:在生產環境出現 LicenseException 或「Trial version」警告。
解決方式:在建立任何 Signature 實例前先載入授權:

import com.groupdocs.signature.License;

License license = new License();
license.setLicense("path/to/GroupDocs.Signature.lic");

// Now create signatures
Signature signature = new Signature("document.tar");

小技巧:於應用程式啟動時一次載入授權,而非每次簽署前重複載入。

問題 5:位置值未如預期工作

症狀:簽章出現在意外位置。
原因:像素與點的混淆。
解決方式:GroupDocs 預設使用像素。若需精確定位:

bcOptions.setLeft(100);  // 100 pixels from left edge
bcOptions.setTop(100);   // 100 pixels from top edge

// If you need percentage-based positioning:
bcOptions.setHorizontalAlignment(HorizontalAlignment.Center);
bcOptions.setVerticalAlignment(VerticalAlignment.Center);

整合模式

模式 1:REST API 服務

將簽署功能以微服務方式公開:

@RestController
@RequestMapping("/api/signature")
public class SignatureController {
    
    @PostMapping("/sign")
    public ResponseEntity<SignatureResponse> signFile(
            @RequestParam("file") MultipartFile file,
            @RequestParam("signatureType") String type) {
        
        try {
            // Save uploaded file temporarily
            File tempFile = File.createTempFile("upload-", ".tar");
            file.transferTo(tempFile);
            
            // Sign based on type
            Signature signature = new Signature(tempFile.getAbsolutePath());
            
            SignOptions options = type.equals("barcode") 
                ? createBarcodeOptions() 
                : createQROptions();
            
            String outputPath = generateOutputPath();
            SignResult result = signature.sign(outputPath, options);
            
            // Return signed file
            return ResponseEntity.ok(new SignatureResponse(outputPath, result));
            
        } catch (Exception e) {
            return ResponseEntity.status(500).body(null);
        }
    }
}

模式 2:批次處理管線

一次簽署多個壓縮檔:

public class BatchSigner {
    
    public void signArchiveBatch(List<File> archives) {
        ExecutorService executor = Executors.newFixedThreadPool(4);
        
        archives.forEach(archive -> {
            executor.submit(() -> {
                try {
                    signSingleArchive(archive);
                } catch (Exception e) {
                    logger.error("Failed to sign: " + archive.getName(), e);
                }
            });
        });
        
        executor.shutdown();
        executor.awaitTermination(1, TimeUnit.HOURS);
    }
    
    private void signSingleArchive(File archive) throws Exception {
        Signature signature = new Signature(archive.getAbsolutePath());
        // ... signing logic
    }
}

模式 3:事件驅動架構

檔案建立時即觸發簽署:

@Component
public class ArchiveCreatedListener {
    
    @EventListener
    public void onArchiveCreated(ArchiveCreatedEvent event) {
        CompletableFuture.runAsync(() -> {
            signArchive(event.getFilePath());
        });
    }
    
    private void signArchive(String filePath) {
        // ... signing logic
    }
}

效能考量

記憶體管理

問題:每個 Signature 會將整個檔案載入記憶體。
最佳實踐

// Bad: Creating multiple instances for same file
Signature sig1 = new Signature("file.tar");
Signature sig2 = new Signature("file.tar");  // Loads again!

// Good: Reuse the instance
try (Signature signature = new Signature("file.tar")) {
    signature.sign(output1, options1);
    signature.sign(output2, options2);  // Same instance, different outputs
}

檔案大小最佳化

  • 小檔案 (< 10 MB) – 同步簽署。
  • 中等檔案 (10‑100 MB) – 使用背景執行緒。
  • 大型檔案 (> 100 MB) – 考慮僅簽署中繼資料或使用串流 API。

簽章複雜度(在標準伺服器上的大致耗時)

簽章類型每份文件耗時
單一條碼50‑100 ms
單一 QR 代碼100‑200 ms
多重簽章150‑300 ms

最佳化提示:若需處理上千個檔案,請使用執行緒池批次處理(參考上方批次模式)。

程式庫更新

GroupDocs 會定期釋出效能改進。部署前務必檢查 changelog

更新策略

  1. 在測試環境驗證新版本。
  2. 檢視破壞性變更。
  3. 使用實際檔案進行效能基準測試。
  4. 逐步滾動部署。

生產環境最佳實踐

1. 驗證授權狀態

License license = new License();
if (!license.isLicensed()) {
    logger.warn("Running in trial mode - features may be limited");
}

2. 實作健全的錯誤處理

try {
    signature.sign(outputPath, options);
} catch (Exception e) {
    logger.error("Signature failed", e);
    // Don't just swallow exceptions - log or re-throw
    throw new SignatureException("Failed to sign document", e);
}

3. 使用具描述性的簽章資料

// Bad: Meaningless ID
new BarcodeSignOptions("12345678", BarcodeTypes.Code128);

// Good: Self-documenting data
String signatureData = String.format("DOC-%s-%s", 
    docType, 
    LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME)
);
new BarcodeSignOptions(signatureData, BarcodeTypes.Code128);

4. 為簽章格式加上版本號
在嵌入的 JSON 中加入版本欄位,以便未來驗證邏輯保持相容:

String qrData = String.format(
    "{\"v\":\"1.0\",\"type\":\"archive\",\"timestamp\":\"%s\"}", 
    timestamp
);

5. 使用真實檔案測試 – 必須以生產規模的壓縮檔驗證記憶體與效能問題。

結論

現在你已掌握使用條碼與 QR 代碼在 digital signature java 中實作的完整基礎。你學會了:

  • 如何使用條碼與 QR 代碼簽署 TAR 壓縮檔(以及其他文件)
  • 何時根據需求選擇簽章類型
  • 常見問題的排除方法
  • REST API、批次處理與事件驅動系統的實務整合模式
  • 處理各種檔案大小的效能最佳化技巧

後續步驟

  1. 探索 search() 方法進行簽章驗證。
  2. 嘗試其他文件格式——GroupDocs.Signature 支援 PDF、DOCX、XLSX、PNG 等。
  3. 客製化簽章外觀(顏色、尺寸、邊框)。
  4. 建置驗證 API,以程式方式驗證簽章。

GroupDocs.Signature 的功能遠超本指南。請參閱 完整文件 了解文字簽章、影像簽章與中繼資料抽取等進階功能。

有問題或想分享實作經驗?歡迎加入 GroupDocs 社群論壇與其他開發者交流。

常見問答

Q: 能否簽署除 TAR 之外的文件?
A: 當然可以!GroupDocs.Signature 支援超過 50 種檔案格式,包括 PDF、DOCX、XLSX、PNG 等。只需在 Signature 建構子中更改副檔名,即可使用任何支援的類型。

Q: 簽署後如何驗證簽章?
A: 使用 search() 方法搜尋並驗證簽章:

Signature signature = new Signature("signed-document.tar");
BarcodeSearchOptions searchOptions = new BarcodeSearchOptions();
List<BarcodeSignature> signatures = signature.search(BarcodeSignature.class, searchOptions);

Q: 簽章能防止篡改嗎?
A: 條碼與 QR 代碼提供視覺驗證,但其安全性不如使用數位憑證的傳統簽章。若需最高安全性,建議結合 PKI 或將簽章雜湊存於外部資料庫。

Q: 簽章能儲存多少資料?

  • Code128 條碼:約 80 個英數字元
  • QR 代碼(Version 40):最多 4,296 個英數字元或 7,089 個數字

Q: 可以自訂簽章外觀嗎?
A: 可以!可控制顏色、尺寸、邊框等屬性:

bcOptions.setForeColor(Color.BLUE);
bcOptions.setBackgroundColor(Color.YELLOW);
bcOptions.setBorder(new Border());
bcOptions.getBorder().setColor(Color.RED);
bcOptions.getBorder().setWeight(2);

Q: 若對同一檔案簽署兩次會發生什麼?
A: 每次 sign() 呼叫都會新增一個簽章。若要取代既有簽章,請先使用 delete() 方法刪除。

Q: 大檔案如何避免記憶體不足?
A: 增加 JVM 堆積 (-Xmx)、及時釋放 Signature 物件,或將中繼資料分開簽署以處理多 GB 檔案。

Q: 簽署文件需要網路連線嗎?
A: 不需要。只要安裝好程式庫,即可完全離線運作。


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

相關教學