Wyszukiwanie stron z kodami kreskowymi w dokumentach przy użyciu Javy

Wprowadzenie

Spędziłeś godziny na ręcznym weryfikowaniu podpisów w setkach dokumentów? Nie jesteś sam. Niezależnie od tego, czy tworzysz system zarządzania umowami, automatyzujesz przetwarzanie faktur, czy zabezpieczasz rekordy medyczne, ręczne wyszukiwanie i weryfikacja kodów kreskowych jest żmudna i podatna na błędy. W tym samouczku nauczysz się, jak wyszukiwać strony z kodami kreskowymi w Javie przy użyciu GroupDocs.Signature, aby programowo celować tylko w istotne strony, monitorować postęp w czasie rzeczywistym i obsługiwać różne formaty kodów kreskowych kilkoma liniami kodu Java.

Czego się nauczysz

  • Konfiguracja GroupDocs.Signature w projekcie Java (≈5 minut)
  • Subskrypcja zdarzeń wyszukiwania w celu śledzenia postępu w czasie rzeczywistym
  • Konfigurowanie inteligentnych opcji wyszukiwania, aby celować w określone strony
  • Wykonywanie wyszukiwania i efektywne przetwarzanie wyników

Szybkie odpowiedzi

  • Która biblioteka pomaga wyszukiwać konkretne strony z kodami kreskowymi? GroupDocs.Signature for Java
  • Typowy czas konfiguracji? Około 5 minut na dodanie zależności Maven/Gradle i licencji
  • Czy mogę ograniczyć wyszukiwanie do pierwszej i ostatniej strony? Tak – użyj PagesSetup, aby określić dokładne strony
  • Jakie formaty kodów kreskowych są obsługiwane? QR Code, Code128, Code39, DataMatrix, EAN/UPC i inne
  • Czy potrzebna jest płatna licencja w produkcji? Pełna licencja jest wymagana w produkcji; wersja próbna działa w ocenie

Co to jest „wyszukiwanie stron z kodami kreskowymi”?

Wyszukiwanie stron z kodami kreskowymi oznacza poinstruowanie silnika podpisu, aby szukał podpisów kodów kreskowych tylko na wybranych przez Ciebie stronach — np. pierwszej, ostatniej lub w dowolnym niestandardowym zakresie. Takie ukierunkowane podejście przyspiesza przetwarzanie, zmniejsza zużycie pamięci i umożliwia budowanie responsywnego interfejsu użytkownika.

Dlaczego używać GroupDocs.Signature do tego zadania?

GroupDocs.Signature udostępnia wysokopoziomowe API, które ukrywa szczegóły dekodowania kodów kreskowych, renderowania stron i obsługi formatów dokumentów. Obsługuje ponad 20 formatów kodów kreskowych i może przetwarzać dokumenty wielostronicowe bez ładowania całego pliku do pamięci, co pozwala skupić się na logice biznesowej zamiast na parsowaniu plików.

Wymagania wstępne

  • JDK 8+ zainstalowane
  • Maven lub Gradle do zarządzania zależnościami
  • Podstawowa znajomość klas, metod i obsługi wyjątków w Javie
  • Dostęp do licencji GroupDocs.Signature (próbna lub pełna)

Konfiguracja GroupDocs.Signature dla Javy

Konfiguracja Maven

Dodaj zależność do swojego pom.xml:

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

Konfiguracja Gradle

Albo umieść ją w build.gradle:

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

Preferujesz ręczne pobrania? Najnowszą wersję możesz pobrać bezpośrednio ze strony pobierania GroupDocs.

Uzyskanie licencji

  • Bezpłatna wersja próbna – rozpocznij od razu, bez zobowiązań
  • Licencja tymczasowa – pełny dostęp do funkcji w ocenie
  • Pełna licencja – gotowa do produkcji, nieograniczone użycie

Zweryfikuj instalację krótkim fragmentem inicjalizacyjnym:

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: Zastąp "YOUR_DOCUMENT_PATH" rzeczywistą ścieżką do pliku PDF, DOCX lub XLSX. Jeśli konsola wyświetli komunikat o sukcesie, jesteś gotowy do działania.

Zrozumienie typów podpisów kodów kreskowych

Kody kreskowe osadzają dane odczytywane maszynowo wewnątrz dokumentu. W przeciwieństwie do odręcznych podpisów, mogą przechowywać identyfikatory, znaczniki czasu, URL‑e lub ładunki JSON, co czyni je idealnymi do automatycznej weryfikacji.

