如何使用 Java 讀取 QR code PDF

簡介

是否曾需要從數百份 PDF 發票、運送標籤或庫存文件中提取條碼資訊?手動逐頁掃描既繁瑣又容易出錯。無論您是構建自動化文件處理系統,還是驗證產品真偽,在 PDF 中高效尋找條碼都可能是一大挑戰。使用 GroupDocs.Signature 快速 Read QR code PDF 檔案,您只需幾行 Java 程式碼即可將數小時的手動工作自動化。

在本指南中,您將學習如何使用 GroupDocs.Signature API 高效 read QR code PDF 文件。您將看到如何設定庫、配置搜尋選項、依條碼類型過濾,以及以可擴展的方式處理結果,從單一檔案到數千檔批次皆適用。

快速答案

  • GroupDocs.Signature 能從 PDF 讀取 QR code 嗎? 是 – 它能偵測 QR、Data Matrix、PDF417 以及超過 45 種其他條碼格式。
  • 我需要授權才能在生產環境使用嗎? 需要商業授權;可使用免費試用版進行評估。
  • 需要哪個 Java 版本? Java 8 以上(建議使用 Java 11 以上以獲得更佳效能)。
  • 如何將搜尋限制在特定頁面? 使用 BarcodeSearchOptions.setAllPages(false) 並設定 setPageNumber()。
  • API 在批次處理時是否為執行緒安全? 是,只要為每個執行緒建立獨立的 Signature 實例即可。

什麼是 read QR code PDF?

Read QR code PDF 指的是以程式方式定位並解碼嵌入 PDF 頁面中的 QR 類型條碼。使用 GroupDocs.Signature,您可以提取編碼文字、判斷頁碼,並取得每個條碼的幾何尺寸,且無需先將 PDF 轉為影像,從而大幅提升處理速度。

為何在 PDF 中搜尋條碼?

在 PDF 中搜尋條碼可讓企業自動化資料抽取、減少人工輸入錯誤,並加速金融、物流與醫療等領域的工作流程。透過程式化讀取嵌入的條碼,組織能即時取得識別碼、追蹤貨件、驗證文件,並將資訊整合至下游系統,實現更快速且可靠的營運。

常見商業情境

  • 發票處理 – 自動從供應商發票中提取訂單號碼或追蹤碼。
  • 庫存管理 – 掃描產品目錄並提取 SKU 條碼以更新資料庫。
  • 運送與物流 – 驗證運送清單中的包裹追蹤碼。
  • 文件驗證 – 透過檢查嵌入的安全條碼來驗證已簽署的文件。
  • 醫療記錄 – 從醫療 PDF 中提取患者 ID 或處方碼。

GroupDocs.Signature 會處理繁重的工作——您無需編寫影像處理程式碼或擔心 PDF 渲染的怪異行為。此函式庫可偵測 50+ 條碼格式,且在一般 8 核心伺服器上能於 5 秒內處理 300 頁的 PDF。

前置條件

在開始本教學之前,請確保您已準備好以下項目:

必要的函式庫與相依性

您需要在 Java 專案中加入 GroupDocs.Signature 函式庫。以下說明如何使用 Maven 或 Gradle 添加:

Maven:

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

Gradle:

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

注意: 請隨時於 GroupDocs.Signature for Java releases 檢查最新版本。使用最新版本可確保取得錯誤修正與新功能。

環境設定

  • JDK 8 或更高 – GroupDocs.Signature 最低需要 Java 8(建議使用 Java 11 以上以獲得更佳效能)。
  • IDE – IntelliJ IDEA 或 Eclipse 可提供自動完成與除錯功能,讓開發更順利。
  • PDF 文件 – 準備一個含有條碼的測試 PDF(發票、運送標籤或產品目錄皆適用)。

知識前置條件

您應該熟悉以下內容:

  • 基本的 Java 語法與物件導向概念
  • 使用 try‑catch 區塊處理例外
  • 在 IDE 中使用外部函式庫

如果您是第一次使用第三方 Java 函式庫,別擔心,我們會一步步帶您完成。

