Tìm kiếm các trang cụ thể có mã vạch trong tài liệu bằng Java
Giới thiệu
Bạn đã từng dành hàng giờ để kiểm tra chữ ký thủ công trên hàng trăm tài liệu chưa? Bạn không phải là người duy nhất. Dù bạn đang xây dựng hệ thống quản lý hợp đồng, tự động hoá quy trình xử lý hoá đơn, hay bảo mật hồ sơ y tế, việc theo dõi và xác thực chữ ký mã vạch một cách thủ công là tẻ nhạt và dễ gây lỗi.
Trong hướng dẫn này, chúng tôi sẽ chỉ cho bạn cách tìm kiếm các trang cụ thể có mã vạch trong tài liệu của bạn một cách lập trình bằng Java và GroupDocs.Signature. Khi kết thúc, bạn sẽ có thể phát hiện chữ ký trên các trang đã chọn, giám sát tiến trình tìm kiếm theo thời gian thực, và xử lý nhiều định dạng mã vạch — tất cả với mã sạch sẽ, dễ bảo trì.
Bạn sẽ học gì
- Cài đặt GroupDocs.Signature trong dự án Java (≈5 phút)
- Đăng ký các sự kiện tìm kiếm để theo dõi tiến độ theo thời gian thực
- Cấu hình các tùy chọn tìm kiếm thông minh để nhắm mục tiêu các trang cụ thể
- Thực thi tìm kiếm và xử lý kết quả một cách hiệu quả
Câu trả lời nhanh
- Thư viện nào giúp bạn tìm kiếm các trang cụ thể có mã vạch? GroupDocs.Signature for Java
- Thời gian cài đặt điển hình? Khoảng 5 phút để thêm phụ thuộc Maven/Gradle và giấy phép
- Tôi có thể giới hạn tìm kiếm chỉ ở trang đầu và cuối không? Có – sử dụng
PagesSetupđể chỉ định các trang cụ thể - Các định dạng mã vạch nào được hỗ trợ? QR Code, Code128, Code39, DataMatrix, EAN/UPC, và hơn nữa
- Tôi có cần giấy phép trả phí cho môi trường sản xuất không? Cần giấy phép đầy đủ cho sản xuất; bản dùng thử hoạt động cho việc đánh giá
“Tìm kiếm các trang cụ thể có mã vạch” là gì?
Tìm kiếm các trang cụ thể có mã vạch có nghĩa là chỉ đạo engine chữ ký tìm kiếm các chữ ký mã vạch chỉ trên những trang bạn quan tâm — ví dụ, trang đầu, trang cuối, hoặc bất kỳ phạm vi tùy chỉnh nào. Cách tiếp cận tập trung này giúp tăng tốc xử lý, giảm sử dụng bộ nhớ, và cho phép bạn xây dựng phản hồi UI đáp ứng nhanh.
Tại sao nên sử dụng GroupDocs.Signature cho nhiệm vụ này?
GroupDocs.Signature cung cấp API cấp cao trừu tượng hoá việc giải mã mã vạch, render trang và xử lý định dạng tài liệu. Nó hỗ trợ PDF, DOCX, XLSX và nhiều định dạng khác ngay từ đầu, giúp bạn tập trung vào logic nghiệp vụ thay vì phân tích tệp.
Yêu cầu trước
- JDK 8+ đã được cài đặt
- Maven hoặc Gradle để quản lý phụ thuộc
- Hiểu biết cơ bản về các lớp Java, phương thức và xử lý ngoại lệ
- Có quyền truy cập vào giấy phép GroupDocs.Signature (dùng thử hoặc đầy đủ)
Cài đặt GroupDocs.Signature cho Java
Cài đặt Maven
Thêm phụ thuộc vào pom.xml của bạn:
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-signature</artifactId>
<version>23.12</version>
</dependency>
Cài đặt Gradle
Hoặc bao gồm trong build.gradle:
implementation 'com.groupdocs:groupdocs-signature:23.12'
Bạn muốn tải xuống thủ công? Bạn có thể tải bản phát hành mới nhất trực tiếp từ trang tải xuống GroupDocs.
Lấy giấy phép của bạn
- Dùng thử miễn phí – bắt đầu ngay, không ràng buộc
- Giấy phép tạm thời – truy cập đầy đủ tính năng để đánh giá
- Giấy phép đầy đủ – sẵn sàng cho sản xuất, không giới hạn sử dụng
Xác minh việc cài đặt bằng một đoạn mã khởi tạo nhanh:
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.");
}
}
Mẹo chuyên nghiệp: Thay
"YOUR_DOCUMENT_PATH"bằng một tệp PDF, DOCX hoặc XLSX thực tế. Nếu console in ra thông báo thành công, bạn đã sẵn sàng.
Hiểu các loại chữ ký mã vạch
Mã vạch nhúng dữ liệu có thể đọc được bằng máy bên trong tài liệu. Không giống như chữ ký viết tay, chúng có thể lưu trữ ID, dấu thời gian, URL hoặc payload JSON, khiến chúng lý tưởng cho việc xác thực tự động.
| Loại mã vạch | Sử dụng tốt nhất cho | Độ dài dữ liệu điển hình |
|---|---|---|
| QR Code | Dữ liệu mật độ cao, URL, văn bản đa dòng | Up to 4,296 characters |
| Code128 | Alphanumeric tracking numbers | Variable |
| Code39 | Simple legacy codes | Up to 43 characters |
| DataMatrix | Small labels, healthcare records | Up to 2,335 characters |
| EAN/UPC | Product identification, retail | 8‑13 digits |
Bạn thường sử dụng mã vạch khi cần đọc máy nhanh, dữ liệu có cấu trúc, hoặc chữ ký chống giả mạo.
Cách tìm kiếm các trang cụ thể có mã vạch
Chúng tôi sẽ chia triển khai thành ba tính năng tập trung.
Tính năng 1: Đăng ký các sự kiện tìm kiếm tài liệu
Tại sao điều này quan trọng
Khi xử lý các lô lớn, phản hồi thời gian thực (ví dụ, thanh tiến độ) cải thiện UX và giúp bạn phát hiện sớm các trường hợp treo.
Implementation
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");
}
});
Ba trình xử lý này cung cấp thời gian bắt đầu, tiến độ trực tiếp và thống kê cuối cùng — hoàn hảo cho việc ghi log hoặc cập nhật giao diện người dùng.
Tính năng 2: Cấu hình tùy chọn tìm kiếm mã vạch cho các trang cụ thể
Tại sao kiểm soát chi tiết quan trọng
Quét mọi trang của hợp đồng 200 trang lãng phí CPU. Nhắm mục tiêu chỉ các trang đầu và cuối có thể giảm thời gian chạy tới 80 %.
Implementation
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");
- Kiểu khớp cho phép bạn tinh chỉnh tìm kiếm văn bản (
Contains,Exact,StartsWith,EndsWith). - Điều chỉnh
setAllPagesvàPagesSetupđể chỉ tìm kiếm các trang cụ thể có mã vạch.
Tính năng 3: Thực thi tìm kiếm và xử lý kết quả
Tại sao bước này quan trọng
Tìm mã vạch chỉ là một nửa câu chuyện — bạn cần hành động với dữ liệu (ví dụ, xác thực, lưu trữ, hoặc kích hoạt workflow).
Implementation
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);
}
Bạn hiện có một danh sách các đối tượng BarcodeSignature, mỗi đối tượng cung cấp:
getPageNumber()– vị trí trang chứa mã vạchgetEncodeType()– QR, Code128, v.v.getText()– dữ liệu đã giải mã- Vị trí (
getLeft(),getTop()) và kích thước (getWidth(),getHeight())
Ví dụ: Xử lý chỉ các QR code trên trang cuối cùng
for (BarcodeSignature barcodeSignature : signatures) {
if (barcodeSignature.getPageNumber() == lastPageNumber
&& barcodeSignature.getEncodeType().equals("QRCode")) {
// Process only QR codes from the final page
processApprovalCode(barcodeSignature.getText());
}
}
Ứng dụng thực tế
| Kịch bản | Cách tìm kiếm các trang cụ thể có mã vạch giúp |
|---|---|
| Xác thực hợp đồng pháp lý | Tự động xác thực các hash chứng chỉ được mã hoá QR trên trang chữ ký |
| Theo dõi chuỗi cung ứng | Xác định mã ID lô hàng Code128 trên các trang đầu/cuối của manifest |
| Mẫu đồng ý y tế | Trích xuất mã DataMatrix của bệnh nhân từ trang đồng ý cuối cùng |
| Tự động hoá hoá đơn | Tìm các mã vạch có tiền tố “APPR‑” ở bất kỳ vị trí nào trên hoá đơn, sau đó định tuyến |
Các vấn đề thường gặp và giải pháp
Vấn đề 1 – Không có kết quả mặc dù có mã vạch hiển thị
// Ensure you are not limiting pages too aggressively
options.setAllPages(true);
Nếu mã vạch được nhúng dưới dạng hình raster, hãy cân nhắc sử dụng GroupDocs.Image để phát hiện dựa trên hình ảnh.
Vấn đề 2 – Hiệu năng chậm trên tệp lớn
PagesSetup pagesSetup = new PagesSetup();
pagesSetup.setLastPage(true); // Most signatures are on the last page
pagesSetup.setFirstPage(true);
options.setPagesSetup(pagesSetup);
Việc nhắm mục tiêu các trang sẽ giảm đáng kể thời gian xử lý.
Vấn đề 3 – TextMatchType không tìm thấy các mã vạch mong muốn
String searchText = "12345".trim().toLowerCase();
options.setText(searchText);
options.setMatchType(TextMatchType.StartsWith); // Try a more permissive mode
Vấn đề 4 – Rò rỉ bộ nhớ trong các vòng lặp chạy lâu
try (Signature signature = new Signature("document.pdf")) {
List<BarcodeSignature> signatures = signature.search(BarcodeSignature.class, options);
// Process signatures
}
Khối try‑with‑resources sẽ tự động giải phóng đối tượng Signature.
Các thực tiễn tốt nhất cho môi trường sản xuất
Xử lý lỗi mạnh mẽ
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);
}
Lưu cache kết quả khi tài liệu không thay đổi
Map<String, List<BarcodeSignature>> cache = new ConcurrentHashMap<>();
public List<BarcodeSignature> getCachedSignatures(String docId) {
return cache.computeIfAbsent(docId, id -> performSearch(id));
}
Sử dụng sự kiện tiến độ cho phản hồi UI
signature.SearchProgress.add(new ProcessProgressEventHandler() {
public void invoke(Signature sender, ProcessProgressEventArgs args) {
int percent = (args.getProcessedSignatures() * 100) / args.getTotalSignatures();
updateProgressBar(percent);
}
});
Xác thực dữ liệu payload của mã vạch
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);
}
}
Tối ưu lựa chọn trang theo loại tài liệu
PagesSetup contractsSetup = new PagesSetup();
contractsSetup.setLastPage(true); // Contracts usually signed on last page
options.setPagesSetup(contractsSetup);
Lọc theo loại mã vạch sau khi tìm kiếm (nếu chỉ cần QR code)
for (BarcodeSignature sig : signatures) {
if ("QRCode".equals(sig.getEncodeType())) {
// Process QR code
}
}
Trích xuất kích thước hình ảnh mã vạch (nếu cần để render)
for (BarcodeSignature sig : signatures) {
int width = sig.getWidth();
int height = sig.getHeight();
// Use dimensions for overlay or thumbnail generation
}
Câu hỏi thường gặp
Q: Tôi có thể tìm kiếm nhiều định dạng mã vạch trong một lần gọi không?
A: Có. BarcodeSearchOptions mặc định tìm kiếm tất cả các định dạng được hỗ trợ. Lọc kết quả bằng getEncodeType() nếu bạn chỉ cần các loại cụ thể.
Q: Làm sao tôi xử lý tài liệu chứa cả mã vạch và chữ ký hình ảnh?
A: Chạy các tìm kiếm riêng biệt — dùng BarcodeSignature.class cho mã vạch và ImageSignature.class cho chữ ký hình ảnh, sau đó kết hợp kết quả theo nhu cầu.
Q: Tác động hiệu năng của việc tìm kiếm toàn bộ trang so với các trang cụ thể là gì?
A: Quét mọi trang của PDF 50 trang có thể mất 3–5 giây. Giới hạn chỉ trang đầu + cuối thường hoàn thành dưới 1 giây.
Q: Điều này có hoạt động với PDF đã quét (hình raster) không?
A: Chỉ khi mã vạch được thêm dưới dạng đối tượng chữ ký kỹ thuật số. Đối với mã vạch chỉ là raster, bạn sẽ cần một bộ nhận dạng mã vạch dựa trên hình ảnh (ví dụ, GroupDocs.Barcode).
Q: Làm sao tôi xác thực rằng một chữ ký mã vạch không bị giả mạo?
A: Nhúng một hash hoặc chữ ký kỹ thuật số vào payload của mã vạch, sau đó tính lại hash trên dữ liệu gốc và so sánh. Điều này yêu cầu khóa ký hoặc chứng chỉ gốc.
Cập nhật lần cuối: 2026-01-29
Kiểm tra với: GroupDocs.Signature 23.12 for Java
Tác giả: GroupDocs