Tìm kiếm các trang cụ thể chứa mã vạch trong tài liệu bằng Java

Giới thiệu

Bạn đã bao giờ dành hàng giờ để kiểm tra chữ ký một cách 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 hóa đơ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à công việc tẻ nhạt và dễ gây lỗi. Trong hướng dẫn này bạn sẽ học cách tìm kiếm các trang mã vạch bằng Java với GroupDocs.Signature, giúp bạn chỉ định mục tiêu cho những trang quan trọng, giám sát tiến độ theo thời gian thực, và xử lý đa dạng các định dạng mã vạch chỉ với vài dòng mã Java.

Bạn sẽ học được

  • Cài đặt GroupDocs.Signature trong dự án Java (≈5 phút)
  • Đăng ký sự kiện tìm kiếm để theo dõi tiến độ 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ể chứa 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à nhiều 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 môi trường sản xuất; bản dùng thử hoạt động cho mục đích đánh giá

Tìm kiếm các trang cụ thể chứa mã vạch là gì?

Tìm kiếm các trang cụ thể chứa mã vạch có nghĩa là chỉ đạo engine chữ ký chỉ tìm kiếm mã vạ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 nhanh chóng.

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 giúp 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ợ hơn 20 định dạng mã vạch và có thể xử lý tài liệu hàng trăm trang mà không cần tải toàn bộ file vào bộ nhớ, cho phép bạn tập trung vào logic nghiệp vụ thay vì phân tích file.

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ệ
  • Truy cập giấy phép GroupDocs.Signature (bản 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 đưa vào build.gradle:

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

Bạn muốn tải về thủ công? Bạn có thể lấy bản phát hành mới nhất trực tiếp từ GroupDocs download page.

Lấy giấy phép của bạn

  • Free Trial – Dùng thử miễn phí – bắt đầu ngay, không ràng buộc
  • Temporary License – Giấy phép tạm thời – truy cập đầy đủ tính năng để đánh giá
  • Full License – 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.");
    }
}

Pro tip: Thay thế "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 vào trong tài liệu. Không giống như chữ ký viết tay, chúng có thể lưu trữ ID, thời gian, URL, hoặc payload JSON, rất phù hợp cho việc xác thực tự động.

Loại Mã VạchSử dụng Tốt Nhất ChoĐộ Dài Dữ Liệu Điển Hình
QR CodeDữ liệu mật độ cao, URL, văn bản đa dòngTối đa 4.296 ký tự
Code128Số theo dõi alphanumericBiến đổi
Code39Mã legacy đơn giảnTối đa 43 ký tự
DataMatrixNhãn nhỏ, hồ sơ y tếTối đa 2.335 ký tự
EAN/UPCNhận dạng sản phẩm, bán lẻ8‑13 chữ số

Bạn thường sử dụng mã vạch khi cần đọc nhanh bằng máy, dữ liệu có cấu trúc, hoặc chữ ký không thể bị giả mạo.

Cách tìm kiếm các trang mã vạch bằng Java?

Signature là lớp chính đại diện cho tài liệu cần xử lý. Tải tài liệu bằng new Signature("file.pdf"), BarcodeSearchOptions định nghĩa các tham số tìm kiếm chữ ký mã vạch, cấu hình nó để nhắm mục tiêu các trang mong muốn, và gọi signature.search(options). Phương thức search thực hiện thao tác tìm kiếm dựa trên các tùy chọn đã cung cấp. Engine trả về danh sách các đối tượng BarcodeSignature chứa số trang, văn bản đã giải mã và tọa độ hình học — tất cả trong một lần gọi. Mô hình một‑bước này loại bỏ nhu cầu trích xuất hình ảnh riêng hoặc logic giải mã tùy chỉnh.

Bây giờ bạn đã nắm rõ luồng tổng thể, hãy đi sâu vào ba tính năng cốt lõi bạn sẽ triển khai.

Tính năng 1: Đăng ký 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 điểm dừng.

Anchor định nghĩa

Signature đại diện cho tài liệu và cung cấp khả năng đăng ký sự kiện.

Triển khai

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 UI.

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ỉ trang đầu và cuối có thể giảm thời gian chạy tới 80 %.

Anchor định nghĩa

PagesSetup chỉ định các trang sẽ được bao gồm trong thao tác tìm kiếm.

Triển khai

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");
  • Match types cho phép bạn tinh chỉnh tìm kiếm văn bản (Contains, Exact, StartsWith, EndsWith).
  • Điều chỉnh setAllPages và PagesSetup để tìm kiếm các trang mã vạch cụ thể 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 thấy 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 quy trình).

Anchor định nghĩa

BarcodeSignature đại diện cho một mã vạch đã được phát hiện và chứa các thuộc tính như số trang và văn bản đã giải mã.

Triển khai

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ó 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ạch
  • getEncodeType() – QR, Code128, v.v.
  • getText() – payload đã 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ảnCách tìm kiếm các trang mã vạch cụ thể giúp
Xác thực hợp đồng pháp lýTự động xác thực hash chứng chỉ được mã QR trên trang chữ ký
Theo dõi chuỗi cung ứngXác định ID lô Code128 trên trang đầu/cuối của manifest
Mẫu đồng ý y tếTrích xuất ID bệnh nhân DataMatrix từ trang đồng ý cuối cùng
Tự động hoá hóa đơnTìm các mã vạch có tiền tố “APPR‑” ở bất kỳ vị trí nào trên hóa đơn, sau đó định tuyến

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 ảnh raster, hãy cân nhắc sử dụng GroupDocs.Image để phát hiện dựa trên ảnh.

Vấn đề 2 – Hiệu suất 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);

Các trang được nhắm mục tiêu giảm đáng kể thời gian xử lý; một PDF 150 trang giảm từ ~4 giây xuống <1 giây khi bạn giới hạn tìm kiếm chỉ ở hai trang.

Vấn đề 3 – TextMatchType không tìm thấy 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 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 instance Signature.

Thực hành tố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 bộ nhớ đệm 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 để hiển thị)

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ý ảnh?
A: Thực hiện các tìm kiếm riêng biệt — dùng BarcodeSignature.class cho mã vạch và ImageSignature.class cho chữ ký ảnh, sau đó kết hợp kết quả theo nhu cầu.

Q: Tác động hiệu suất 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 toàn bộ 50 trang của PDF 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 (ả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à ảnh raster, bạn sẽ cần một bộ nhận dạng mã vạch dựa trên ảnh (ví dụ, GroupDocs.Barcode).

Q: Làm sao tôi xác thực rằng chữ ký mã vạch không bị giả mạo?
A: Nhúng một hash hoặc chữ ký 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. Cách này yêu cầu khóa ký hoặc chứng chỉ gốc.


Last Updated: 2026-06-21
Tested With: GroupDocs.Signature 23.12 for Java
Author: GroupDocs

Các hướng dẫn liên quan