Typ kodu kreskowegoNajlepsze zastosowanieTypowa długość danych
QR CodeDane o wysokiej gęstości, URL‑e, tekst wieloliniowyDo 4 296 znaków
Code128Alfanumeryczne numery śledzeniaZmienna
Code39Proste, starsze kodyDo 43 znaków
DataMatrixMałe etykiety, rekordy medyczneDo 2 335 znaków
EAN/UPCIdentyfikacja produktów, handel detaliczny8‑13 cyfr

Często używasz kodów kreskowych, gdy potrzebne jest szybkie odczytywanie maszynowe, strukturalne dane lub podpisy odporne na manipulacje.

Jak wyszukać strony z kodami kreskowymi w Javie?

Signature to główna klasa reprezentująca dokument do przetworzenia. Załaduj dokument przy pomocy new Signature("file.pdf"), BarcodeSearchOptions definiuje parametry wyszukiwania kodów kreskowych, skonfiguruj ją, aby celowała w pożądane strony, i wywołaj signature.search(options). Metoda search wykonuje operację wyszukiwania przy użyciu podanych opcji. Silnik zwraca listę obiektów BarcodeSignature, które zawierają numery stron, zdekodowany tekst i współrzędne geometryczne — wszystko w jednym wywołaniu. Ten jednoczesny wzorzec eliminuje potrzebę osobnego wyodrębniania obrazów czy własnej logiki dekodowania.

Teraz, gdy rozumiesz ogólny przepływ, przejdźmy do trzech kluczowych funkcji, które zaimplementujesz.

Funkcja 1: Subskrypcja zdarzeń wyszukiwania dokumentu

Dlaczego to ważne

Podczas przetwarzania dużych partii, informacje zwrotne w czasie rzeczywistym (np. paski postępu) poprawiają UX i pomagają wykrywać zacięcia we wczesnym stadium.

Definicja kotwicy

Signature reprezentuje dokument i udostępnia możliwości subskrypcji zdarzeń.

Implementacja

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");
    }
});

Te trzy obsługiwacze dostarczają czasu rozpoczęcia, bieżącego postępu i końcowych statystyk — idealne do logowania lub aktualizacji UI.

Funkcja 2: Konfiguracja opcji wyszukiwania kodów kreskowych dla konkretnych stron

Dlaczego precyzyjna kontrola ma znaczenie

Skanowanie każdej strony 200‑stronicowej umowy marnuje cykle CPU. Celowanie tylko w pierwszą i ostatnią stronę może skrócić czas działania nawet o 80 %.

Definicja kotwicy

PagesSetup określa, które strony są uwzględniane w operacji wyszukiwania.

Implementacja

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");
  • Typy dopasowań pozwalają precyzyjnie dostroić wyszukiwanie tekstu (Contains, Exact, StartsWith, EndsWith).
  • Dostosuj setAllPages i PagesSetup, aby wyszukiwać tylko konkretne strony z kodami kreskowymi.

Funkcja 3: Wykonanie wyszukiwania i przetwarzanie wyników

Dlaczego ten krok jest istotny

Znalezienie kodów kreskowych to dopiero połowa historii — musisz zrobić coś z danymi (np. zweryfikować, zapisać lub uruchomić przepływy pracy).

Definicja kotwicy

BarcodeSignature reprezentuje wykryty kod kreskowy i zawiera jego właściwości, takie jak numer strony i zdekodowany tekst.

Implementacja

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);
}

Masz teraz listę obiektów BarcodeSignature, z których każdy udostępnia:

  • getPageNumber() – na której stronie znajduje się kod
  • getEncodeType() – QR, Code128, itp.
  • getText() – zdekodowany ładunek
  • Pozycję (getLeft(), getTop()) i rozmiar (getWidth(), getHeight())

Przykład: Przetwarzaj tylko kody QR na ostatniej stronie

for (BarcodeSignature barcodeSignature : signatures) {
    if (barcodeSignature.getPageNumber() == lastPageNumber 
        && barcodeSignature.getEncodeType().equals("QRCode")) {
        // Process only QR codes from the final page
        processApprovalCode(barcodeSignature.getText());
    }
}

Zastosowania w rzeczywistym świecie

ScenariuszJak wyszukiwanie stron z kodami kreskowymi pomaga
Weryfikacja umów prawnychAutomatyczna weryfikacja hashy certyfikatów zakodowanych w QR na stronie podpisu
Śledzenie w łańcuchu dostawLokalizacja identyfikatorów przesyłek Code128 na pierwszej/ostatniej stronie manifestów
Formularze zgody medycznejWyodrębnianie identyfikatorów pacjentów DataMatrix z końcowej strony zgody
Automatyzacja fakturZnalezienie kodów kreskowych z prefiksem „APPR‑” w dowolnym miejscu faktury, a następnie ich kierowanie

Typowe problemy i rozwiązania