設定 GroupDocs.Signature for Java

開始使用 GroupDocs.Signature 只需幾分鐘。以下是完整的設定流程:

步驟 1:新增相依性

使用 Maven 或 Gradle 來加入函式庫(請參考上方程式碼)。新增相依性後,請重新整理專案以下載 JAR 檔案。

步驟 2:取得授權

GroupDocs 提供多種授權方案:

專業提示: 先使用免費試用版建立概念驗證,若 API 符合需求再升級授權。

步驟 3:基本初始化

Signature 類別是進入點,負責將 PDF 載入記憶體,並提供搜尋、驗證與抽取方法。

import com.groupdocs.signature.Signature;

String filePath = "YOUR_DOCUMENT_DIRECTORY/sample_signed.pdf"; // Replace with your PDF path
Signature signature = new Signature(filePath);

重要提示: 確認在 Windows 上使用雙反斜線的檔案路徑(C:\\Documents\\file.pdf),以避免跳脫字元問題。

實作指南

現在進入有趣的部分——讓我們撰寫程式碼以在 PDF 中搜尋條碼。

在文件中搜尋條碼簽章

我們將把實作分為三個清晰的步驟。

步驟 1:初始化 Signature 物件

Signature 是核心類別,代表記憶體中的 PDF 文件。

import com.groupdocs.signature.Signature;

String filePath = "YOUR_DOCUMENT_DIRECTORY/sample_signed.pdf"; // Replace with actual file path
Signature signature = new Signature(filePath);

此處發生的事 – Signature 物件會開啟您的 PDF 並為處理做準備。可類比為在文字編輯器中開啟檔案;您正載入文件以便查詢。

實務說明 – 處理使用者上傳的 PDF 時,請先驗證檔案路徑並檢查檔案是否存在,再建立 Signature 物件。這可避免之後出現難以理解的「找不到檔案」錯誤。

步驟 2:建立 BarcodeSearchOptions

BarcodeSearchOptions 告訴引擎要搜尋什麼以及搜尋位置。

import com.groupdocs.signature.options.search.BarcodeSearchOptions;

// Configure options for searching barcodes
BarcodeSearchOptions options = new BarcodeSearchOptions();
options.setAllPages(true); // Search every page in the document

定義說明: BarcodeSearchOptions 設定條碼搜尋參數,如頁面範圍、條碼類型與偵測精度。

關鍵設定選項

  • setAllPages(true): 掃描所有頁面。若已知確切頁碼,請設為 false 並使用 setPageNumber() 指定。
  • setEncodeType(BarcodeEncodeType.QR): 將搜尋限制於 QR code,可在大型 PDF 上將處理時間縮減最高 60 %。

為何重要 – 若您的發票總是將 QR code 放在第 1 頁,掃描整份文件會浪費 CPU 資源。

步驟 3:執行搜尋並處理結果

執行搜尋,然後遍歷結果。

import com.groupdocs.signature.domain.signatures.BarcodeSignature;
import java.util.List;

try {
    // Execute the barcode search
    List<BarcodeSignature> signatures = signature.search(BarcodeSignature.class, options);
    
    // Check if any barcodes were found
    if (signatures.isEmpty()) {
        System.out.println("No barcode signatures found in the document.");
    } else {
        System.out.println("Found " + signatures.size() + " barcode signature(s):\n");
        
        // Loop through each barcode and display details
        for (BarcodeSignature barcodeSignature : signatures) {
            System.out.println("----------------------------------------");
            System.out.println("Barcode Type: " + barcodeSignature.getEncodeType().getTypeName());
            System.out.println("Barcode Text: " + barcodeSignature.getText());
            System.out.println("Page Number: " + barcodeSignature.getPageNumber());
            System.out.println("Position: X=" + barcodeSignature.getLeft() + 
                             ", Y=" + barcodeSignature.getTop());
            System.out.println("Size: Width=" + barcodeSignature.getWidth() + 
                             ", Height=" + barcodeSignature.getHeight());
            System.out.println("----------------------------------------\n");
        }
    }
} catch (Exception e) {
    System.err.println("Error searching for barcodes: " + e.getMessage());
    e.printStackTrace();
} finally {
    // Always dispose of the signature object to free resources
    if (signature != null) {
        signature.dispose();
    }
}

