Cari Halaman Spesifik Barcode dalam Dokumen Menggunakan Java

Pendahuluan

Pernah menghabiskan berjam‑jam memverifikasi tanda tangan secara manual di ratusan dokumen? Anda tidak sendirian. Baik Anda sedang membangun sistem manajemen kontrak, mengotomatisasi pemrosesan faktur, atau mengamankan rekam medis, melacak dan memvalidasi tanda tangan barcode secara manual sangat melelahkan dan rawan kesalahan.

Dalam panduan ini kami akan menunjukkan cara mencari halaman spesifik barcode dalam dokumen Anda secara programatis dengan Java dan GroupDocs.Signature. Pada akhir tutorial, Anda akan dapat mendeteksi tanda tangan pada halaman yang dipilih, memantau kemajuan pencarian secara real‑time, dan menangani berbagai format barcode—semua dengan kode yang bersih dan mudah dipelihara.

Apa yang akan Anda pelajari

  • Menyiapkan GroupDocs.Signature dalam proyek Java (≈5 menit)
  • Berlangganan ke peristiwa pencarian untuk pelacakan kemajuan real‑time
  • Mengonfigurasi opsi pencarian pintar untuk menargetkan halaman tertentu
  • Menjalankan pencarian dan memproses hasil secara efisien

Jawaban Cepat

  • Perpustakaan mana yang membantu Anda mencari halaman spesifik barcode? GroupDocs.Signature untuk Java
  • Waktu penyiapan tipikal? Sekitar 5 menit untuk menambahkan dependensi Maven/Gradle dan lisensi
  • Bisakah saya membatasi pencarian hanya pada halaman pertama dan terakhir? Ya – gunakan PagesSetup untuk menentukan halaman yang tepat
  • Format barcode apa yang didukung? QR Code, Code128, Code39, DataMatrix, EAN/UPC, dan lainnya
  • Apakah saya memerlukan lisensi berbayar untuk produksi? Lisensi penuh diperlukan untuk produksi; versi percobaan dapat digunakan untuk evaluasi

Apa itu “pencarian halaman spesifik barcode”?

Mencari halaman spesifik barcode berarti memberi instruksi pada mesin tanda tangan untuk mencari tanda tangan barcode hanya pada halaman‑halaman yang Anda inginkan—misalnya halaman pertama, halaman terakhir, atau rentang khusus apa pun. Pendekatan terfokus ini mempercepat proses, mengurangi penggunaan memori, dan memungkinkan Anda membangun umpan balik UI yang responsif.

Mengapa menggunakan GroupDocs.Signature untuk tugas ini?

GroupDocs.Signature menyediakan API tingkat tinggi yang menyembunyikan detail decoding barcode, rendering halaman, dan penanganan format dokumen. Ia bekerja dengan PDF, DOCX, XLSX, dan banyak format lainnya secara langsung, sehingga Anda dapat fokus pada logika bisnis tanpa harus mengurai file secara manual.

Prasyarat

  • JDK 8+ terpasang
  • Maven atau Gradle untuk manajemen dependensi
  • Familiaritas dasar dengan kelas, metode, dan penanganan pengecualian Java
  • Akses ke lisensi GroupDocs.Signature (percobaan atau penuh)

Menyiapkan GroupDocs.Signature untuk Java

Pengaturan Maven

Tambahkan dependensi ke pom.xml Anda:

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

Pengaturan Gradle

Atau sertakan dalam build.gradle:

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

Prefer manual downloads? Anda dapat mengunduh rilis terbaru langsung dari halaman unduhan GroupDocs.

Mendapatkan Lisensi Anda

  • Free Trial – mulai segera, tanpa komitmen
  • Temporary License – akses penuh untuk evaluasi
  • Full License – siap produksi, penggunaan tak terbatas

Verifikasi instalasi dengan cuplikan inisialisasi singkat:

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: Ganti "YOUR_DOCUMENT_PATH" dengan file PDF, DOCX, atau XLSX yang sebenarnya. Jika konsol menampilkan pesan sukses, Anda siap melanjutkan.

Memahami Jenis Tanda Tangan Barcode

Barcode menyimpan data yang dapat dibaca mesin di dalam dokumen. Tidak seperti tanda tangan tulisan tangan, barcode dapat menyimpan ID, timestamp, URL, atau payload JSON, menjadikannya ideal untuk verifikasi otomatis.

Jenis BarcodePaling Cocok UntukPanjang Data Tipikal
QR CodeData berkapasitas tinggi, URL, teks multi‑barisHingga 4.296 karakter
Code128Nomor pelacakan alfanumerikVariabel
Code39Kode warisan sederhanaHingga 43 karakter
DataMatrixLabel kecil, rekam medisHingga 2.335 karakter
EAN/UPCIdentifikasi produk, ritel8‑13 digit

Anda biasanya menggunakan barcode ketika memerlukan pembacaan mesin cepat, data terstruktur, atau tanda tangan yang tahan manipulasi.

Cara Mencari Halaman Spesifik Barcode

Kami akan membagi implementasi menjadi tiga fitur terfokus.