Problem 1 – Brak wyników mimo widocznych kodów kreskowych

// Ensure you are not limiting pages too aggressively
options.setAllPages(true);

Jeśli kod kreskowy jest osadzony jako obraz rastrowy, rozważ użycie GroupDocs.Image do wykrywania opartego na obrazie.

Problem 2 – Wolna wydajność przy dużych plikach

PagesSetup pagesSetup = new PagesSetup();
pagesSetup.setLastPage(true);  // Most signatures are on the last page
pagesSetup.setFirstPage(true);
options.setPagesSetup(pagesSetup);

Ukierunkowane strony drastycznie skracają czas przetwarzania; 150‑stronicowy PDF spada z ~4 sekund do <1 sekundy po ograniczeniu wyszukiwania do dwóch stron.

Problem 3 – TextMatchType nie znajduje oczekiwanych kodów kreskowych

String searchText = "12345".trim().toLowerCase();
options.setText(searchText);
options.setMatchType(TextMatchType.StartsWith); // Try a more permissive mode

Problem 4 – Wycieki pamięci w długotrwałych pętlach

try (Signature signature = new Signature("document.pdf")) {
    List<BarcodeSignature> signatures = signature.search(BarcodeSignature.class, options);
    // Process signatures
}

Blok try‑with‑resources automatycznie zwalnia instancję Signature.

Najlepsze praktyki dla produkcji

Solidna obsługa błędów

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);
}

Buforowanie wyników, gdy dokumenty są niezmienne

Map<String, List<BarcodeSignature>> cache = new ConcurrentHashMap<>();

public List<BarcodeSignature> getCachedSignatures(String docId) {
    return cache.computeIfAbsent(docId, id -> performSearch(id));
}

Używanie zdarzeń postępu dla informacji zwrotnej UI

signature.SearchProgress.add(new ProcessProgressEventHandler() {
    public void invoke(Signature sender, ProcessProgressEventArgs args) {
        int percent = (args.getProcessedSignatures() * 100) / args.getTotalSignatures();
        updateProgressBar(percent);
    }
});

Walidacja ładunków kodów kreskowych

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);
    }
}

Optymalizacja wyboru stron w zależności od typu dokumentu

PagesSetup contractsSetup = new PagesSetup();
contractsSetup.setLastPage(true); // Contracts usually signed on last page
options.setPagesSetup(contractsSetup);

Filtrowanie po typie kodu kreskowego po wyszukiwaniu (jeśli potrzebujesz tylko kodów QR)

for (BarcodeSignature sig : signatures) {
    if ("QRCode".equals(sig.getEncodeType())) {
        // Process QR code
    }
}

Wyodrębnianie wymiarów obrazu kodu kreskowego (jeśli potrzebne do renderowania)

for (BarcodeSignature sig : signatures) {
    int width = sig.getWidth();
    int height = sig.getHeight();
    // Use dimensions for overlay or thumbnail generation
}

Najczęściej zadawane pytania

P: Czy mogę wyszukać wiele formatów kodów kreskowych w jednym wywołaniu?
O: Tak. BarcodeSearchOptions domyślnie przeszukuje wszystkie obsługiwane formaty. Filtruj wyniki po getEncodeType(), jeśli potrzebujesz tylko określonych typów.

P: Jak obsłużyć dokumenty zawierające zarówno kody kreskowe, jak i podpisy obrazkowe?
O: Uruchom oddzielne wyszukiwania — użyj BarcodeSignature.class dla kodów kreskowych i ImageSignature.class dla podpisów obrazkowych, a następnie połącz wyniki w razie potrzeby.

P: Jaki jest wpływ wydajności przy przeszukiwaniu wszystkich stron vs. konkretnych stron?
O: Skanowanie każdej strony 50‑stronicowego PDF może trwać 3–5 sekund. Ograniczenie do pierwszej + ostatniej strony zazwyczaj kończy się w mniej niż 1 sekundzie.

P: Czy to działa z zeskanowanymi PDF‑ami (obrazami rastrowymi)?
O: Tylko jeśli kod kreskowy został dodany jako obiekt cyfrowego podpisu. Dla samych obrazów rastrowych potrzebny jest rozpoznawacz oparty na obrazie (np. GroupDocs.Barcode).

P: Jak mogę zweryfikować, że podpis kodu kreskowego nie został podrobiony?
O: Osadź hash lub podpis cyfrowy w ładunku kodu kreskowego, a następnie przelicz hash na oryginalnych danych i porównaj. Wymaga to oryginalnego klucza podpisującego lub certyfikatu.


Ostatnia aktualizacja: 2026-06-21
Testowano z: GroupDocs.Signature 23.12 for Java
Autor: GroupDocs

Powiązane samouczki