定義說明: BarcodeSignature 代表偵測到的條碼,提供其類型、解碼文字、頁碼與幾何邊界。

此程式碼的功能

  1. 呼叫 signature.search() 取得 BarcodeSignature 物件的清單。
  2. 檢查是否找到條碼,以避免 NullPointerException。
  3. 為每個匹配項提取類型、文字、頁碼與尺寸。
  4. 使用 try‑catch 區塊包裹整個操作,以優雅地處理損毀的 PDF 或遺失的檔案。
  5. 在 finally 區塊中釋放 Signature 實例,釋放記憶體。

實務應用 – 在運送標籤工作流程中,您會將 getText()(追蹤號碼)存入資料庫,並使用 getPageNumber() 將標籤對應回原始批次檔案。

依條碼類型過濾

若您已知確切的條碼格式,可過濾以加速偵測:

import com.groupdocs.signature.domain.barcodes.BarcodeTypes;

BarcodeSearchOptions options = new BarcodeSearchOptions();
options.setEncodeType(BarcodeTypes.QR); // Only search for QR codes
options.setAllPages(true);

何時過濾 – 將搜尋限制於單一類型(例如 QR)可在視覺元素眾多的文件上降低 30‑50 % 的 CPU 使用率。

支援的條碼類型

GroupDocs.Signature 能偵測多種條碼格式。以下為快速參考:

1D 條碼(線性)

  • Code128 – 常見於運送與包裝
  • Code39 – 用於汽車與防衛領域
  • EAN13/EAN8 – 零售商品條碼
  • UPC‑A/UPC‑E – 北美零售標準
  • Interleaved2of5 – 倉儲與配送

2D 條碼(矩陣)

  • QR Code – 最受歡迎,可儲存 URL、Wi‑Fi 憑證等。
  • Data Matrix – 體積小,適合微小元件
  • PDF417 – 政府身分證、登機證、駕照等
  • Aztec Code – 交通票證

如前所示的類型過濾可協助您聚焦於所需的特定格式。

真實案例

1. 自動化發票處理

情境: 會計部門每日收到超過 500 份供應商 PDF 發票。

解決方案: 掃描每份 PDF 中含有發票號碼的 Code39 條碼,然後自動將其與 ERP 系統中的採購單匹配。此舉可消除人工資料輸入,錯誤率降低 85 %。

// Pseudo-code workflow
for (PDF invoice : invoiceBatch) {
    List<BarcodeSignature> barcodes = searchBarcodes(invoice);
    String invoiceNumber = barcodes.get(0).getText();
    updateERPSystem(invoiceNumber, invoice);
}

2. 倉庫庫存更新

情境: 倉庫收到的貨件附有 PDF 裝箱單,內嵌以 EAN13 條碼表示的產品 SKU。

解決方案: 從裝箱單中抽取所有條碼,自動更新庫存數量,並將任何不符之處標記為需人工審核。

3. 文件驗證

情境: 法律合約內含有 QR code 以及加密簽章以驗證真偽。

解決方案: 在已簽署的合約中搜尋 QR code,解碼簽章資料,並與受信任的憑證機構進行驗證。此舉確保文件未被竄改。

4. 醫療記錄管理

情境: 病患檔案包含帶有 Code128 條碼的 PDF 檢驗報告,用於標示樣本 ID。

解決方案: 自動抽取樣本 ID,並將檢驗結果連結至醫院資訊系統(HIS)中的病患記錄,將查詢時間從數分鐘縮短至數秒。

常見問題與解決方案

問題 1:「找不到條碼」(即使條碼確實存在)

可能原因

  • 影像解析度過低(低於 200 DPI)
  • 條碼尺寸過小,偵測引擎無法辨識
  • 條碼類型過濾設定錯誤