Fitur 1: Berlangganan ke Peristiwa Pencarian Dokumen

Mengapa ini penting

Saat memproses batch besar, umpan balik real‑time (misalnya, progress bar) meningkatkan UX dan membantu mendeteksi kemacetan lebih awal.

Implementasi

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

Ketiga handler ini memberikan waktu mulai, progres langsung, dan statistik akhir—sempurna untuk logging atau pembaruan UI.

Fitur 2: Mengonfigurasi Opsi Pencarian Barcode untuk Halaman Spesifik

Mengapa kontrol granular penting

Memindai setiap halaman dari kontrak 200 halaman membuang siklus CPU. Menargetkan hanya halaman pertama dan terakhir dapat memotong waktu eksekusi hingga 80 %.

Implementasi

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 memungkinkan Anda menyetel pencarian teks secara detail (Contains, Exact, StartsWith, EndsWith).
  • Sesuaikan setAllPages dan PagesSetup untuk mencari halaman spesifik barcode saja.

Fitur 3: Menjalankan Pencarian dan Memproses Hasil

Mengapa langkah ini penting

Menemukan barcode hanyalah setengah cerita—Anda harus menindaklanjuti data (misalnya, memvalidasi, menyimpan, atau memicu alur kerja).

Implementasi

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

Sekarang Anda memiliki daftar objek BarcodeSignature, masing‑masing menyediakan:

  • getPageNumber() – halaman tempat barcode berada
  • getEncodeType() – QR, Code128, dll.
  • getText() – payload yang terdekripsi
  • Posisi (getLeft(), getTop()) dan ukuran (getWidth(), getHeight())

Contoh: Proses hanya QR code pada halaman terakhir

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

Aplikasi Dunia Nyata

SkenarioBagaimana pencarian halaman spesifik barcode membantu
Verifikasi kontrak hukumAuto‑validasi hash sertifikat yang dienkode QR pada halaman tanda tangan
Pelacakan rantai pasokanTemukan ID pengiriman Code128 pada halaman pertama/terakhir manifest
Formulir persetujuan kesehatanEkstrak ID pasien DataMatrix dari halaman persetujuan akhir
Otomatisasi fakturCari barcode berawalan “APPR‑” di mana saja pada faktur, lalu alihkan

Masalah Umum dan Solusinya

Masalah 1 – Tidak ada hasil meskipun barcode terlihat

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

Jika barcode tertanam sebagai gambar raster, pertimbangkan menggunakan GroupDocs.Image untuk deteksi berbasis gambar.

Masalah 2 – Performa lambat pada file besar

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

Pemilihan halaman yang ditargetkan secara drastis mengurangi waktu pemrosesan.

Masalah 3 – TextMatchType tidak menemukan barcode yang diharapkan

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

Masalah 4 – Kebocoran memori dalam loop yang berjalan lama

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

Blok try‑with‑resources secara otomatis membuang instance Signature.

Praktik Terbaik untuk Produksi

Penanganan error yang kuat

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

Cache hasil ketika dokumen tidak berubah

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

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

Gunakan peristiwa kemajuan untuk umpan balik UI

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

Validasi payload barcode

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

Optimalkan pemilihan halaman per tipe dokumen

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

Filter berdasarkan tipe barcode setelah pencarian (jika hanya membutuhkan QR code)

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

Ekstrak dimensi gambar barcode (jika diperlukan untuk rendering)

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

Pertanyaan yang Sering Diajukan

Q: Bisakah saya mencari beberapa format barcode dalam satu panggilan?
A: Ya. BarcodeSearchOptions secara default mencari semua format yang didukung. Filter hasil dengan getEncodeType() jika Anda hanya memerlukan tipe tertentu.

Q: Bagaimana cara menangani dokumen yang berisi barcode dan tanda tangan gambar sekaligus?
A: Jalankan pencarian terpisah—gunakan BarcodeSignature.class untuk barcode dan ImageSignature.class untuk tanda tangan gambar, lalu gabungkan hasilnya sesuai kebutuhan.

Q: Apa dampak performa antara mencari semua halaman vs. halaman spesifik?
A: Memindai setiap halaman PDF 50‑halaman dapat memakan 3–5 detik. Membatasi pada halaman pertama + terakhir biasanya selesai dalam kurang dari 1 detik.

Q: Apakah ini bekerja dengan PDF yang dipindai (gambar raster)?
A: Hanya jika barcode ditambahkan sebagai objek tanda tangan digital. Untuk barcode yang hanya berupa raster, Anda memerlukan pengenal barcode berbasis gambar (misalnya, GroupDocs.Barcode).

Q: Bagaimana saya dapat memverifikasi bahwa tanda tangan barcode tidak telah diubah?
A: Tanamkan hash atau tanda tangan digital di dalam payload barcode, lalu hitung ulang hash pada data asli dan bandingkan. Ini memerlukan kunci atau sertifikat penandatangan asli.


Last Updated: 2026-01-29
Tested With: GroupDocs.Signature 23.12 for Java
Author: GroupDocs