ค้นหาหน้าตามบาร์โค้ดในเอกสารโดยใช้ Java
บทนำ
เคยใช้เวลาหลายชั่วโมงตรวจสอบลายเซ็นด้วยตนเองในเอกสารหลายร้อยฉบับหรือไม่? คุณไม่ได้อยู่คนเดียว ไม่ว่าคุณจะกำลังสร้างระบบจัดการสัญญา, ทำระบบอัตโนมัติการประมวลผลใบแจ้งหนี้, หรือรักษาความปลอดภัยของบันทึกสุขภาพ การติดตามและตรวจสอบลายเซ็นบาร์โค้ดด้วยมือเป็นงานที่น่าเบื่อและเสี่ยงต่อข้อผิดพลาด
ในคู่มือนี้เราจะแสดง วิธีการค้นหาหน้าตามบาร์โค้ด ในเอกสารของคุณโดยใช้ Java และ GroupDocs.Signature. เมื่อคุณทำตามจนจบแล้ว คุณจะสามารถตรวจจับลายเซ็นบนหน้าที่เลือก, ติดตามความคืบหน้าการค้นหาแบบเรียลไทม์, และจัดการกับรูปแบบบาร์โค้ดหลายประเภท—ทั้งหมดด้วยโค้ดที่สะอาดและดูแลได้ง่าย
สิ่งที่คุณจะได้เรียนรู้
- การตั้งค่า GroupDocs.Signature ในโครงการ Java (≈5 นาที)
- การสมัครรับเหตุการณ์การค้นหาเพื่อการติดตามความคืบหน้าแบบเรียลไทม์
- การกำหนดค่าตัวเลือกการค้นอัจฉริยะเพื่อกำหนดเป้าหมายที่หน้าที่เฉพาะเจาะจง
- การดำเนินการค้นหาและประมวลผลผลลัพธ์อย่างมีประสิทธิภาพ
คำตอบสั้น
- ไลบรารีใดที่ช่วยคุณค้นหาหน้าตามบาร์โค้ด? GroupDocs.Signature for Java
- เวลาในการตั้งค่าปกติ? ประมาณ 5 นาทีเพื่อเพิ่ม dependency ของ Maven/Gradle และใบอนุญาต
- ฉันสามารถจำกัดการค้นหาให้เฉพาะหน้าแรกและหน้าสุดท้ายได้หรือไม่? ได้ – ใช้
PagesSetupเพื่อระบุหน้าที่ต้องการอย่างแม่นยำ - รูปแบบบาร์โค้ดที่รองรับมีอะไรบ้าง? QR Code, Code128, Code39, DataMatrix, EAN/UPC, และอื่น ๆ
- ต้องใช้ใบอนุญาตแบบจ่ายเงินสำหรับการใช้งานจริงหรือไม่? จำเป็นต้องมีใบอนุญาตเต็มสำหรับการใช้งานจริง; เวอร์ชันทดลองใช้ได้สำหรับการประเมิน
“ค้นหาหน้าตามบาร์โค้ด” คืออะไร?
การค้นหาหน้าตามบาร์โค้ดหมายถึงการสั่งให้เอนจินลายเซ็นมองหาลายเซ็นบาร์โค้ดเฉพาะบนหน้าที่คุณสนใจ—เช่น หน้าแรก, หน้าสุดท้าย, หรือช่วงหน้าที่กำหนดเอง วิธีการที่มุ่งเน้นนี้ช่วยเร่งการประมวลผล, ลดการใช้หน่วยความจำ, และทำให้คุณสร้าง UI ที่ตอบสนองได้ดีขึ้น
ทำไมต้องใช้ GroupDocs.Signature สำหรับงานนี้?
GroupDocs.Signature มี API ระดับสูงที่ซ่อนการถอดรหัสบาร์โค้ดระดับล่าง, การเรนเดอร์หน้า, และการจัดการรูปแบบเอกสารต่าง ๆ ทำงานได้กับ PDF, DOCX, XLSX, และรูปแบบอื่น ๆ มากมายโดยไม่ต้องเขียนโค้ดเพิ่มเติม ช่วยให้คุณโฟกัสที่ตรรกะธุรกิจแทนการแยกวิเคราะห์ไฟล์
ข้อกำหนดเบื้องต้น
- JDK 8+ ติดตั้งแล้ว
- Maven หรือ Gradle สำหรับจัดการ dependency
- ความคุ้นเคยพื้นฐานกับคลาส, เมธอด, และการจัดการข้อยกเว้นของ Java
- มีใบอนุญาต GroupDocs.Signature (ทดลองหรือเต็ม)
การตั้งค่า GroupDocs.Signature สำหรับ Java
การตั้งค่า Maven
เพิ่ม dependency ลงใน pom.xml ของคุณ:
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-signature</artifactId>
<version>23.12</version>
</dependency>
การตั้งค่า Gradle
หรือใส่ใน build.gradle:
implementation 'com.groupdocs:groupdocs-signature:23.12'
ต้องการดาวน์โหลดด้วยตนเอง? คุณสามารถรับเวอร์ชันล่าสุดได้โดยตรงจาก หน้าดาวน์โหลด GroupDocs
การรับใบอนุญาตของคุณ
- Free Trial – เริ่มใช้งานได้ทันที, ไม่มีข้อผูกมัด
- Temporary License – เข้าถึงฟีเจอร์เต็มสำหรับการประเมิน
- Full License – พร้อมใช้งานในผลิตภัณฑ์, ไม่จำกัดการใช้
ตรวจสอบการติดตั้งด้วยโค้ดสั้น ๆ ด้านล่าง:
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.");
}
}
เคล็ดลับระดับมืออาชีพ: แทนที่
"YOUR_DOCUMENT_PATH"ด้วยไฟล์ PDF, DOCX, หรือ XLSX จริง หากคอนโซลแสดงข้อความสำเร็จ คุณก็พร้อมเริ่มทำงานแล้ว
ทำความเข้าใจประเภทลายเซ็นบาร์โค้ด
บาร์โค้ดฝังข้อมูลที่เครื่องอ่านได้ภายในเอกสาร ไม่เหมือนลายเซ็นที่เขียนด้วยมือที่เก็บเพียงภาพลายเซ็นเท่านั้น บาร์โค้ดสามารถเก็บ ID, timestamp, URL, หรือ payload แบบ JSON ทำให้เหมาะกับการตรวจสอบอัตโนมัติ
| ประเภทบาร์โค้ด | การใช้งานที่เหมาะ | ความยาวข้อมูลโดยทั่วไป |
|---|---|---|
| QR Code | ข้อมูลความหนาแน่นสูง, URL, ข้อความหลายบรรทัด | สูงสุด 4,296 ตัวอักษร |
| Code128 | หมายเลขติดตามแบบอัลฟานูเมอริก | ความยาวเปลี่ยนแปลงได้ |
| Code39 | โค้ดแบบดั้งเดิมที่เรียบง่าย | สูงสุด 43 ตัวอักษร |
| DataMatrix | ป้ายเล็ก, บันทึกสุขภาพ | สูงสุด 2,335 ตัวอักษร |
| EAN/UPC | รหัสสินค้า, การค้าปลีก | 8‑13 หลัก |
คุณมักจะใช้บาร์โค้ดเมื่อจำเป็นต้องอ่านข้อมูลด้วยเครื่องเร็ว, มีโครงสร้าง, หรือต้องการลายเซ็นที่ตรวจสอบการปลอมแปลงได้
วิธีการค้นหาหน้าตามบาร์โค้ด
เราจะแบ่งการทำงานออกเป็นสามฟีเจอร์หลัก
ฟีเจอร์ 1: สมัครรับเหตุการณ์การค้นหาเอกสาร
ทำไมต้องสนใจ
เมื่อประมวลผลชุดข้อมูลขนาดใหญ่ การให้ฟีดแบ็กแบบเรียลไทม์ (เช่น แถบความคืบหน้า) ช่วยปรับปรุง UX และทำให้คุณตรวจจับการหยุดชะงักได้เร็วขึ้น
การนำไปใช้
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");
}
});
ตัวจัดการทั้งสามนี้ให้ข้อมูลเวลาเริ่มต้น, ความคืบหน้าแบบสด, และสถิติสุดท้าย—เหมาะสำหรับการบันทึกหรืออัปเดต UI
ฟีเจอร์ 2: กำหนดค่าตัวเลือกการค้นหาบาร์โค้ดสำหรับหน้าที่เฉพาะเจาะจง
ทำไมต้องควบคุมอย่างละเอียด
การสแกนทุกหน้าของสัญญา 200 หน้าใช้ทรัพยากร CPU มากเกินจำเป็น การกำหนดเป้าหมายเฉพาะหน้าแรกและหน้าสุดท้ายสามารถลดเวลาในการทำงานได้ถึง 80 %
การนำไปใช้
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 ช่วยปรับการค้นหาข้อความ (
Contains,Exact,StartsWith,EndsWith) - ปรับ
setAllPagesและPagesSetupเพื่อ ค้นหาหน้าตามบาร์โค้ด เท่านั้น
ฟีเจอร์ 3: ดำเนินการค้นหาและประมวลผลผลลัพธ์
ทำไมขั้นตอนนี้สำคัญ
การค้นหาบาร์โค้ดเป็นเพียงครึ่งหนึ่งของเรื่อง—you need to act on the data (e.g., validate, store, or trigger workflows).
การนำไปใช้
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);
}
ตอนนี้คุณจะได้รายการอ็อบเจกต์ BarcodeSignature ที่ให้ข้อมูล:
getPageNumber()– หน้าที่บาร์โค้ดอยู่getEncodeType()– QR, Code128, ฯลฯgetText()– payload ที่ถอดรหัสแล้ว- ตำแหน่ง (
getLeft(),getTop()) และขนาด (getWidth(),getHeight())
ตัวอย่าง: ประมวลผลเฉพาะ QR code บนหน้าสุดท้าย
for (BarcodeSignature barcodeSignature : signatures) {
if (barcodeSignature.getPageNumber() == lastPageNumber
&& barcodeSignature.getEncodeType().equals("QRCode")) {
// Process only QR codes from the final page
processApprovalCode(barcodeSignature.getText());
}
}
การใช้งานในโลกจริง
| สถานการณ์ | วิธีที่การค้นหาหน้าตามบาร์โค้ดช่วย |
|---|---|
| ตรวจสอบสัญญากฎหมาย | ตรวจสอบแฮชใบรับรองที่เข้ารหัสด้วย QR บนหน้าลายเซ็น |
| ติดตามห่วงโซ่อุปทาน | ค้นหา Code128 ของหมายเลขการจัดส่งบนหน้าแรก/สุดท้ายของใบส่งของ |
| แบบฟอร์มยินยอมสุขภาพ | ดึง DataMatrix ของรหัสผู้ป่วยจากหน้ายินยอมสุดท้าย |
| ระบบอัตโนมัติใบแจ้งหนี้ | ค้นหาบาร์โค้ดที่ขึ้นต้นด้วย “APPR‑” ใด ๆ บนใบแจ้งหนี้ แล้วส่งต่อ |
ปัญหาที่พบบ่อยและวิธีแก้
ปัญหา 1 – ไม่พบผลลัพธ์แม้จะเห็นบาร์โค้ด
// Ensure you are not limiting pages too aggressively
options.setAllPages(true);
หากบาร์โค้ดฝังเป็นภาพ raster ให้พิจารณาใช้ GroupDocs.Image สำหรับการตรวจจับแบบภาพ
ปัญหา 2 – ประสิทธิภาพช้าในไฟล์ขนาดใหญ่
PagesSetup pagesSetup = new PagesSetup();
pagesSetup.setLastPage(true); // Most signatures are on the last page
pagesSetup.setFirstPage(true);
options.setPagesSetup(pagesSetup);
การกำหนดเป้าหน้าช่วยลดเวลาในการประมวลผลอย่างมาก
ปัญหา 3 – TextMatchType ไม่พบบาร์โค้ดที่คาดหวัง
String searchText = "12345".trim().toLowerCase();
options.setText(searchText);
options.setMatchType(TextMatchType.StartsWith); // Try a more permissive mode
ปัญหา 4 – การรั่วไหลของหน่วยความจำในลูปที่ทำงานต่อเนื่อง
try (Signature signature = new Signature("document.pdf")) {
List<BarcodeSignature> signatures = signature.search(BarcodeSignature.class, options);
// Process signatures
}
บล็อก try‑with‑resources จะทำการปิดอ็อบเจกต์ Signature โดยอัตโนมัติ
แนวทางปฏิบัติที่ดีที่สุดสำหรับการผลิต
การจัดการข้อผิดพลาดอย่างแข็งแรง
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);
}
แคชผลลัพธ์เมื่อเอกสารไม่เปลี่ยนแปลง
Map<String, List<BarcodeSignature>> cache = new ConcurrentHashMap<>();
public List<BarcodeSignature> getCachedSignatures(String docId) {
return cache.computeIfAbsent(docId, id -> performSearch(id));
}
ใช้เหตุการณ์ความคืบหน้าเพื่อฟีดแบ็ก UI
signature.SearchProgress.add(new ProcessProgressEventHandler() {
public void invoke(Signature sender, ProcessProgressEventArgs args) {
int percent = (args.getProcessedSignatures() * 100) / args.getTotalSignatures();
updateProgressBar(percent);
}
});
ตรวจสอบ payload ของบาร์โค้ด
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);
}
}
ปรับแต่งการเลือกหน้าให้เหมาะกับประเภทเอกสาร
PagesSetup contractsSetup = new PagesSetup();
contractsSetup.setLastPage(true); // Contracts usually signed on last page
options.setPagesSetup(contractsSetup);
กรองตามประเภทบาร์โค้ดหลังการค้นหา (หากต้องการเฉพาะ QR code)
for (BarcodeSignature sig : signatures) {
if ("QRCode".equals(sig.getEncodeType())) {
// Process QR code
}
}
ดึงขนาดภาพบาร์โค้ด (หากต้องการใช้ในการเรนเดอร์)
for (BarcodeSignature sig : signatures) {
int width = sig.getWidth();
int height = sig.getHeight();
// Use dimensions for overlay or thumbnail generation
}
คำถามที่พบบ่อย
ถาม: ฉันสามารถค้นหาหลายรูปแบบบาร์โค้ดในคำสั่งเดียวได้หรือไม่?
ตอบ: ได้. BarcodeSearchOptions จะค้นหาทุกรูปแบบที่รองรับโดยค่าเริ่มต้น สามารถกรองผลลัพธ์ด้วย getEncodeType() หากต้องการเฉพาะประเภทบางอย่าง
ถาม: จะจัดการกับเอกสารที่มีบาร์โค้ดและลายเซ็นภาพพร้อมกันอย่างไร?
ตอบ: ทำการค้นหาแยกกัน—ใช้ BarcodeSignature.class สำหรับบาร์โค้ดและ ImageSignature.class สำหรับลายเซ็นภาพ แล้วรวมผลลัพธ์ตามต้องการ
ถาม: ผลกระทบต่อประสิทธิภาพของการค้นหาทุกหน้ากับการค้นหาเฉพาะหน้ามีเท่าไหร่?
ตอบ: การสแกนทุกหน้าของ PDF 50 หน้าอาจใช้เวลา 3–5 วินาที การจำกัดให้เฉพาะหน้าแรก + สุดท้ายมักเสร็จภายใน 1 วินาที
ถาม: วิธีนี้ทำงานกับ PDF ที่สแกนเป็นภาพ (raster) หรือไม่?
ตอบ: ทำได้เฉพาะบาร์โค้ดที่เพิ่มเป็นอ็อบเจกต์ดิจิทัล หากเป็นบาร์โค้ดที่เป็นภาพ raster เท่านั้น คุณต้องใช้ตัวตรวจจับบาร์โค้ดแบบภาพ (เช่น GroupDocs.Barcode)
ถาม: ฉันจะตรวจสอบว่าลายเซ็นบาร์โค้ดไม่ได้ถูกดัดแปลงได้อย่างไร?
ตอบ: ฝังแฮชหรือดิจิทัลซิกเนเจอร์ไว้ใน payload ของบาร์โค้ด แล้วคำนวณแฮชของข้อมูลต้นฉบับและเปรียบเทียบ ซึ่งต้องใช้คีย์หรือใบรับรองที่ใช้ลงนามเดิม
อัปเดตล่าสุด: 2026-01-29
ทดสอบด้วย: GroupDocs.Signature 23.12 for Java
ผู้เขียน: GroupDocs