解決方案

  1. 提升 DPI – 掃描時使用 300 DPI 或更高。
  2. 移除類型過濾 – 先搜尋所有條碼類型,再逐步縮小範圍。
  3. 驗證視覺品質 – 在 Adobe Acrobat 中開啟 PDF,放大至 200 % 確認條碼清晰。

問題 2:大型 PDF 的 OutOfMemoryError

原因 – 載入 500 頁且含高解析度影像的 PDF 會消耗大量堆疊記憶體。

解決方案 – 將頁面分批處理,而非一次載入整個檔案:

for (int startPage = 1; startPage <= totalPages; startPage += 50) {
    BarcodeSearchOptions options = new BarcodeSearchOptions();
    options.setPageNumber(startPage);
    options.setPagesSetup(new PagesSetup());
    options.getPagesSetup().setLastPage(Math.min(startPage + 49, totalPages));
    
    List<BarcodeSignature> batchResults = signature.search(BarcodeSignature.class, options);
    // Process results...
}

對於極大批次,亦可考慮增大 JVM 堆積大小(例如 -Xmx4g)。

問題 3:多頁文件的效能緩慢

原因 – 逐頁順序掃描會耗時。

解決方案

  1. 鎖定特定頁面 – 若條碼總在第 1 頁,設定 setAllPages(false) 並 setPageNumber(1)。
  2. 快取結果 – 首次掃描後儲存條碼資料,以免重複處理同一檔案。
  3. 使用 SSD 儲存 – 相較於 HDD,較快的 I/O 可將載入時間縮減 60‑70 %。

問題 4:偽陽性(隨機圖案被誤判為條碼)

原因 – 表格或格線可能被誤認為條碼。

解決方案 – 在接受之前,先驗證解碼文字的長度與模式:

for (BarcodeSignature barcode : signatures) {
    String text = barcode.getText();
    
    // Example: Invoice numbers are always 10 digits
    if (text.matches("\\d{10}")) {
        // Valid invoice number
        processBarcode(barcode);
    } else {
        System.out.println("Skipping invalid barcode: " + text);
    }
}

大型文件的效能建議

1. 批次處理策略

利用執行緒池同時處理多個 PDF:

ExecutorService executor = Executors.newFixedThreadPool(4); // 4 parallel threads

for (String pdfPath : pdfFiles) {
    executor.submit(() -> {
        try (Signature sig = new Signature(pdfPath)) {
            List<BarcodeSignature> results = sig.search(BarcodeSignature.class, options);
            // Process results...
        } catch (Exception e) {
            e.printStackTrace();
        }
    });
}

executor.shutdown();
executor.awaitTermination(1, TimeUnit.HOURS);

結果: 在四核心機器上,處理 1 000 個檔案的時間從約 2 小時縮減至約 30 分鐘。

2. 縮小搜尋範圍

若條碼總是出現在相同區域,請限制搜尋範圍:

// Only search the top‑right corner where barcodes are typically placed
options.setRectangle(new Rectangle(400, 50, 150, 150)); // X, Y, Width, Height

結果: 在版面一致的文件上可提升 40‑60 % 的速度。

3. 監控記憶體使用

對於長時間執行的批次作業,請定期呼叫垃圾回收:

Runtime runtime = Runtime.getRuntime();
long usedMemory = runtime.totalMemory() - runtime.freeMemory();

if (usedMemory > (runtime.maxMemory() * 0.8)) {
    System.gc(); // Suggest garbage collection
}

最佳實踐

1. 總是釋放 Signature 物件

Signature 實作 AutoCloseable;使用 try‑with‑resources 可確保資源釋放:

try (Signature signature = new Signature(filePath)) {
    // Your search code here...
} // Automatically disposed

2. 驗證輸入檔案

切勿盲目信任外部路徑。請先驗證檔案是否存在且為有效的 PDF:

File pdfFile = new File(filePath);
if (!pdfFile.exists() || !pdfFile.canRead()) {
    throw new FileNotFoundException("PDF not found or not readable: " + filePath);
}

