如何使用 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 提供多種授權方案:
- 免費試用 – 適合測試使用。從 GroupDocs releases 下載。
- 臨時授權 – 透過 Temporary License Page 獲得 30 天完整存取權。
- 商業授權 – 生產環境使用時,請於 GroupDocs Purchase 購買授權。
專業提示: 先使用免費試用版建立概念驗證,若 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 代表偵測到的條碼,提供其類型、解碼文字、頁碼與幾何邊界。
此程式碼的功能
- 呼叫
signature.search()取得BarcodeSignature物件的清單。 - 檢查是否找到條碼,以避免 NullPointerException。
- 為每個匹配項提取類型、文字、頁碼與尺寸。
- 使用
try‑catch區塊包裹整個操作,以優雅地處理損毀的 PDF 或遺失的檔案。 - 在
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)
- 條碼尺寸過小,偵測引擎無法辨識
- 條碼類型過濾設定錯誤
解決方案
- 提升 DPI – 掃描時使用 300 DPI 或更高。
- 移除類型過濾 – 先搜尋所有條碼類型,再逐步縮小範圍。
- 驗證視覺品質 – 在 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 頁,設定
setAllPages(false)並setPageNumber(1)。 - 快取結果 – 首次掃描後儲存條碼資料,以免重複處理同一檔案。
- 使用 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