如何在 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 為列舉,包含支援的條碼符號,例如 Code128、Code39 等。
發生了什麼?
"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. 驗證授權狀態
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、批次處理與事件驅動系統的實務整合模式
- 處理各種檔案大小的效能最佳化技巧
後續步驟:
- 探索
search()方法進行簽章驗證。 - 嘗試其他文件格式——GroupDocs.Signature 支援 PDF、DOCX、XLSX、PNG 等。
- 客製化簽章外觀(顏色、尺寸、邊框)。
- 建置驗證 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