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
PagesSetupuntuk 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 Barcode | Paling Cocok Untuk | Panjang Data Tipikal |
|---|---|---|
| QR Code | Data berkapasitas tinggi, URL, teks multi‑baris | Hingga 4.296 karakter |
| Code128 | Nomor pelacakan alfanumerik | Variabel |
| Code39 | Kode warisan sederhana | Hingga 43 karakter |
| DataMatrix | Label kecil, rekam medis | Hingga 2.335 karakter |
| EAN/UPC | Identifikasi produk, ritel | 8‑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
setAllPagesdanPagesSetupuntuk 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 beradagetEncodeType()– 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
| Skenario | Bagaimana pencarian halaman spesifik barcode membantu |
|---|---|
| Verifikasi kontrak hukum | Auto‑validasi hash sertifikat yang dienkode QR pada halaman tanda tangan |
| Pelacakan rantai pasokan | Temukan ID pengiriman Code128 pada halaman pertama/terakhir manifest |
| Formulir persetujuan kesehatan | Ekstrak ID pasien DataMatrix dari halaman persetujuan akhir |
| Otomatisasi faktur | Cari 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