// Optional: Verify it's actually a PDF (check magic bytes)

3. 記錄條碼偵測結果

保留稽核日誌以符合合規需求與除錯:

Logger logger = Logger.getLogger(BarcodeSearcher.class.getName());

for (BarcodeSignature barcode : signatures) {
    logger.info(String.format("Detected %s barcode '%s' on page %d at (%.2f, %.2f)",
        barcode.getEncodeType().getTypeName(),
        barcode.getText(),
        barcode.getPageNumber(),
        barcode.getLeft(),
        barcode.getTop()));
}

4. 處理不同的條碼格式

建立彈性方法,接受 BarcodeEncodeType 列表,讓您在不更改程式碼的情況下即可因應新標準:

switch (barcode.getEncodeType().getTypeName()) {
    case "QR":
        // QR codes might contain URLs or JSON data
        processQRCode(barcode.getText());
        break;
    case "Code128":
        // Code128 typically contains alphanumeric order/tracking numbers
        processTrackingNumber(barcode.getText());
        break;
    default:
        logger.warning("Unexpected barcode type: " + barcode.getEncodeType());
}

5. 使用真實文件測試

使用帶有咖啡污漬的掃描發票、帶雜訊的傳真運送標籤,以及轉為 PDF 的低解析度手機照片。這可揭露乾淨樣本 PDF 所隱藏的邊緣案例。

GroupDocs.Signature 如何在 PDF 中偵測 QR code?

使用 Signature 實例載入 PDF,設定 BarcodeSearchOptions 以鎖定 QR code,然後呼叫 search()。引擎會在內部將每頁以 150 DPI 轉為位圖,使用快速的 Z‑Bar 解碼器,並回傳包含解碼文字與幾何資料的 BarcodeSignature 物件。此過程在一般 8 核心伺服器上,對 300 頁文件的處理時間不超過 5 秒。

常見問答

Q: 我可以在沒有授權的情況下讀取 QR code PDF 檔案嗎?
A: 免費試用版可用於評估讀取 QR code PDF 檔案,但在正式上線時需購買商業授權。

Q: API 是否支援受密碼保護的 PDF?
A: 支援。建立 Signature 物件時傳入密碼,例如 new Signature(filePath, "password")。

Q: 如何提升低解析度掃描的偵測率?
A: 最低以 200 DPI 掃描,啟用 setEncodeType(BarcodeEncodeType.QR),並考慮使用去噪濾鏡預處理 PDF。

Q: 搜尋在平行處理時是否為執行緒安全?
A: 每個執行緒應自行建立 Signature 物件。如此使用時 API 為執行緒安全。

Q: 本教學測試使用的 GroupDocs.Signature 版本為何?
A: 程式碼已在 GroupDocs.Signature 23.12 版本驗證,該版本支援 50+ 條碼格式,且可在不將整個檔案載入記憶體的情況下處理數百頁的 PDF。

結論

您剛剛學會如何使用 Java 與 GroupDocs.Signature API read QR code PDF 文件。以下為快速回顧:

  • 設定 – 新增 Maven/Gradle 相依性、取得授權,並建立 Signature。
  • 實作 – 設定 BarcodeSearchOptions、執行 search(),並處理 BarcodeSignature 結果。
  • 支援類型 – 超過 50 種條碼格式,包括 QR、Data Matrix、PDF417、Code128 與 EAN13。
  • 真實案例 – 發票自動化、庫存更新、文件驗證與醫療記錄處理。
  • 除錯 – 解決找不到條碼、記憶體錯誤、效能瓶頸與偽陽性等問題。
  • 效能 – 批次處理、限制頁面範圍與 SSD I/O 可大幅提升吞吐量。

GroupDocs.Signature 抽象化了複雜的 PDF 渲染與條碼解碼步驟,讓您專注於關鍵的業務邏輯。無論是構建小型工具或大型文件處理管線,您現在皆擁有可靠且高效能的解決方案。


最後更新: 2026-07-15
測試版本: GroupDocs.Signature 23.12
作者: GroupDocs

相關教學