Cách đọc mã QR trong PDF bằng Java
Giới thiệu
Bạn đã bao giờ cần trích xuất thông tin mã vạch từ hàng trăm hóa đơn PDF, nhãn vận chuyển hoặc tài liệu tồn kho chưa? Việc quét thủ công qua các trang rất tẻ nhạt và dễ gây lỗi. Dù bạn đang xây dựng hệ thống xử lý tài liệu tự động hay xác thực tính xác thực của sản phẩm, việc tìm mã vạch một cách hiệu quả trong PDF có thể là thách thức. Read QR code PDF files quickly with GroupDocs.Signature, and you’ll turn hours of manual work into a few lines of Java code.
Trong hướng dẫn này, bạn sẽ học cách read QR code PDF tài liệu một cách hiệu quả bằng cách sử dụng GroupDocs.Signature API. Bạn sẽ thấy cách thiết lập thư viện, cấu hình tùy chọn tìm kiếm, lọc theo loại mã vạch và xử lý kết quả sao cho mở rộng từ một tệp đơn lẻ đến hàng ngàn tệp.
Câu trả lời nhanh
- GroupDocs.Signature có thể đọc mã QR từ PDF không? Có – nó phát hiện QR, Data Matrix, PDF417 và hơn 45 định dạng mã vạch khác.
- Tôi có cần giấy phép cho việc sử dụng trong môi trường sản xuất không? Cần giấy phép thương mại; bản dùng thử miễn phí có sẵn để đánh giá.
- Phiên bản Java nào được yêu cầu? Java 8+ (Java 11+ được khuyến nghị để hiệu năng tốt hơn).
- Làm thế nào để giới hạn tìm kiếm ở các trang cụ thể? Sử dụng
BarcodeSearchOptions.setAllPages(false)và đặtsetPageNumber(). - API có an toàn với đa luồng cho xử lý batch không? Có, khi bạn tạo một thể hiện
Signatureriêng cho mỗi luồng.
Đọc mã QR PDF là gì?
Read QR code PDF đề cập đến việc định vị và giải mã các mã vạch loại QR được nhúng trong các trang PDF một cách lập trình. Sử dụng GroupDocs.Signature, bạn có thể trích xuất văn bản đã mã hoá, xác định số trang và lấy kích thước hình học của mỗi mã vạch, tất cả mà không cần phải render PDF thành hình ảnh trước, giúp tăng tốc xử lý đáng kể.
Tại sao tìm kiếm mã vạch trong PDF?
Tìm kiếm mã vạch trong PDF cho phép doanh nghiệp tự động hoá việc trích xuất dữ liệu, giảm lỗi nhập liệu thủ công và tăng tốc quy trình trong tài chính, logistics và y tế. Bằng cách đọc mã vạch nhúng một cách lập trình, các tổ chức có thể ngay lập tức lấy các định danh, theo dõi lô hàng, xác thực tài liệu và tích hợp thông tin vào các hệ thống downstream, mang lại hoạt động nhanh hơn, đáng tin cậy hơn.
Kịch bản kinh doanh phổ biến
- Xử lý hóa đơn – Tự động trích xuất số đơn hàng hoặc mã theo dõi từ hóa đơn nhà cung cấp.
- Quản lý tồn kho – Quét danh mục sản phẩm và trích xuất mã vạch SKU để cập nhật cơ sở dữ liệu.
- Vận chuyển & Logistics – Xác minh mã theo dõi gói trong bảng kê vận chuyển.
- Xác thực tài liệu – Xác thực tài liệu đã ký bằng cách kiểm tra mã vạch bảo mật nhúng.
- Hồ sơ y tế – Trích xuất ID bệnh nhân hoặc mã đơn thuốc từ PDF y tế.
GroupDocs.Signature xử lý phần nặng—bạn không cần viết mã xử lý ảnh hay lo lắng về các quirks của render PDF. Thư viện có thể phát hiện 50+ định dạng mã vạch và xử lý một PDF 300 trang trong vòng dưới 5 giây trên một máy chủ 8‑core tiêu chuẩn.
Yêu cầu trước
Trước khi bắt đầu tutorial này, hãy chắc chắn rằng bạn đã chuẩn bị các mục sau:
Thư viện và phụ thuộc cần thiết
Bạn sẽ cần bao gồm thư viện GroupDocs.Signature trong dự án Java của mình. Dưới đây là cách thêm nó bằng Maven hoặc Gradle:
Maven:
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-signature</artifactId>
<version>23.12</version>
</dependency>
Gradle:
implementation 'com.groupdocs:groupdocs-signature:23.12'
Lưu ý: Luôn kiểm tra phiên bản mới nhất tại GroupDocs.Signature cho Java – bản phát hành. Sử dụng phiên bản mới nhất đảm bảo bạn nhận được các bản sửa lỗi và tính năng mới.
Cài đặt môi trường
- JDK 8 hoặc cao hơn – GroupDocs.Signature yêu cầu Java 8 tối thiểu (Java 11+ được khuyến nghị để hiệu năng tốt hơn).
- IDE – IntelliJ IDEA hoặc Eclipse sẽ giúp bạn dễ dàng hơn với tính năng tự động hoàn thành và gỡ lỗi.
- Tài liệu PDF – Chuẩn bị một PDF mẫu có mã vạch (hóa đơn, nhãn vận chuyển, hoặc danh mục sản phẩm đều phù hợp).
Kiến thức tiên quyết
Bạn nên thoải mái với:
- Cú pháp Java cơ bản và các khái niệm hướng đối tượng
- Xử lý ngoại lệ với các khối
try‑catch - Làm việc với các thư viện bên ngoài trong IDE của bạn
Nếu bạn mới với các thư viện Java của bên thứ ba, đừng lo—chúng tôi sẽ hướng dẫn từng bước.
Cài đặt GroupDocs.Signature cho Java
Bắt đầu với GroupDocs.Signature chỉ mất vài phút. Dưới đây là quy trình thiết lập đầy đủ:
Bước 1: Thêm phụ thuộc
Sử dụng Maven hoặc Gradle để bao gồm thư viện (xem mã ở trên). Sau khi thêm phụ thuộc, làm mới dự án để tải các file JAR.
Bước 2: Nhận giấy phép
GroupDocs cung cấp một số tùy chọn cấp phép:
- Dùng thử miễn phí – Hoàn hảo để thử nghiệm. Tải xuống từ GroupDocs releases.
- Giấy phép tạm thời – Nhận 30 ngày truy cập đầy đủ qua Trang giấy phép tạm thời.
- Giấy phép thương mại – Đối với sử dụng trong môi trường sản xuất, mua giấy phép tại GroupDocs Purchase.
Mẹo chuyên nghiệp: Bắt đầu với bản dùng thử miễn phí để xây dựng bằng chứng khái niệm, sau đó nâng cấp nếu API đáp ứng nhu cầu của bạn.
Bước 3: Khởi tạo cơ bản
Lớp Signature là điểm vào để tải PDF vào bộ nhớ và cung cấp các phương thức tìm kiếm, xác thực và trích xuất.
import com.groupdocs.signature.Signature;
String filePath = "YOUR_DOCUMENT_DIRECTORY/sample_signed.pdf"; // Replace with your PDF path
Signature signature = new Signature(filePath);
Quan trọng: Đảm bảo đường dẫn tệp sử dụng dấu gạch chéo ngược đôi trên Windows (C:\\Documents\\file.pdf) để tránh vấn đề escape.
Hướng dẫn triển khai
Bây giờ là phần thú vị—hãy viết mã để tìm kiếm mã vạch trong PDF của bạn.
Tìm kiếm chữ ký mã vạch trong tài liệu
Chúng ta sẽ chia triển khai thành ba bước rõ ràng.
Bước 1: Khởi tạo đối tượng Signature
Signature là lớp cốt lõi đại diện cho một tài liệu PDF trong bộ nhớ.
import com.groupdocs.signature.Signature;
String filePath = "YOUR_DOCUMENT_DIRECTORY/sample_signed.pdf"; // Replace with actual file path
Signature signature = new Signature(filePath);
Điều gì đang xảy ra ở đây – Đối tượng Signature mở PDF của bạn và chuẩn bị cho việc xử lý. Hãy nghĩ nó như mở một tệp trong trình soạn thảo văn bản; bạn đang tải tài liệu để có thể truy vấn.
Real‑World Note – Khi xử lý PDF do người dùng tải lên, luôn xác thực đường dẫn tệp và kiểm tra tồn tại trước khi tạo đối tượng Signature. Điều này ngăn ngừa lỗi “file not found” khó hiểu sau này.
Bước 2: Tạo BarcodeSearchOptions
BarcodeSearchOptions cho engine biết cần tìm gì và ở đâu.
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
Định nghĩa: BarcodeSearchOptions cấu hình các tham số tìm kiếm mã vạch như phạm vi trang, loại mã vạch và độ chính xác phát hiện.
Các tùy chọn cấu hình chính
setAllPages(true): Quét mọi trang. Đặt thànhfalsevà chỉ địnhsetPageNumber()khi bạn biết trang cụ thể.setEncodeType(BarcodeEncodeType.QR): Giới hạn tìm kiếm chỉ ở mã QR, giảm thời gian xử lý tới 60 % trên các PDF lớn.
Why This Matters – Nếu hóa đơn của bạn luôn đặt mã QR ở trang 1, quét toàn bộ tài liệu sẽ lãng phí CPU.
Bước 3: Thực thi tìm kiếm và xử lý kết quả
Chạy tìm kiếm, sau đó lặp qua các kết quả.
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();
}
}
Định nghĩa: BarcodeSignature đại diện cho một mã vạch được phát hiện, cung cấp loại, văn bản đã giải mã, số trang và giới hạn hình học.
What This Code Does
- Gọi
signature.search()để lấy danh sách các đối tượngBarcodeSignature. - Kiểm tra xem có mã vạch nào được tìm thấy không để tránh ngoại lệ null‑pointer.
- Trích xuất loại, văn bản, số trang và kích thước cho mỗi kết quả.
- Bao toàn bộ thao tác trong khối
try‑catchđể xử lý mềm mại các PDF hỏng hoặc tệp thiếu. - Giải phóng thể hiện
Signaturetrong khốifinally, giải phóng bộ nhớ.
Real‑World Application – Trong quy trình nhãn vận chuyển, bạn sẽ lưu getText() (số theo dõi) vào cơ sở dữ liệu, và dùng getPageNumber() để ánh xạ nhãn trở lại tệp batch gốc.
Lọc theo loại mã vạch
Nếu bạn biết định dạng mã vạch chính xác, hãy lọc để tăng tốc phát hiện:
import com.groupdocs.signature.domain.barcodes.BarcodeTypes;
BarcodeSearchOptions options = new BarcodeSearchOptions();
options.setEncodeType(BarcodeTypes.QR); // Only search for QR codes
options.setAllPages(true);
When to Filter – Giới hạn tìm kiếm chỉ một loại (ví dụ QR) có thể giảm mức tiêu thụ CPU 30‑50 % trên các tài liệu có nhiều yếu tố hình ảnh.
Các loại mã vạch được hỗ trợ
GroupDocs.Signature có thể phát hiện một loạt các định dạng mã vạch. Dưới đây là tham chiếu nhanh:
Mã vạch 1D (Linear)
- Code128 – phổ biến trong vận chuyển và đóng gói
- Code39 – được sử dụng trong ô tô và quốc phòng
- EAN13/EAN8 – mã vạch sản phẩm bán lẻ
- UPC‑A/UPC‑E – tiêu chuẩn bán lẻ Bắc Mỹ
- Interleaved2of5 – kho và phân phối
Mã vạch 2D (Matrix)
- QR Code – phổ biến nhất, lưu trữ URL, thông tin Wi‑Fi, v.v.
- Data Matrix – gọn nhẹ, lý tưởng cho các thành phần siêu nhỏ
- PDF417 – giấy tờ tùy thân của chính phủ, vé lên máy bay, giấy phép lái xe
- Aztec Code – vé giao thông
Lọc theo loại (như đã minh họa ở trên) giúp bạn tập trung vào định dạng cần thiết.
Trường hợp sử dụng thực tế
1. Xử lý hóa đơn tự động
Kịch bản: Bộ phận kế toán nhận hơn 500 hóa đơn nhà cung cấp mỗi ngày dưới dạng PDF.
Giải pháp: Quét mỗi PDF để tìm mã Code39 chứa số hóa đơn, sau đó tự động so sánh với đơn đặt hàng trong hệ thống ERP. Điều này loại bỏ nhập liệu thủ công và giảm lỗi tới 85 %.
// Pseudo-code workflow
for (PDF invoice : invoiceBatch) {
List<BarcodeSignature> barcodes = searchBarcodes(invoice);
String invoiceNumber = barcodes.get(0).getText();
updateERPSystem(invoiceNumber, invoice);
}
2. Cập nhật tồn kho kho
Kịch bản: Một kho nhận lô hàng với danh sách đóng gói PDF nhúng SKU sản phẩm dưới dạng mã EAN13.
Giải pháp: Trích xuất tất cả mã vạch từ danh sách đóng gói, tự động cập nhật số lượng tồn kho, và đánh dấu các sai lệch để kiểm tra thủ công.
3. Xác thực tài liệu
Kịch bản: Hợp đồng pháp lý bao gồm mã QR chứa chữ ký mật mã để xác thực tính xác thực.
Giải pháp: Tìm kiếm mã QR trong hợp đồng đã ký, giải mã dữ liệu chữ ký và xác thực với cơ quan chứng chỉ đáng tin cậy. Điều này đảm bảo tài liệu không bị giả mạo.
4. Quản lý hồ sơ y tế
Kịch bản: Hồ sơ bệnh nhân chứa báo cáo xét nghiệm PDF với mã Code128 cho ID mẫu.
Giải pháp: Tự động trích xuất ID mẫu và liên kết kết quả xét nghiệm với hồ sơ bệnh nhân trong hệ thống HIS, giảm thời gian tra cứu từ phút xuống giây.
Các vấn đề thường gặp và giải pháp
Vấn đề 1: “Không tìm thấy mã vạch” (Mặc dù chúng tồn tại)
Nguyên nhân có thể
- Độ phân giải hình ảnh thấp (dưới 200 DPI)
- Mã vạch quá nhỏ đối với công cụ phát hiện
- Bộ lọc loại mã vạch sai
Giải pháp
- Tăng DPI – Quét ở 300 DPI hoặc cao hơn.
- Bỏ bộ lọc loại – Đầu tiên tìm kiếm tất cả các loại mã vạch, sau đó thu hẹp.
- Xác thực chất lượng hình ảnh – Mở PDF trong Adobe Acrobat, phóng to 200 % và đảm bảo mã vạch rõ nét.
Vấn đề 2: OutOfMemoryError với PDF lớn
Nguyên nhân – Tải PDF 500 trang với hình ảnh độ phân giải cao tiêu tốn nhiều bộ nhớ heap.
Giải pháp – Xử lý các trang theo lô thay vì tải toàn bộ tệp:
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...
}
Cũng nên tăng bộ nhớ heap của JVM (-Xmx4g) cho các batch rất lớn.
Vấn đề 3: Hiệu năng chậm trên tài liệu đa trang
Nguyên nhân – Quét mọi trang theo thứ tự có thể tốn thời gian.
Giải pháp
- Target Specific Pages – Nếu mã vạch luôn ở trang 1, đặt
setAllPages(false)vàsetPageNumber(1). - Cache Results – Lưu dữ liệu mã vạch sau lần quét đầu tiên để tránh xử lý lại cùng một tệp.
- Use SSD Storage – I/O nhanh hơn có thể giảm thời gian tải 60‑70 % so với HDD.
Vấn đề 4: Dương tính giả (Mẫu ngẫu nhiên bị nhận dạng là mã vạch)
Nguyên nhân – Bảng hoặc đường lưới có thể bị nhầm thành mã vạch.
Giải pháp – Xác thực độ dài và mẫu văn bản đã giải mã trước khi chấp nhận:
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);
}
}
Mẹo hiệu năng cho tài liệu lớn
1. Chiến lược xử lý batch
Tận dụng thread pool để xử lý đồng thời nhiều 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);
Kết quả: Xử lý 1 000 tệp giảm từ ~2 giờ xuống ~30 phút trên máy quad‑core.
2. Giảm phạm vi tìm kiếm
Nếu mã vạch luôn xuất hiện ở cùng một vùng, hãy giới hạn khu vực tìm kiếm:
// Only search the top‑right corner where barcodes are typically placed
options.setRectangle(new Rectangle(400, 50, 150, 150)); // X, Y, Width, Height
Kết quả: Tăng tốc 40‑60 % trên các tài liệu có bố cục nhất quán.
3. Giám sát việc sử dụng bộ nhớ
Đối với các batch job chạy lâu, định kỳ gọi garbage collection:
Runtime runtime = Runtime.getRuntime();
long usedMemory = runtime.totalMemory() - runtime.freeMemory();
if (usedMemory > (runtime.maxMemory() * 0.8)) {
System.gc(); // Suggest garbage collection
}
Thực hành tốt
1. Luôn giải phóng đối tượng Signature
Signature implements AutoCloseable; using try‑with‑resources guarantees cleanup:
try (Signature signature = new Signature(filePath)) {
// Your search code here...
} // Automatically disposed
2. Xác thực tệp đầu vào
Never trust external paths blindly. Verify existence and PDF validity first:
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. Ghi nhật ký kết quả phát hiện mã vạch
Maintain an audit trail for compliance and debugging:
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. Xử lý các định dạng mã vạch khác nhau
Create a flexible method that accepts a list of BarcodeEncodeType values, so you can adapt to new standards without code changes:
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. Kiểm tra với tài liệu thực tế
Sử dụng hóa đơn quét có vết cà phê, nhãn vận chuyển fax có nhiễu, và ảnh điện thoại di động độ phân giải thấp chuyển thành PDF. Điều này phát hiện các trường hợp góc mà các PDF mẫu sạch sẽ không tiết lộ.
GroupDocs.Signature phát hiện mã QR trong PDF như thế nào?
Load the PDF with a Signature instance, configure BarcodeSearchOptions to target QR codes, and call search(). The engine internally renders each page to a bitmap at 150 DPI, runs a fast Z‑Bar based decoder, and returns BarcodeSignature objects containing the decoded text and geometric data. This process completes in under 5 seconds for a 300‑page document on a typical 8‑core server.
Câu hỏi thường gặp
Q: Tôi có thể đọc file PDF chứa mã QR mà không có giấy phép không?
A: Bản dùng thử miễn phí cho phép bạn đọc file PDF chứa mã QR để đánh giá, nhưng giấy phép thương mại là bắt buộc cho triển khai sản xuất.
Q: API có hỗ trợ PDF được bảo mật bằng mật khẩu không?
A: Có. Chuyển mật khẩu khi tạo đối tượng Signature, ví dụ new Signature(filePath, "password").
Q: Làm thế nào để cải thiện phát hiện trên các bản scan độ phân giải thấp?
A: Quét tối thiểu 200 DPI, bật setEncodeType(BarcodeEncodeType.QR), và cân nhắc tiền xử lý PDF bằng bộ lọc giảm nhiễu.
Q: Tìm kiếm có an toàn với đa luồng cho xử lý song song không?
A: Mỗi luồng nên tạo một thể hiện Signature riêng. API an toàn với đa luồng khi sử dụng theo cách này.
Q: Phiên bản GroupDocs.Signature nào được kiểm tra với tutorial này?
A: Mã đã được xác thực với GroupDocs.Signature 23.12, hỗ trợ hơn 50 định dạng mã vạch và có thể xử lý PDF hàng trăm trang mà không cần tải toàn bộ tệp vào bộ nhớ.
Kết luận
Bạn vừa học cách read QR code PDF tài liệu bằng Java và GroupDocs.Signature API. Dưới đây là tóm tắt nhanh:
- Cài đặt – Thêm phụ thuộc Maven/Gradle, nhận giấy phép và khởi tạo
Signature. - Triển khai – Cấu hình
BarcodeSearchOptions, chạysearch(), và xử lý kết quảBarcodeSignature. - Các loại được hỗ trợ – Hơn 50 định dạng mã vạch, bao gồm QR, Data Matrix, PDF417, Code128 và EAN13.
- Trường hợp sử dụng thực tế – Tự động hoá hóa đơn, cập nhật tồn kho, xác thực tài liệu và quản lý hồ sơ y tế.
- Khắc phục sự cố – Giải pháp cho việc không tìm thấy mã vạch, lỗi bộ nhớ, tắc nghẽn hiệu năng và dương tính giả.
- Hiệu năng – Xử lý batch, giới hạn phạm vi trang và I/O SSD cải thiện đáng kể thông lượng.
GroupDocs.Signature trừu tượng hoá các bước render PDF phức tạp và giải mã mã vạch, cho phép bạn tập trung vào logic kinh doanh quan trọng. Dù bạn đang xây dựng một tiện ích nhỏ hay một pipeline xử lý tài liệu quy mô lớn, giờ đây bạn đã có một giải pháp đáng tin cậy, hiệu năng cao.
Cập nhật lần cuối: 2026-07-15
Kiểm tra với: GroupDocs.Signature 23.12
Tác giả: GroupDocs