Wyszukiwanie określonych stron z kodami kreskowymi w dokumentach przy użyciu Javy
Wprowadzenie
Czy spędziłeś godziny ręcznie weryfikując podpisy 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 podpisów kodów kreskowych jest żmudna i podatna na błędy.
W tym przewodniku pokażemy, jak programowo wyszukiwać określone strony z kodami kreskowymi w Twoich dokumentach przy użyciu Javy i GroupDocs.Signature. Po zakończeniu będziesz mógł wykrywać podpisy na wybranych stronach, monitorować postęp wyszukiwania w czasie rzeczywistym oraz obsługiwać różne formaty kodów kreskowych – wszystko przy użyciu czystego, łatwego w utrzymaniu kodu.
Co 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ć określone 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 do produkcji? Pełna licencja jest wymagana w środowisku produkcyjnym; wersja próbna działa w celach ewaluacyjnych
Co to jest „wyszukiwanie określonych stron z kodami kreskowymi”?
Wyszukiwanie określonych stron z kodami kreskowymi oznacza poinstruowanie silnika podpisów, aby szukał podpisów kodów kreskowych wyłącznie na stronach, które nas interesują – np. na 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. Działa z PDF, DOCX, XLSX i wieloma innymi formatami od razu, pozwalając skupić się na logice biznesowej zamiast na parsowaniu plików.
Wymagania wstępne
- JDK 8+ zainstalowany
- 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 (wersja próbna lub pełna)
Konfiguracja GroupDocs.Signature dla Javy
Maven Setup
Dodaj zależność do swojego pliku pom.xml:
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-signature</artifactId>
<version>23.12</version>
</dependency>
Gradle Setup
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
- Free Trial – rozpocznij od razu, bez zobowiązań
- Temporary License – pełny dostęp do funkcji w celach ewaluacyjnych
- Full License – 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 odczytywalne maszynowo w dokumencie. W przeciwieństwie do odręcznych podpisów, mogą przechowywać identyfikatory, znaczniki czasu, adresy URL lub ładunki JSON, co czyni je idealnymi do automatycznej weryfikacji.
| Typ kodu kreskowego | Najlepsze zastosowanie | Typowa długość danych |
|---|---|---|
| QR Code | Dane o wysokiej gęstości, URL‑e, tekst wielowierszowy | Do 4 296 znaków |
| Code128 | Alfanumeryczne numery śledzenia | Zmienna |
| Code39 | Proste kody legacy | Do 43 znaków |
| DataMatrix | Małe etykiety, rekordy medyczne | Do 2 335 znaków |
| EAN/UPC | Identyfikacja produktów, handel detaliczny | 8‑13 cyfr |
Często używasz kodów kreskowych, gdy potrzebne jest szybkie odczytywanie maszynowe, strukturalne dane lub podpisy odporne na manipulacje.
Jak wyszukiwać określone strony z kodami kreskowymi
Podzielimy implementację na trzy skoncentrowane funkcje.
Feature 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 wcześnie.
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 interfejsu użytkownika.
Feature 2: Konfiguracja opcji wyszukiwania kodów kreskowych dla określonych stron
Dlaczego precyzyjna kontrola ma znaczenie
Skanowanie każdej strony 200‑stronicowej umowy marnuje zasoby CPU. Skierowanie się tylko na pierwszą i ostatnią stronę może skrócić czas działania o 80 %.
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");
- Match types pozwalają precyzyjnie dopasować wyszukiwanie tekstu (
Contains,Exact,StartsWith,EndsWith). - Dostosuj
setAllPagesiPagesSetup, aby wyszukiwać tylko określone strony z kodami kreskowymi.
Feature 3: Wykonanie wyszukiwania i przetwarzanie wyników
Dlaczego ten krok jest istotny
Znalezienie kodów kreskowych to dopiero połowa historii – musisz podjąć akcję na danych (np. walidację, zapis lub wyzwolenie przepływów pracy).
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()– numer strony, na której znajduje się kodgetEncodeType()– QR, Code128 itp.getText()– zdekodowany ładunek- Pozycję (
getLeft(),getTop()) oraz 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
| Scenariusz | Jak wyszukiwanie określonych stron z kodami kreskowymi pomaga |
|---|---|
| Weryfikacja umów prawnych | Automatyczna weryfikacja hashy certyfikatów zakodowanych w QR na stronie podpisu |
| Śledzenie łańcucha dostaw | Lokalizacja identyfikatorów przesyłek Code128 na pierwszej i ostatniej stronie manifestów |
| Formularze zgody w opiece zdrowotnej | Ekstrakcja identyfikatorów pacjentów DataMatrix z ostatniej strony zgody |
| Automatyzacja faktur | Znalezienie kodów z prefiksem „APPR‑” w dowolnym miejscu faktury i przekierowanie dalej |
Typowe problemy i rozwiązania
Issue 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.
Issue 2 – Niska 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);
Ukierunkowanie na konkretne strony znacząco skraca czas przetwarzania.
Issue 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
Issue 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 po wyszukiwaniu (jeśli potrzebujesz tylko kodów QR)
for (BarcodeSignature sig : signatures) {
if ("QRCode".equals(sig.getEncodeType())) {
// Process QR code
}
}
Ekstrakcja wymiarów obrazu kodu (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. Wyniki możesz odfiltrować przy pomocy 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 osobne 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 w porównaniu z określonymi stronami?
O: Skanowanie każdej strony 50‑stronicowego PDF może zająć 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. W przypadku wyłącznie rastrowych kodów potrzebny będzie rozpoznawacz oparty na obrazie (np. GroupDocs.Barcode).
P: Jak mogę zweryfikować, że podpis kodu kreskowego nie został zmodyfikowany?
O: Umieść hash lub podpis cyfrowy w ładunku kodu, a następnie przelicz hash na oryginalnych danych i porównaj. Wymaga to pierwotnego klucza podpisującego lub certyfikatu.
Ostatnia aktualizacja: 2026-01-29
Testowano z: GroupDocs.Signature 23.12 for Java
Autor: GroupDocs