使用 Java 搜尋文件中特定頁面的條碼
介紹
曾經花了好幾個小時手動驗證數百份文件中的簽名嗎?你並不孤單。無論你是在構建合約管理系統、自動化發票處理,或是保護醫療記錄,手動追蹤並驗證條碼簽名既繁瑣又容易出錯。在本教學中,你將學會如何使用 GroupDocs.Signature 於 Java 搜尋條碼頁面,從而以程式方式僅針對關鍵頁面、即時監控進度,並僅用幾行 Java 程式碼處理各種條碼格式。
你將學到
- 在 Java 專案中設定 GroupDocs.Signature(≈5 分鐘)
- 訂閱搜尋事件以即時追蹤進度
- 設定智慧搜尋選項以鎖定特定頁面
- 高效執行搜尋並處理結果
快速回答
- 哪個函式庫可協助搜尋特定條碼頁面? GroupDocs.Signature for Java
- 典型設定時間? 約 5 分鐘即可加入 Maven/Gradle 相依性並套用授權
- 我可以將搜尋限制在首頁與末頁嗎? 可以 – 使用
PagesSetup指定精確頁碼 - 支援哪些條碼格式? QR Code、Code128、Code39、DataMatrix、EAN/UPC 等多種
- 生產環境需要付費授權嗎? 生產環境必須使用完整授權;試用版可用於評估
什麼是「搜尋條碼特定頁面」?
搜尋條碼特定頁面是指指示簽名引擎只在你關心的頁面上(例如首頁、末頁或任何自訂範圍)尋找條碼簽名。此聚焦方式可加快處理速度、降低記憶體使用,並讓你建立即時回饋的 UI。
為什麼要使用 GroupDocs.Signature 完成此任務?
GroupDocs.Signature 提供高階 API,抽象掉低階的條碼解碼、頁面渲染與文件格式處理。它支援 超過 20 種條碼格式,且能在 不將整個檔案載入記憶體 的情況下處理 數百頁的文件,讓你專注於業務邏輯,而非檔案解析。
前置條件
- 已安裝 JDK 8+
- Maven 或 Gradle 以管理相依性
- 具備 Java 類別、方法與例外處理的基本概念
- 取得 GroupDocs.Signature 授權(試用或正式)
為 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'
想手動下載?可直接從 GroupDocs 下載頁面 取得最新發行版。
取得授權
- 免費試用 – 立即開始,無需承諾
- 臨時授權 – 完整功能供評估使用
- 正式授權 – 生產環境就緒,無使用限制
使用以下簡易初始化程式碼驗證安裝:
import com.groupdocs.signature.Signature;
public class SignatureSetup {
public static void main(String[] args) {
// Initialize the Signature instance with the document path
Signature signature = new Signature("YOUR_DOCUMENT_PATH");
System.out.println("GroupDocs.Signature for Java initialized successfully.");
}
}
專業提示: 把
"YOUR_DOCUMENT_PATH"替換為實際的 PDF、DOCX 或 XLSX 檔案。若主控台印出成功訊息,即表示已可使用。
了解條碼簽名類型
條碼在文件中嵌入機器可讀的資料。與手寫簽名不同,條碼可儲存 ID、時間戳、URL 或 JSON 負載,十分適合自動驗證。
| 條碼類型 | 最適用途 | 典型資料長度 |
|---|---|---|
| QR Code | 高密度資料、URL、 多行文字 | 最多 4,296 個字元 |
| Code128 | 字母數字追蹤編號 | 可變長度 |
| Code39 | 簡易舊式代碼 | 最多 43 個字元 |
| DataMatrix | 小標籤、醫療記錄 | 最多 2,335 個字元 |
| EAN/UPC | 商品識別、零售 | 8‑13 位數字 |
當你需要快速機器讀取、結構化資料或防篡改簽名時,條碼往往是最佳選擇。
如何在 Java 中搜尋條碼頁面?
Signature 是代表待處理文件的主要類別。使用 new Signature("file.pdf") 載入文件,BarcodeSearchOptions 定義搜尋條碼簽名的參數,並設定目標頁面,最後呼叫 signature.search(options)。search 方法會根據提供的選項執行搜尋,並回傳 BarcodeSignature 物件清單,內含頁碼、解碼文字與幾何座標——一次完成所有工作,免除額外的影像抽取或自訂解碼程式。
了解整體流程後,接下來深入三個核心功能的實作。
功能 1:訂閱文件搜尋事件
為何重要
在處理大量批次時,即時回饋(例如進度條)可提升使用者體驗,並協助及早偵測卡住的情況。
定義錨點
Signature 代表文件,提供事件訂閱功能。
實作
Signature signature = new Signature("YOUR_DOCUMENT_PATH");
signature.SearchStarted.add(new ProcessStartEventHandler() {
public void invoke(Signature sender, ProcessStartEventArgs args) {
System.out.println("Search process started at " + args.getStarted()
+ " with " + args.getTotalSignatures() + " total signatures to be put in document");
}
});
signature.SearchProgress.add(new ProcessProgressEventHandler() {
public void invoke(Signature sender, ProcessProgressEventArgs args) {
System.out.println("Search progress. Processed " + args.getProcessedSignatures()
+ " signatures. Time spent " + args.getTicks() + " mlsec");
}
});
signature.SearchCompleted.add(new ProcessCompleteEventHandler() {
public void invoke(Signature sender, ProcessCompleteEventArgs args) {
System.out.println("Search process completed at " + args.getCompleted()
+ " with " + args.getTotalSignatures() + " total signatures. Process took "
+ args.getTicks() + " mlsec");
}
});
這三個處理器分別提供開始時間、即時進度與最終統計資訊,適合用於日誌或 UI 更新。
功能 2:為特定頁面設定條碼搜尋選項
為何需要細粒度控制
掃描 200 頁合約的每一頁會浪費大量 CPU。僅針對首頁與末頁即可將執行時間縮短 最高 80 %。
定義錨點
PagesSetup 指定搜尋作業包含哪些頁面。
實作
import com.groupdocs.signature.domain.enums.TextMatchType;
import com.groupdocs.signature.options.search.BarcodeSearchOptions;
BarcodeSearchOptions options = new BarcodeSearchOptions();
options.setAllPages(false); // Opt‑in selective page searching
options.setPageNumber(1); // Starting page (optional)
import com.groupdocs.signature.options.PagesSetup;
PagesSetup pagesSetup = new PagesSetup();
pagesSetup.setFirstPage(true); // Include first page
pagesSetup.setLastPage(true); // Include last page
pagesSetup.setOddPages(false); // Skip odd pages
pagesSetup.setEvenPages(false); // Skip even pages
options.setPagesSetup(pagesSetup);
options.setMatchType(TextMatchType.Contains);
options.setText("12345");
- 匹配類型 讓你微調文字搜尋(
Contains、Exact、StartsWith、EndsWith)。 - 調整
setAllPages與PagesSetup即可 僅搜尋條碼特定頁面。
功能 3:執行搜尋並處理結果
為何此步驟關鍵
找到條碼只是第一步,你還必須對資料進行驗證、儲存或觸發工作流程。
定義錨點
BarcodeSignature 代表偵測到的條碼,包含頁碼、解碼文字等屬性。
實作
import java.util.List;
import com.groupdocs.signature.domain.signatures.BarcodeSignature;
try {
List<BarcodeSignature> signatures = signature.search(BarcodeSignature.class, options);
System.out.println("Source document contains following signatures.");
for (BarcodeSignature barcodeSignature : signatures) {
System.out.println("Barcode signature found at page " + barcodeSignature.getPageNumber()
+ " with type " + barcodeSignature.getEncodeType() + " and text " + barcodeSignature.getText());
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
現在你已取得 BarcodeSignature 物件清單,每個物件提供:
getPageNumber()– 條碼所在頁碼getEncodeType()– QR、Code128 等類型getText()– 解碼後的負載- 位置 (
getLeft()、getTop()) 與尺寸 (getWidth()、getHeight())
範例:僅處理最後一頁的 QR Code
for (BarcodeSignature barcodeSignature : signatures) {
if (barcodeSignature.getPageNumber() == lastPageNumber
&& barcodeSignature.getEncodeType().equals("QRCode")) {
// Process only QR codes from the final page
processApprovalCode(barcodeSignature.getText());
}
}
真實案例應用
| 情境 | 條碼特定頁面搜尋的幫助 |
|---|---|
| 合約驗證 | 在簽名頁自動驗證 QR 編碼的憑證雜湊 |
| 供應鏈追蹤 | 在清單的首頁/末頁定位 Code128 出貨編號 |
| 醫療同意書 | 從最終同意頁提取 DataMatrix 病患 ID |
| 發票自動化 | 在發票任意位置找尋「APPR‑」前綴條碼,然後路由處理 |
常見問題與解決方案
問題 1 – 雖有條碼卻無結果
// Ensure you are not limiting pages too aggressively
options.setAllPages(true);
若條碼以點陣圖形式嵌入,請考慮使用 GroupDocs.Image 進行影像基礎的偵測。
問題 2 – 大檔案效能緩慢
PagesSetup pagesSetup = new PagesSetup();
pagesSetup.setLastPage(true); // Most signatures are on the last page
pagesSetup.setFirstPage(true);
options.setPagesSetup(pagesSetup);
針對特定頁面可大幅降低處理時間;將 150 頁 PDF 的搜尋時間由約 4 秒降至 <1 秒,只要限制在兩頁內。
問題 3 – TextMatchType 找不到預期條碼
String searchText = "12345".trim().toLowerCase();
options.setText(searchText);
options.setMatchType(TextMatchType.StartsWith); // Try a more permissive mode
問題 4 – 長時間迴圈導致記憶體泄漏
try (Signature signature = new Signature("document.pdf")) {
List<BarcodeSignature> signatures = signature.search(BarcodeSignature.class, options);
// Process signatures
}
使用 try‑with‑resources 區塊可自動釋放 Signature 實例。
生產環境最佳實踐
強韌的錯誤處理
try {
List<BarcodeSignature> signatures = signature.search(BarcodeSignature.class, options);
} catch (com.groupdocs.signature.exception.GroupDocsSignatureException e) {
logger.error("GroupDocs error: " + e.getMessage());
} catch (Exception e) {
logger.error("Unexpected error: " + e.getMessage(), e);
}
文件不可變時快取結果
Map<String, List<BarcodeSignature>> cache = new ConcurrentHashMap<>();
public List<BarcodeSignature> getCachedSignatures(String docId) {
return cache.computeIfAbsent(docId, id -> performSearch(id));
}
使用進度事件提供 UI 回饋
signature.SearchProgress.add(new ProcessProgressEventHandler() {
public void invoke(Signature sender, ProcessProgressEventArgs args) {
int percent = (args.getProcessedSignatures() * 100) / args.getTotalSignatures();
updateProgressBar(percent);
}
});
驗證條碼負載
for (BarcodeSignature barcodeSignature : signatures) {
String text = barcodeSignature.getText();
if (!text.matches("APPR-\\d{4}-\\d{3}")) {
logger.warn("Invalid format: " + text);
continue;
}
if (!validateChecksum(text)) {
logger.error("Checksum failed for: " + text);
flagForManualReview(document);
}
}
依文件類型最佳化頁面選擇
PagesSetup contractsSetup = new PagesSetup();
contractsSetup.setLastPage(true); // Contracts usually signed on last page
options.setPagesSetup(contractsSetup);
搜尋後依條碼類型過濾(若只需 QR Code)
for (BarcodeSignature sig : signatures) {
if ("QRCode".equals(sig.getEncodeType())) {
// Process QR code
}
}
取得條碼影像尺寸(若需渲染)
for (BarcodeSignature sig : signatures) {
int width = sig.getWidth();
int height = sig.getHeight();
// Use dimensions for overlay or thumbnail generation
}
常見問答
Q: 可以一次呼叫搜尋多種條碼格式嗎?
A: 可以。BarcodeSearchOptions 預設會搜尋所有支援的格式。若只需特定類型,可於結果中以 getEncodeType() 篩選。
Q: 若文件同時包含條碼與影像簽名,該如何處理?
A: 分別執行搜尋 – 使用 BarcodeSignature.class 處理條碼,ImageSignature.class 處理影像簽名,然後依需求合併結果。
Q: 搜尋全部頁面與僅搜尋特定頁面的效能差異為何?
A: 以 50 頁 PDF 為例,完整掃描需 3–5 秒;限定首頁+末頁通常在 1 秒以內完成。
Q: 這能用於掃描版 PDF(點陣圖)嗎?
A: 只有條碼以數位簽名物件形式加入時才可。若僅為點陣圖條碼,需使用影像式條碼辨識器(例如 GroupDocs.Barcode)。
Q: 如何驗證條碼簽名未被竄改?
A: 在條碼負載中嵌入雜湊或數位簽章,然後對原始資料重新計算雜湊並比對。此作法需要原始簽署金鑰或憑證。
最後更新: 2026-06-21
測試環境: GroupDocs.Signature 23.12 for Java
作者: GroupDocs