बारकोड PDF जावा जोड़ें – GroupDocs के साथ साइन और वेरिफ़ाई
यदि आपको आंतरिक वर्कफ़्लो के लिए दस्तावेज़ों को टैग करने का तेज़, दृश्य तरीका चाहिए, तो जावा में PDF में बारकोड जोड़ना एक आदर्श समाधान है। GroupDocs.Signature के साथ आप बारकोड सिग्नेचर को एम्बेड, वेरिफ़ाई, सर्च, अपडेट और डिलीट कर सकते हैं, बिना पूर्ण PKI‑आधारित डिजिटल सिग्नेचर के ओवरहेड के। यह ट्यूटोरियल आपको पर्यावरण सेटअप से लेकर प्रोडक्शन‑रेडी बेस्ट प्रैक्टिसेज़ तक हर कदम पर मार्गदर्शन करता है।
त्वरित उत्तर
- कौन सी लाइब्रेरी जावा में PDF में बारकोड जोड़ती है? GroupDocs.Signature for Java.
- क्या मैं PDF, Word और इमेज़ साइन कर सकता हूँ? हाँ – API 30+ फ़ॉर्मैट्स को सपोर्ट करता है।
- डेवलपमेंट के लिए लाइसेंस चाहिए? 30‑दिन का टेम्पररी लाइसेंस मुफ्त है; प्रोडक्शन के लिए पूर्ण लाइसेंस आवश्यक है।
- PDF साइन करने के लिए कितनी लाइनों का कोड चाहिए? केवल दो लाइनें:
Signatureऑब्जेक्ट बनाएं औरsignकॉल करें। - क्या बारकोड वेरिफ़िकेशन केस‑सेंसिटिव है? हाँ – टेक्स्ट को बिल्कुल वही केस और व्हाइटस्पेस के साथ मिलना चाहिए।
add barcode pdf java क्या है?
add barcode pdf java का अर्थ है जावा कोड का उपयोग करके PDF फ़ाइल में बारकोड (जैसे Code128, QR, या Data Matrix) एम्बेड करना। यह तकनीक मशीन‑रीडेबल टैग प्रदान करती है जिसे स्कैन या प्रोग्रामेटिकली वेरिफ़ाई किया जा सकता है, जिससे आंतरिक सिस्टम में तेज़ दस्तावेज़ ट्रैकिंग संभव होती है।
पूर्ण डिजिटल सिग्नेचर के बजाय बारकोड सिग्नेचर क्यों उपयोग करें?
बारकोड सिग्नेचर PKI‑आधारित डिजिटल सिग्नेचर की तुलना में 30‑50 % तेज़ जनरेट और वेरिफ़ाई होते हैं, और प्रिंट‑स्कैन साइकिल के बाद भी विश्वसनीय रहते हैं। इन्हें प्रमाणपत्र प्रबंधन की आवश्यकता नहीं होती, जिससे वे उच्च‑वॉल्यूम, आंतरिक वर्कफ़्लो के लिए आदर्श बनते हैं जहाँ क्रिप्टोग्राफ़िक प्रूफ़ अनिवार्य नहीं है।
पूर्वापेक्षाएँ
- Java Development Kit (JDK) 8+ – बेहतर प्रदर्शन के लिए Java 11 या 17 की सलाह दी जाती है।
- IDE – IntelliJ IDEA या Eclipse (उदाहरण IntelliJ सिंटैक्स का उपयोग करते हैं)।
- बिल्ड टूल – Maven या Gradle डिपेंडेंसी मैनेजमेंट के लिए।
अपने प्रोजेक्ट में GroupDocs.Signature जोड़ना
सबसे आसान तरीका है बिल्ड टूल के माध्यम से लाइब्रेरी जोड़ना। नीचे देखें:
Maven उपयोगकर्ता – अपने 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'
डायरेक्ट JAR डाउनलोड – यदि आप मैनुअल सेटअप पसंद करते हैं, तो GroupDocs.Signature releases से JAR डाउनलोड करके क्लासपाथ में जोड़ें।
अपना लाइसेंस प्राप्त करें
GroupDocs.Signature प्रोडक्शन उपयोग के लिए मुफ्त नहीं है, लेकिन आपके पास लचीले विकल्प हैं:
- फ्री ट्रायल – GroupDocs डाउनलोड पेज से डाउनलोड करें (इवैल्यूएशन वाटरमार्क जोड़े जाएंगे)।
- टेम्पररी लाइसेंस – GroupDocs का टेम्पररी लाइसेंस पेज से 30 दिन का पूर्ण एक्सेस प्राप्त करें – प्रूफ़‑ऑफ़‑कॉन्सेप्ट के लिए उत्तम।
- फुल लाइसेंस – प्रोडक्शन डिप्लॉयमेंट के लिए GroupDocs खरीद विकल्प देखें।
प्रो टिप: विकास के लिए टेम्पररी लाइसेंस से शुरू करें; यह स्थायी की पर स्विच करने पर वाटरमार्क हटाता है।
त्वरित पर्यावरण जांच
डिपेंडेंसी जोड़ने के बाद एक साधारण स्मोक टेस्ट चलाएँ:
import com.groupdocs.signature.Signature;
public class SignatureTest {
public static void main(String[] args) {
try {
Signature signature = new Signature("test.pdf");
System.out.println("GroupDocs.Signature initialized successfully!");
signature.dispose();
} catch (Exception e) {
System.err.println("Setup issue: " + e.getMessage());
}
}
}
यदि प्रोग्राम बिना त्रुटि के चलता है, तो आपका पर्यावरण तैयार है। यदि समस्याएँ आती हैं, तो JDK संस्करण और जो लाइब्रेरी संस्करण आपने जोड़ा है, उसकी जाँच करें।
बारकोड सिग्नेचर कब उपयोग करें
बारकोड सिग्नेचर निम्नलिखित परिस्थितियों में उत्कृष्ट होते हैं:
- आंतरिक दस्तावेज़ वर्कफ़्लो – इनवॉइस, पर्चेज ऑर्डर या मेमो को अनुमोदन चेन के माध्यम से ट्रैक करें।
- हाई‑वॉल्यूम प्रोसेसिंग – हजारों दस्तावेज़ जल्दी साइन करें; बारकोड जनरेशन पूर्ण डिजिटल साइनिंग से 2× तेज़ है।
- प्रिंट‑स्कैन ब्रिज – बारकोड प्रिंट‑स्कैन साइकिल को सहन करते हैं, जिससे हाइब्रिड पेपर‑डिजिटल प्रोसेस के लिए उपयुक्त होते हैं।
- लेगेसी सिस्टम इंटीग्रेशन – मौजूदा बारकोड स्कैनर टैग को अतिरिक्त सॉफ़्टवेयर के बिना पढ़ सकते हैं।
- ऑडिट ट्रेल – ट्रांज़ैक्शन ID या टाइमस्टैम्प एम्बेड करें जिसे ऑडिटर तुरंत वेरिफ़ाई कर सके।
कानूनी कॉन्ट्रैक्ट, हाई‑सिक्योरिटी दस्तावेज़ या बाहरी पार्टनर एक्सचेंज जहाँ PKI‑आधारित डिजिटल सिग्नेचर आवश्यक है, के लिए बारकोड सिग्नेचर से बचें।
GroupDocs.Signature for Java सेटअप करना
कोर क्लास परिभाषा
Signature क्लास GroupDocs.Signature में सभी साइन, वेरिफ़ाई, सर्च, अपडेट और डिलीट ऑपरेशन्स का एंट्री पॉइंट है।
import com.groupdocs.signature.Signature;
बेसिक इनिशियलाइज़ेशन
टार्गेट फ़ाइल की ओर इशारा करने वाला Signature ऑब्जेक्ट बनाएं:
Signature signature = new Signature("path/to/your/document.pdf");
महत्वपूर्ण नोट्स
- पाथ एब्सोल्यूट या रिलेटिव हो सकते हैं; क्रॉस‑प्लेटफ़ॉर्म संगतता के लिए
System.getProperty("user.home")उपयोग करें। - GroupDocs 30+ इनपुट और आउटपुट फ़ॉर्मैट सपोर्ट करता है, जिसमें PDF, DOCX, XLSX, PPTX, और PNG शामिल हैं।
- हमेशा
signature.dispose()या ट्राई‑विथ‑रिसोर्सेज़ ब्लॉक से रिसोर्स रिलीज़ करें:
try (Signature signature = new Signature("path/to/your/document.pdf")) {
// Your signing operations here
} catch (Exception e) {
System.err.println("Error working with document: " + e.getMessage());
}
अब आप बारकोड जोड़ने के लिए तैयार हैं।
जावा में PDF में बारकोड कैसे जोड़ें?
new Signature("input.pdf") से स्रोत PDF लोड करें, BarcodeSignature ऑब्जेक्ट (जैसे Code128 के साथ टेक्स्ट “John Smith”) कॉन्फ़िगर करें, और sign कॉल करके साइन किया हुआ फ़ाइल बनाएं – यह सब केवल तीन संक्षिप्त लाइनों में। यह तरीका मशीन‑रीडेबल टैग एम्बेड करता है जबकि मूल लेआउट अपरिवर्तित रहता है, और यह किसी भी सपोर्टेड फ़ॉर्मैट के लिए काम करता है, सिर्फ PDF नहीं।
चरण‑बद्ध कार्यान्वयन
1. फ़ाइल पाथ निर्धारित करें
स्रोत और आउटपुट फ़ाइलों के स्थान सेट करें:
String filePath = "YOUR_DOCUMENT_DIRECTORY/sample.docx";
String outputFilePath = "YOUR_OUTPUT_DIRECTORY/signed_sample.docx";
2. सिग्नेचर हैंडलर बनाएं
स्रोत दस्तावेज़ के साथ हैंडलर इनिशियलाइज़ करें:
Signature signature = new Signature(filePath);
3. बारकोड विकल्प कॉन्फ़िगर करें
BarcodeSignature ऑब्जेक्ट बारकोड के विज़ुअल और डेटा प्रॉपर्टीज़ को परिभाषित करता है। बारकोड प्रकार, एन्कोडेड टेक्स्ट, पोज़िशन, साइज, कलर और वैकल्पिक ह्यूमन‑रीडेबल फ़ॉन्ट सेट करें:
BarcodeSignOptions signOptions = new BarcodeSignOptions("John Smith", BarcodeTypes.Code128);
signOptions.setVerticalAlignment(VerticalAlignment.Top);
signOptions.setHorizontalAlignment(HorizontalAlignment.Center);
signOptions.setWidth(100);
signOptions.setHeight(40);
signOptions.setMargin(new java.awt.Rectangle(20, 20, 0, 0));
signOptions.setForeColor(Color.RED);
SignatureFont signatureFont = new SignatureFont();
signatureFont.setSize(12);
signatureFont.setFamilyName("Comic Sans MS");
signOptions.setFont(signatureFont);
प्रो टिप: यदि एन्कोडेड स्ट्रिंग 20 कैरेक्टर से अधिक है, तो स्कैनिंग त्रुटियों से बचने के लिए बारकोड की चौड़ाई बढ़ाएँ।
4. सिग्नेचर लागू करें
साइनिंग ऑपरेशन चलाएँ और आउटपुट फ़ाइल जनरेट करें:
signature.sign(outputFilePath, signOptions);
5. वास्तविक‑दुनिया उदाहरण
इनवॉइस‑अप्रूवल सिस्टम में आप अप्रूवर का कर्मचारी ID और टाइमस्टैम्प एम्बेड कर सकते हैं:
String invoiceId = "INV-2025-0042";
String approver = "john.smith@company.com";
String timestamp = LocalDateTime.now().toString();
// Combine into barcode data
String barcodeData = invoiceId + "|" + approver + "|" + timestamp;
BarcodeSignOptions signOptions = new BarcodeSignOptions(barcodeData, BarcodeTypes.QR);
signOptions.setVerticalAlignment(VerticalAlignment.Bottom);
signOptions.setHorizontalAlignment(HorizontalAlignment.Right);
signature.sign(outputFilePath, signOptions);
परिणामी PDF अब एक स्कैन‑योग्य बारकोड रखता है जिसमें सभी आवश्यक अनुमोदन मेटाडेटा एन्कोडेड है।
जावा दस्तावेज़ में बारकोड सिग्नेचर कैसे वेरिफ़ाई करें?
Signature.verify मेथड प्रदान किए गए विकल्पों के आधार पर दस्तावेज़ में मिलते‑जुलते बारकोड सिग्नेचर की जाँच करता है और एक बूलियन रिटर्न करता है जो दर्शाता है कि अपेक्षित बारकोड मौजूद है या नहीं। यह वेरिफ़िकेशन ऑटोमेटेड वर्कफ़्लो में उपयोगी है जहाँ आगे की कार्रवाई से पहले यह सुनिश्चित करना आवश्यक है कि दस्तावेज़ सही पार्टी द्वारा प्रोसेस किया गया है।
वेरिफ़िकेशन चरण
1. साइन किए हुए दस्तावेज़ को लोड करें
Signature signature = new Signature("YOUR_OUTPUT_DIRECTORY/signed_sample.docx");
2. वेरिफ़िकेशन मानदंड सेट करें
सटीक टेक्स्ट, बारकोड फ़ॉर्मैट और पेज नंबर निर्धारित करें:
BarcodeVerifyOptions verifyOptions = new BarcodeVerifyOptions();
verifyOptions.setAllPages(false); // Only check the first page
verifyOptions.setPageNumber(1);
verifyOptions.setEncodeType(BarcodeTypes.Code128);
verifyOptions.setText("John Smith");
3. वेरिफ़िकेशन चलाएँ
चेक निष्पादित करें और परिणाम हैंडल करें:
boolean isValid = signature.verify(verifyOptions) != null;
if (isValid) {
System.out.println("Document signature verified successfully!");
} else {
System.out.println("Warning: Signature verification failed!");
}
सामान्य पैटर्न: यदि आप केवल किसी भी बारकोड प्रकार की मौजूदगी की पुष्टि करना चाहते हैं, तो setText फ़िल्टर को छोड़ दें:
BarcodeVerifyOptions flexibleOptions = new BarcodeVerifyOptions();
flexibleOptions.setAllPages(true);
flexibleOptions.setEncodeType(BarcodeTypes.Code128);
// No setText() call = accept any text with this barcode type
boolean hasAnySignature = signature.verify(flexibleOptions) != null;
या कंटेंट की परवाह किए बिना केवल बारकोड फ़ॉर्मैट वेरिफ़ाई करें:
BarcodeVerifyOptions formatOnly = new BarcodeVerifyOptions();
formatOnly.setEncodeType(BarcodeTypes.QR);
// Confirms a QR code exists, regardless of content
चेतावनी: वेरिफ़िकेशन केस‑और व्हाइटस्पेस‑सेंसिटिव है; साइन करने से पहले हमेशा डेटा को ट्रिम और नॉर्मलाइज़ करें।
दस्तावेज़ में बारकोड सिग्नेचर कैसे खोजें?
Signature.search मेथड BarcodeSearchOptions के आधार पर दस्तावेज़ में बारकोड सिग्नेचर स्कैन करता है और प्रत्येक बारकोड की लोकेशन, पेज नंबर और एन्कोडेड वैल्यू सहित एक कलेक्शन रिटर्न करता है। यह क्षमता मेटाडेटा को बुल्क एक्सट्रैक्ट करने में मदद करती है बिना फ़ाइल को मैन्युअली खोले।
सर्च वर्कफ़्लो
1. सर्च इनिशियलाइज़ करें
Signature signature = new Signature("YOUR_OUTPUT_DIRECTORY/signed_sample.docx");
2. सर्च पैरामीटर कॉन्फ़िगर करें
पेज रेंज, बारकोड प्रकार या टेक्स्ट फ़िल्टर निर्दिष्ट करें:
BarcodeSearchOptions searchOptions = new BarcodeSearchOptions();
searchOptions.setAllPages(true); // Search the entire document
परफ़ॉर्मेंस सुधार के लिए सर्च को संकीर्ण करें:
BarcodeSearchOptions narrowSearch = new BarcodeSearchOptions();
narrowSearch.setAllPages(false);
narrowSearch.setPageNumber(1); // Only search page 1
narrowSearch.setEncodeType(BarcodeTypes.Code128); // Only find Code128 barcodes
3. सर्च निष्पादित करें
java.util.List<BarcodeSignature> signatures = signature.search(BarcodeSignature.class, searchOptions);
System.out.println("Found " + signatures.size() + " barcode signature(s)");
for (BarcodeSignature bcSignature : signatures) {
System.out.println("Barcode Type: " + bcSignature.getEncodeType().getTypeName());
System.out.println("Text: " + bcSignature.getText());
System.out.println("Position: (" + bcSignature.getLeft() + ", " + bcSignature.getTop() + ")");
System.out.println("Size: " + bcSignature.getWidth() + "x" + bcSignature.getHeight());
System.out.println("---");
}
4. डेटा एक्सट्रैक्शन उदाहरण
इन्वॉइस बैच में हर बारकोड से अप्रूवल डेटा निकालें:
List<BarcodeSignature> foundSignatures = signature.search(BarcodeSignature.class, searchOptions);
for (BarcodeSignature sig : foundSignatures) {
String barcodeData = sig.getText();
// Parse your custom format (remember our invoice example?)
String[] parts = barcodeData.split("\\|");
if (parts.length == 3) {
String invoiceId = parts[0];
String approver = parts[1];
String timestamp = parts[2];
System.out.println("Invoice " + invoiceId + " approved by " + approver + " at " + timestamp);
}
}
परफ़ॉर्मेंस टिप: 100 पेज से अधिक दस्तावेज़ों के लिए हमेशा सर्च को उन पेजों तक सीमित रखें जहाँ बारकोड मौजूद हैं; इससे रनटाइम 70 % तक घट सकता है।
मौजूदा बारकोड सिग्नेचर कैसे अपडेट करें?
Signature.update मेथड मौजूदा बारकोड सिग्नेचर के विज़ुअल एट्रिब्यूट्स (जैसे पोज़िशन, साइज या कलर) को बदलता है, जबकि एन्कोडेड डेटा अपरिवर्तित रहता है। यह तब उपयोगी होता है जब दस्तावेज़ पहले ही साइन हो चुका हो और लेआउट में बदलाव की आवश्यकता हो।
अपडेट प्रक्रिया
1. अपडेट करने के लिए सिग्नेचर खोजें
Signature signature = new Signature("YOUR_OUTPUT_DIRECTORY/signed_sample.docx");
BarcodeSearchOptions searchOptions = new BarcodeSearchOptions();
searchOptions.setAllPages(true);
List<BarcodeSignature> signatures = signature.search(BarcodeSignature.class, searchOptions);
2. इच्छित प्रॉपर्टीज़ बदलें
List<BarcodeSignature> signaturesToUpdate = new ArrayList<>();
if (!signatures.isEmpty()) {
BarcodeSignature bcSignature = signatures.get(0); // Update the first found signature
// Move it 100px right and 100px down
bcSignature.setLeft(bcSignature.getLeft() + 100);
bcSignature.setTop(bcSignature.getTop() + 100);
// Make it bigger
bcSignature.setWidth(200);
bcSignature.setHeight(50);
signaturesToUpdate.add(bcSignature);
}
एक साथ कई एट्रिब्यूट्स बदल सकते हैं:
bcSignature.setLeft(50);
bcSignature.setTop(50);
bcSignature.setWidth(150);
bcSignature.setHeight(45);
// Note: You can't change the encoded text or barcode type with update
// For that, you'd need to delete and re-sign
3. परिवर्तन सहेजें
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
signature.update(outputStream, signaturesToUpdate);
// If you want to save to a file instead:
// signature.update("path/to/updated_document.docx", signaturesToUpdate);
4. वास्तविक‑दुनिया परिदृश्य
नए कंपनी लोगो के साथ ओवरलैप न हो, इसके लिए सभी सिग्नेचर को रीपोज़िशन करें:
List<BarcodeSignature> allSignatures = signature.search(BarcodeSignature.class, searchOptions);
List<BarcodeSignature> toUpdate = new ArrayList<>();
for (BarcodeSignature sig : allSignatures) {
// Move all signatures down by 50px to clear space for new logo
if (sig.getTop() < 100) {
sig.setTop(sig.getTop() + 50);
toUpdate.add(sig);
}
}
if (!toUpdate.isEmpty()) {
signature.update(outputStream, toUpdate);
System.out.println("Repositioned " + toUpdate.size() + " signature(s)");
}
सीमा: एन्कोडेड टेक्स्ट बदलने के लिए सिग्नेचर को डिलीट करके नया इन्सर्ट करना पड़ेगा।
दस्तावेज़ से बारकोड सिग्नेचर कैसे डिलीट करें?
Signature.delete मेथड चयनित बारकोड सिग्नेचर को स्थायी रूप से हटाता है, जिससे विज़ुअल एलिमेंट और एन्कोडेड डेटा दोनों मिट जाते हैं। यह ऑपरेशन टेस्ट सिग्नेचर साफ़ करने या जब बारकोड अब प्रासंगिक न हो, तब उपयोग किया जाता है।
डिलीशन चरण
1. सिग्नेचर लोकेट करें
Signature signature = new Signature("YOUR_OUTPUT_DIRECTORY/signed_sample.docx");
BarcodeSearchOptions searchOptions = new BarcodeSearchOptions();
searchOptions.setAllPages(true);
List<BarcodeSignature> signatures = signature.search(BarcodeSignature.class, searchOptions);
2. चयनित सिग्नेचर डिलीट करें
List<BarcodeSignature> signaturesToDelete = new ArrayList<>();
// Delete all Code128 signatures (for example)
for (BarcodeSignature sig : signatures) {
if (sig.getEncodeType().equals(BarcodeTypes.Code128)) {
signaturesToDelete.add(sig);
}
}
if (!signaturesToDelete.isEmpty()) {
boolean result = signature.delete(signaturesToDelete);
if (result) {
System.out.println("Successfully deleted " + signaturesToDelete.size() + " signature(s)");
} else {
System.err.println("Failed to delete signatures");
}
}
3. कंडीशनल डिलीशन उदाहरण
केवल उन बारकोड को हटाएँ जो किसी विशेष टाइमस्टैम्प से पुराने हैं (मान लें कि टाइमस्टैम्प एन्कोडेड टेक्स्ट में है):
LocalDateTime cutoffDate = LocalDateTime.now().minusDays(30);
List<BarcodeSignature> outdatedSignatures = new ArrayList<>();
for (BarcodeSignature sig : signatures) {
try {
String text = sig.getText();
// Assuming format like "data|timestamp"
String[] parts = text.split("\\|");
if (parts.length > 1) {
LocalDateTime sigDate = LocalDateTime.parse(parts[1]);
if (sigDate.isBefore(cutoffDate)) {
outdatedSignatures.add(sig);
}
}
} catch (Exception e) {
// Skip signatures that don't match our format
continue;
}
}
if (!outdatedSignatures.isEmpty()) {
signature.delete(outdatedSignatures);
System.out.println("Removed " + outdatedSignatures.size() + " outdated signature(s)");
}
सावधानी: डिलीशन अपरिवर्तनीय है; टेस्टिंग के दौरान हमेशा प्रोडक्शन फ़ाइलों की कॉपी पर काम करें।
4. बुल्क डिलीशन पैटर्न
रिलीज़ से पहले टेस्ट सिग्नेचर साफ़ करें:
// Remove all signatures containing "TEST" in their text
List<BarcodeSignature> testSignatures = signatures.stream()
.filter(sig -> sig.getText().toUpperCase().contains("TEST"))
.collect(Collectors.toList());
if (!testSignatures.isEmpty()) {
signature.delete(testSignatures);
System.out.println("Cleaned up " + testSignatures.size() + " test signature(s)");
}
बारकोड प्रकार: व्यावहारिक गाइड
सही बारकोड चुनने से स्कैनिंग विश्वसनीयता, डेटा क्षमता और प्रिंटर संगतता प्रभावित होती है।
Code128 (सबसे सामान्य)
- कब उपयोग करें: अल्फ़ान्यूमेरिक डेटा, हाई डेंसिटी, प्रिंटेड दस्तावेज़।
- फायदे: कॉम्पैक्ट, स्टैंडर्ड स्कैनर के साथ काम करता है, छोटे साइज पर भी स्पष्ट प्रिंट।
- नुकसान: केवल ASCII तक सीमित, 2‑D कोड की तुलना में कम एरर‑रेज़िस्टेंट।
उदाहरण:
BarcodeSignOptions code128 = new BarcodeSignOptions("INV-2025-042", BarcodeTypes.Code128);
QR Code (मोबाइल के लिए बेस्ट)
- कब उपयोग करें: मोबाइल स्कैनिंग, बड़े डेटा पेलोड (URL, JSON आदि), ऐसे दस्तावेज़ जो क्षतिग्रस्त हो सकते हैं।
- फायदे: 4 000 कैरेक्टर तक, बिल्ट‑इन एरर करेक्शन, स्मार्टफ़ोन‑फ्रेंडली।
- नुकसान: बड़ा विज़ुअल फुटप्रिंट, छोटे साइज पर हाई रिज़ॉल्यूशन चाहिए।
उदाहरण:
String jsonData = "{\"invoice\":\"INV-042\",\"amount\":1500.00,\"approver\":\"john@company.com\"}";
BarcodeSignOptions qrCode = new BarcodeSignOptions(jsonData, BarcodeTypes.QR);
Code39 (पुराना भरोसेमंद)
- कब उपयोग करें: लेगेसी स्कैनर वातावरण, ह्यूमन‑रीडेबल टेक्स्ट की आवश्यकता।
- फायदे: व्यापक लेगेसी सपोर्ट, सरल फ़ॉर्मैट, चेकसम नहीं चाहिए।
- नुकसान: कम डेटा डेंसिटी, सीमित कैरेक्टर सेट, अधिक स्पेस लेता है।
Data Matrix (कॉम्पैक्ट पावरहाउस)
- कब उपयोग करें: अत्यंत सीमित स्पेस, छोटे आइटम मार्किंग, हाई‑डेंसिटी डेटा।
- फायदे: बहुत कॉम्पैक्ट, मजबूत एरर करेक्शन, कर्व्ड सतहों पर भी काम करता है।
- नुकसान: हाई‑क्वालिटी प्रिंटिंग चाहिए, स्कैनर सपोर्ट कम सामान्य।
त्वरित तुलना
| बारकोड प्रकार | डेटा क्षमता | सबसे उपयुक्त | सामान्य आकार |
|---|---|---|---|
| Code128 | ~100 कैर. | सामान्य‑उद्देश्य टैगिंग | छोटा |
| QR Code | ~4 000 कैर. | मोबाइल स्कैन, रिच डेटा | मध्यम |
| Code39 | ~43 कैर. | लेगेसी हार्डवेयर | बड़ा |
| Data Matrix | ~3 000 कैर. | टिनी स्पेस, इंडस्ट्रियल टैग | बहुत छोटा |
सिफ़ारिश: सरल IDs के लिए Code128 से शुरू करें। जब URL या बड़े पेलोड की ज़रूरत हो तो QR पर स्विच करें। लेगेसी इंटीग्रेशन के लिए केवल Code39 उपयोग करें।
सामान्य समस्याएँ और समाधान
समस्या: “वेरिफ़िकेशन के दौरान बारकोड नहीं मिला”
लक्षण: बारकोड दिख रहा है लेकिन वेरिफ़िकेशन false रिटर्न करता है।
आम कारण
- केस मिसमैच (जैसे “John Smith” बनाम “john smith”)।
- एन्कोडेड टेक्स्ट में अतिरिक्त व्हाइटस्पेस।
- वेरिफ़िकेशन विकल्प में गलत बारकोड प्रकार।
- गलत पेज नंबर पर सर्च।
समाधान: साइन और वेरिफ़िकेशन से पहले टेक्स्ट को नॉर्मलाइज़ करें और setEncodeType को मूल प्रकार से मिलाएँ।
// Always normalize your data
String signatureText = originalText.trim().toLowerCase();
// When signing:
BarcodeSignOptions signOptions = new BarcodeSignOptions(signatureText, BarcodeTypes.Code128);
// When verifying:
BarcodeVerifyOptions verifyOptions = new BarcodeVerifyOptions();
verifyOptions.setText(signatureText); // Use the same normalized text
verifyOptions.setEncodeType(BarcodeTypes.Code128);
समस्या: “बारकोड धुंधला या अनरीडेबल दिख रहा है”
लक्षण: प्रिंटेड बारकोड स्कैन नहीं हो रहा।
कारण
- एन्कोडेड डेटा के लिए बारकोड साइज बहुत छोटा।
- प्रिंटर रिज़ॉल्यूशन कम।
- बारकोड रंग और बैकग्राउंड के बीच कंट्रास्ट कम।
समाधान: बारकोड की चौड़ाई/ऊँचाई बढ़ाएँ, हाई कंट्रास्ट रंग (काला‑सफ़ेद) उपयोग करें, और प्रिंटर DPI कम से कम 300 dpi सेट करें।
// Increase size for longer strings
int dataLength = barcodeText.length();
int minWidth = Math.max(100, dataLength * 10); // 10px per character minimum
BarcodeSignOptions signOptions = new BarcodeSignOptions(barcodeText, BarcodeTypes.Code128);
signOptions.setWidth(minWidth);
signOptions.setHeight(60); // Taller = easier to scan
// Use high-contrast colors
signOptions.setForeColor(Color.BLACK); // Black on white is most reliable
signOptions.setBackColor(Color.WHITE);
समस्या: “बड़े दस्तावेज़ों पर OutOfMemoryError”
लक्षण: सैकड़ों पेज वाले PDF प्रोसेस करते समय एप्लिकेशन क्रैश हो जाता है।
कारण: लाइब्रेरी पूरे दस्तावेज़ को मेमोरी में लोड करती है।
समाधान: स्ट्रीमिंग मोड एनेबल करें और पेज‑वाइज़ प्रोसेस करें।
// Process pages in batches instead of all at once
BarcodeSearchOptions searchOptions = new BarcodeSearchOptions();
searchOptions.setAllPages(false);
List<BarcodeSignature> allSignatures = new ArrayList<>();
for (int page = 1; page <= totalPages; page++) {
searchOptions.setPageNumber(page);
List<BarcodeSignature> pageSignatures = signature.search(BarcodeSignature.class, searchOptions);
allSignatures.addAll(pageSignatures);
// Process and clear as you go
if (page % 10 == 0) {
System.gc(); // Suggest garbage collection every 10 pages
}
}
समस्या: “विभिन्न दस्तावेज़ प्रकारों पर सिग्नेचर पोज़िशन असंगत”
लक्षण: PDF बनाम Word साइन करते समय बारकोड अलग‑अलग लोकेशन पर दिखता है।
कारण: PDF में ओरिजिन बॉटम‑लेफ़्ट है, जबकि Word में टॉप‑लेफ़्ट।
समाधान: दस्तावेज़ प्रकार का पता लगाएँ और उपयुक्त कोऑर्डिनेट ट्रांसफ़ॉर्मेशन लागू करें।
// Use relative positioning instead of absolute
signOptions.setVerticalAlignment(VerticalAlignment.Bottom);
signOptions.setHorizontalAlignment(HorizontalAlignment.Right);
// Then use margins for fine-tuning
Padding margin = new Padding();
margin.setRight(50); // 50px from right edge
margin.setBottom(50); // 50px from bottom
signOptions.setMargin(margin);
// This works consistently across PDF, DOCX, XLSX, etc.
समस्या: “अपडेट के बाद सिग्नेचर फ़ॉर्मेटिंग खो जाता है”
लक्षण: update कॉल करने पर बारकोड का रंग या फ़ॉन्ट अनपेक्षित रूप से बदल जाता है।
कारण: सभी विज़ुअल प्रॉपर्टीज़ अपडेट ऑपरेशन में स्थायी नहीं रहतीं।
समाधान: अपडेट कॉल के बाद आवश्यक विज़ुअल सेटिंग्स फिर से लागू करें।
// When updating, explicitly set all visual properties
bcSignature.setLeft(newLeft);
bcSignature.setTop(newTop);
bcSignature.setWidth(originalWidth); // Don't forget these!
bcSignature.setHeight(originalHeight);
// Note: Color and font can't be updated - you'd need to delete and re-sign
प्रोडक्शन के लिए बेस्ट प्रैक्टिसेज़
परफ़ॉर्मेंस ऑप्टिमाइज़ेशन
- Signature इंस्टेंस रीउस करें – प्रत्येक दस्तावेज़ के लिए एक
Signatureऑब्जेक्ट बनाएं और कई ऑपरेशन्स के लिए रीउस करें।
// Bad - Creates new instance each time
public void processDocument(String path) {
Signature sig1 = new Signature(path);
sig1.search(/* ... */);
Signature sig2 = new Signature(path); // Unnecessary reload
sig2.verify(/* ... */);
}
// Good - Reuse the same instance
public void processDocument(String path) {
try (Signature signature = new Signature(path)) {
signature.search(/* ... */);
signature.verify(/* ... */);
signature.update(/* ... */);
}
}
- सिर्फ आवश्यक पेज सर्च करें – बारकोड जहाँ अपेक्षित हों, उन पेज रेंज को सीमित करें।
// Slow for 100+ page documents
BarcodeSearchOptions slowSearch = new BarcodeSearchOptions();
slowSearch.setAllPages(true);
// Fast - only check where signatures actually are
BarcodeSearchOptions fastSearch = new BarcodeSearchOptions();
fastSearch.setAllPages(false);
fastSearch.setPageNumber(1); // Only check cover page
- सबसे सरल बारकोड प्रकार चुनें – सरल बारकोड तेज़ जनरेट होते हैं; केवल तभी QR या Data Matrix उपयोग करें जब अतिरिक्त क्षमता की ज़रूरत हो।
// Overkill for simple IDs
BarcodeSignOptions slow = new BarcodeSignOptions("12345", BarcodeTypes.QR);
// Faster and more appropriate
BarcodeSignOptions fast = new BarcodeSignOptions("12345", BarcodeTypes.Code128);
सुरक्षा विचार
- संवेदनशील व्यक्तिगत डेटा एन्कोड न करें – बारकोड आसानी से पढ़े जा सकते हैं; SSN या पासवर्ड जैसे PII से बचें।
// Bad - exposes sensitive data
String barcodeData = "SSN:123-45-6789|Password:hunter2";
// Good - use reference IDs
String barcodeData = "USER-REF-7721X"; // Look up sensitive data server-side
- सर्वर‑साइड वेरिफ़िकेशन – केवल क्लाइंट‑साइड वेरिफ़िकेशन पर भरोसा न करें; हमेशा विश्वसनीय बैकएंड पर री‑वेरिफ़ाई करें।
// Client scans barcode and extracts "APPROVED-BY-ADMIN"
// Always verify server-side:
public boolean verifyApproval(String documentId, String scannedData) {
// Load document from secure storage
Signature signature = new Signature(getSecureDocument(documentId));
BarcodeVerifyOptions verifyOptions = new BarcodeVerifyOptions();
verifyOptions.setText(scannedData);
boolean isValid = signature.verify(verifyOptions) != null;
// Also check against your database
boolean isInDatabase = checkApprovalDatabase(documentId, scannedData);
return isValid && isInDatabase;
}
- टाइमस्टैम्प जोड़ें – रिप्ले अटैक रोकने के लिए बारकोड पेलोड में टाइमस्टैम्प शामिल करें।
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
String timestamp = LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS).toString();
String barcodeData = "APPROVAL|" + userId + "|" + timestamp;
// When verifying, check the timestamp isn't too old
public boolean isSignatureRecent(String barcodeData, int maxAgeHours) {
String[] parts = barcodeData.split("\\|");
if (parts.length < 3) return false;
LocalDateTime signatureTime = LocalDateTime.parse(parts[2]);
LocalDateTime now = LocalDateTime.now();
long hoursSince = ChronoUnit.HOURS.between(signatureTime, now);
return hoursSince <= maxAgeHours;
}
एरर‑हैंडलिंग पैटर्न
- ट्राई‑विथ‑रिसोर्सेज़ हमेशा उपयोग करें ताकि
Signatureऑब्जेक्ट सही ढंग से डिस्पोज़ हो।
try (Signature signature = new Signature(documentPath)) {
// Your operations here
signature.sign(outputPath, signOptions);
} catch (Exception e) {
logger.error("Failed to sign document: " + documentPath, e);
throw new DocumentSigningException("Could not process document", e);
}
- फ़ाइल एक्सेस वैलिडेट करें साइन करने से पहले।
public void signDocument(String inputPath, String outputPath) {
File inputFile = new File(inputPath);
if (!inputFile.exists()) {
throw new IllegalArgumentException("Input file not found: " + inputPath);
}
if (!inputFile.canRead()) {
throw new SecurityException("Cannot read input file: " + inputPath);
}
File outputDir = new File(outputPath).getParentFile();
if (outputDir != null && !outputDir.exists()) {
outputDir.mkdirs();
}
try (Signature signature = new Signature(inputPath)) {
signature.sign(outputPath, signOptions);
}
}
- एक्सेस सिंक्रोनाइज़ करें यदि कई थ्रेड्स एक ही फ़ाइल पर काम कर सकते हैं।
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.ConcurrentHashMap;
public class SignatureManager {
private final ConcurrentHashMap<String, ReentrantLock> documentLocks = new ConcurrentHashMap<>();
public void signDocument(String documentPath, BarcodeSignOptions options) {
ReentrantLock lock = documentLocks.computeIfAbsent(documentPath, k -> new ReentrantLock());
lock.lock();
try (Signature signature = new Signature(documentPath)) {
signature.sign(documentPath + ".signed", options);
} finally {
lock.unlock();
}
}
}
इम्प्लीमेंटेशन टेस्टिंग
यूनिट टेस्ट टेम्पलेट
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import static org.junit.jupiter.api.Assertions.*;
public class BarcodeSignatureTest {
@TempDir
Path tempDir;
@Test
public void testSignAndVerify() throws Exception {
// Setup
String testDoc = "test-document.pdf";
String outputDoc = tempDir.resolve("signed-test.pdf").toString();
String testData = "TEST-USER-12345";
// Sign
try (Signature signature = new Signature(testDoc)) {
BarcodeSignOptions signOptions = new BarcodeSignOptions(testData, BarcodeTypes.Code128);
signature.sign(outputDoc, signOptions);
}
// Verify
try (Signature signature = new Signature(outputDoc)) {
BarcodeVerifyOptions verifyOptions = new BarcodeVerifyOptions();
verifyOptions.setText(testData);
verifyOptions.setEncodeType(BarcodeTypes.Code128);
boolean isValid = signature.verify(verifyOptions) != null;
assertTrue(isValid, "Signature should be valid");
}
}
@Test
public void testSearchFindsSignature() throws Exception {
String signedDoc = "signed-document.pdf";
try (Signature signature = new Signature(signedDoc)) {
BarcodeSearchOptions searchOptions = new BarcodeSearchOptions();
searchOptions.setAllPages(true);
List<BarcodeSignature> signatures = signature.search(BarcodeSignature.class, searchOptions);
assertFalse(signatures.isEmpty(), "Should find at least one signature");
assertEquals("TEST-USER-12345", signatures.get(0).getText());
}
}
}
इंटीग्रेशन चेकलिस्ट
- ✅ सभी सपोर्टेड फ़ॉर्मैट (PDF, DOCX, XLSX, PPTX, PNG) टेस्ट करें।
- ✅ प्रिंट‑स्कैन साइकिल के बाद बारकोड की पढ़ने योग्यता वेरिफ़ाई करें।
- ✅ अधिकतम लंबाई डेटा स्ट्रिंग्स के साथ स्ट्रेस‑टेस्ट करें।
- ✅ A4, लेटर और कस्टम पेज साइज पर पोज़िशन की पुष्टि करें।
- ✅ कई दस्तावेज़ों पर एक साथ साइनिंग चलाएँ।
- ✅ 500 पेज से अधिक दस्तावेज़ों के लिए मेमोरी उपयोग मॉनिटर करें।
- ✅ सुनिश्चित करें कि बारकोड स्कैनर आउटपुट को विश्वसनीयता से पढ़ता है।
लॉगिंग और मॉनिटरिंग
प्रत्येक ऑपरेशन के आसपास अर्थपूर्ण लॉग जोड़ें:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DocumentSigningService {
private static final Logger logger = LoggerFactory.getLogger(DocumentSigningService.class);
public void signDocument(String docPath, String barcodeData) {
logger.info("Starting signature process for document: {}", docPath);
logger.debug("Barcode data length: {} characters", barcodeData.length());
try (Signature signature = new Signature(docPath)) {
BarcodeSignOptions options = new BarcodeSignOptions(barcodeData, BarcodeTypes.Code128);
long startTime = System.currentTimeMillis();
signature.sign(docPath + ".signed", options);
long duration = System.currentTimeMillis() - startTime;
logger.info("Successfully signed document in {}ms", duration);
} catch (Exception e) {
logger.error("Failed to sign document: {}", docPath, e);
throw new RuntimeException("Signature operation failed", e);
}
}
}
प्रोसेसिंग टाइम, मेमोरी कंजम्प्शन और एरर रेट जैसे प्रमुख मेट्रिक्स ट्रैक करें:
// Track success/failure rates
metricsService.incrementCounter("signature.sign.success");
metricsService.incrementCounter("signature.verify.failure");
// Track performance
metricsService.recordTimer("signature.sign.duration", duration);
// Track document sizes
metricsService.recordHistogram("signature.document.pages", pageCount);
वास्तविक‑दुनिया उपयोग से प्रो टिप्स
बॅच प्रोसेसिंग स्ट्रैटेजी
सैकड़ों फ़ाइलों को हैंडल करते समय बॅच में प्रोसेस करें और प्रोग्रेस रिपोर्ट करें:
public void signBatch(List<String> documents, String barcodePrefix) {
int total = documents.size();
int completed = 0;
int failed = 0;
for (String docPath : documents) {
try {
String barcodeData = barcodePrefix + "-" + UUID.randomUUID().toString();
signDocument(docPath, barcodeData);
completed++;
if (completed % 10 == 0) {
logger.info("Progress: {}/{} documents signed", completed, total);
}
} catch (Exception e) {
failed++;
logger.warn("Failed to sign: {}", docPath, e);
}
}
logger.info("Batch complete: {} succeeded, {} failed", completed, failed);
}
कॉन्फ़िगरेशन एक्सटर्नलाइज़ करें
बारकोड सेटिंग्स (टाइप, साइज, कलर) को प्रॉपर्टीज़ फ़ाइल में रखें ताकि री‑कम्पाइल किए बिना आसानी से ट्यून किया जा सके:
public class BarcodeConfig {
private int defaultWidth = 100;
private int defaultHeight = 40;
private String defaultBarcodeType = "Code128";
private String defaultColor = "BLACK";
// Load from properties file or environment variables
public BarcodeConfig() {
this.defaultWidth = Integer.parseInt(
System.getProperty("barcode.width", "100")
);
// ... load other properties
}
public BarcodeSignOptions createDefaultOptions(String text) {
BarcodeSignOptions options = new BarcodeSignOptions(text, getBarcodeType());
options.setWidth(defaultWidth);
options.setHeight(defaultHeight);
options.setForeColor(getColor());
return options;
}
}
बारकोड पेलोड स्टैंडर्डाइज़ करें
EMPID|TIMESTAMP|DOCID जैसे डिलिमिटेड फ़ॉर्मैट का उपयोग करें जिससे पार्सिंग सरल और सुसंगत रहे:
public class BarcodeDataBuilder {
private String userId;
private String action;
private LocalDateTime timestamp;
private String documentId;
public BarcodeDataBuilder setUserId(String userId) {
this.userId = userId;
return this;
}
public BarcodeDataBuilder setAction(String action) {
this.action = action;
return this;
}
public BarcodeDataBuilder setDocumentId(String documentId) {
this.documentId = documentId;
return this;
}
public String build() {
this.timestamp = LocalDateTime.now();
// Format: VERSION|USER|ACTION|DOC_ID|TIMESTAMP|CHECKSUM
String data = String.join("|",
"v1",
userId,
action,
documentId,
timestamp.toString()
);
// Add simple checksum
int checksum = data.hashCode();
return data + "|" + checksum;
}
public static ParsedBarcodeData parse(String barcodeData) {
String[] parts = barcodeData.split("\\|");
if (parts.length != 6 || !parts[0].equals("v1")) {
throw new IllegalArgumentException("Invalid barcode format");
}
return new ParsedBarcodeData(parts[1], parts[2], parts[3],
LocalDateTime.parse(parts[4]));
}
}
// Usage:
String barcodeData = new BarcodeDataBuilder()
.setUserId("john.smith")
.setAction("APPROVED")
.setDocumentId("INV-2025-042")
.build();
डॉक्यूमेंट टाइप ऑटो‑डिटेक्ट करें
PDF, Word या इमेज़ टार्गेट के आधार पर बारकोड डाइमेंशन को स्वचालित रूप से एडजस्ट करें:
public BarcodeSignOptions getOptimalOptions(String documentPath, String text) {
String extension = documentPath.substring(documentPath.lastIndexOf(".") + 1).toLowerCase();
BarcodeSignOptions options = new BarcodeSignOptions(text, BarcodeTypes.Code128);
switch (extension) {
case "pdf":
// PDFs can handle larger, detailed barcodes
options.setWidth(150);
options.setHeight(50);
break;
case "docx":
case "doc":
// Word docs need compact signatures that don't disrupt flow
options.setWidth(100);
options.setHeight(35);
options.setVerticalAlignment(VerticalAlignment.Bottom);
break;
case "xlsx":
case "xls":
// Excel needs signatures that don't obscure data
options.setWidth(80);
options.setHeight(30);
options.setHorizontalAlignment(HorizontalAlignment.Right);
break;
default:
// Safe defaults
options.setWidth(100);
options.setHeight(40);
}
return options;
}
अतिरिक्त संसाधन
- GroupDocs.Signature documentation – पूर्ण API गाइड और उपयोग उदाहरण।
- GroupDocs support forum – कम्युनिटी मदद और ट्रबलशूटिंग।
- API reference – विस्तृत मेथड सिग्नेचर और पैरामीटर विवरण।
अक्सर पूछे जाने वाले प्रश्न
प्रश्न: क्या मैं GroupDocs.Signature को Java 17 के साथ उपयोग कर सकता हूँ?
उत्तर: हाँ – लाइब्रेरी JDK 8, 11 और 17 के साथ पूरी तरह कम्पैटिबल है।
प्रश्न: क्या बारकोड प्रिंट‑स्कैन साइकिल के बाद भी काम करता है?
उत्तर: यदि आप Code128 या QR को पर्याप्त साइज और कंट्रास्ट के साथ उपयोग करते हैं, तो बारकोड प्रिंट‑स्कैन के बाद भी स्कैन‑योग्य रहता है।
प्रश्न: एक दस्तावेज़ में अधिकतम कितने बारकोड रखे जा सकते हैं?
उत्तर: कोई हार्ड लिमिट नहीं है; लेकिन बेहतर परफ़ॉर्मेंस के लिए कुल संख्या 200 से नीचे रखें।
प्रश्न: विकास बिल्ड के लिए लाइसेंस आवश्यक है?
उत्तर: टेम्पररी लाइसेंस इवैल्यूएशन वाटरमार्क हटाता है; प्रोडक्शन डिप्लॉयमेंट के लिए पूर्ण लाइसेंस अनिवार्य है।
प्रश्न: क्या मैं पासवर्ड‑प्रोटेक्टेड PDF साइन कर सकता हूँ?
उत्तर: हाँ – Signature ऑब्जेक्ट बनाते समय पासवर्ड प्रदान करें; API आंतरिक रूप से फ़ाइल को अनलॉक कर देगा।
अंतिम अपडेट: 2026-07-15
टेस्टेड विथ: GroupDocs.Signature 23.9 for Java
लेखक: GroupDocs