PDFBox कई हस्ताक्षर अमान्य हस्ताक्षर जावा दे रहे हैं

Nov 26 2020

मैं कुछ पीडीएफ बहु हस्ताक्षर वर्कफ़्लो आवश्यकता थी। इस में पीडीएफ को दस्तावेज़ में बदलाव के बिना कई बार साइन इन करना होगा 2 या अधिक लोग एक ही दस्तावेज़ पर हस्ताक्षर कर सकते हैं। मैं दो बार पीडीएफ में हस्ताक्षर जोड़ने की कोशिश कर रहा हूं, लेकिन दूसरी बार पीडीएफ पर हस्ताक्षर करने के बाद पहला हस्ताक्षर अमान्य हो गया। मैंने पीडीएफ हस्ताक्षर निर्माण के लिए पीडीएफबॉक्स जावा एपी का उपयोग किया है।

पीडीएफ निर्माण कदम:

  1. खाली हस्ताक्षर फ़ील्ड नामों को जोड़कर बनाया गया pdf: [email protected] और [email protected] मूल hello.pdf का उपयोग करके फ़ाइल नाम hello_tag.pdf रन प्रोग्राम> TagPDFSignatureFields.java
  2. पहली बार hello_tag.pdf फ़ाइल से हस्ताक्षर फ़ील्ड [email protected] प्राप्त करके, फ़ाइल का नाम hello_signed.pdf रन प्रोग्राम> SignAndIdentifySignatureFields.java
  3. दूसरी बार हस्ताक्षर करने के लिए हस्ताक्षर फ़ील्ड [email protected] पर लाकर hello_signed.pdf फ़ाइल से, फ़ाइल का नाम है hello_singed2.pdf रन प्रोग्राम> Sign2.java

2nd स्टेप में पीडीएफ़ को ठीक से साइन इन किया जाता है लेकिन 3rd स्टेप के बाद, 2nd स्टेप हस्ताक्षरित संस्करण को इनवैलिड किया जाता है और 3rd स्टेप सिग्नेचर एक्रोबेट रीडर में ठीक दिखाता है।

कृपया संदर्भ के लिए लिंक जावा स्रोत कोड और पीडीएफ नमूना देखें। Google ड्राइव लिंक pdf_multi_signs_pdfbox_java

किसी भी सहायता की सराहना की जाएगी।

जवाब

3 mkl Nov 27 2020 at 01:26

संक्षेप में आपके कोड में कई समस्याएं हैं। समस्या यह है कि Adobe Reader आपके पहले हस्ताक्षर को अमान्य के रूप में चिह्नित करने के बाद एक दूसरा हस्ताक्षर वास्तव में पहले से ही आपके तैयारी चरण में है TagPDFSignatureFieldsजहां आप एक अमान्य डुप्लिकेट पृष्ठ प्रविष्टि बनाते हैं। अन्य मुद्दों को भी तय किया जाना चाहिए, भले ही एडोब रीडर वर्तमान में शिकायत नहीं करता है।

विस्तार से मुद्दे ...

डुप्लिकेट पेज प्रविष्टि

में TagPDFSignatureFieldsअपने विधि addEmptySignFieldइस तरह शुरू होता है:

private void addEmptySignField(String[] args) throws Exception, IOException {
    // Create a new document with an empty page.
    try (PDDocument document = PDDocument.load(new File(args[0]));)
    {
        PDPage page = document.getPage(0);
        document.addPage(page);

यहाँ आप पहले पृष्ठ को पुनः प्राप्त करते हैं documentऔर तुरंत उस पृष्ठ को documentफिर से जोड़ते हैं । यह hello_tag.pdfइस तरह दिखने के लिए आपकी फ़ाइल के पृष्ठों के मूल नोड का कारण बनता है :

2 0 obj
<<
/Type /Pages
/Count 2
/Kids [6 0 R 6 0 R]
>>
endobj 

यानी पेज ट्री में दो बार एक ही पेज ऑब्जेक्ट होता है जिसे Adobe Reader स्वीकार नहीं करता है लेकिन हुड के नीचे मरम्मत करता है। हस्ताक्षरित दस्तावेजों के लिए एडोब रीडर इस बारे में अस्पष्ट तरीके से चेतावनी देता है:

और वर्तमान संस्करणों में (जैसे 2020.013.20066) दो बार हस्ताक्षरित फ़ाइल में एडोब रीडर यहां तक ​​कि पहले हस्ताक्षर को टूटा हुआ के रूप में चिह्नित करता है। पहले के संस्करणों में (जैसे 2019.012.20040) ऐसा नहीं किया था। संभवतः यह छाया कोड प्रकाशित होने के बाद सत्यापन कोड के सख्त होने का एक प्रभाव है।

एक तरफ के रूप में: यदि आपके पास एक ऐसी स्थिति है जिसमें एक हस्ताक्षरित दस्तावेज़ (फॉर्म भरना-इन्स, फिर से हस्ताक्षर करना, ...) में हेरफेर करना पुराने हस्ताक्षरों को तोड़ता है, तो हमेशा यह भी जांचें कि क्या मूल दस्तावेज़ में पहले से ही समस्याएं हो सकती हैं। जाँच करें कि क्या हस्ताक्षरित दस्तावेज़ पर लागू किए गए परिवर्तनों की अनुमति है, त्रुटियों के प्रति काफी संवेदनशील हैं जो अन्यथा हुड के नीचे तय किए गए हैं और इसलिए, दिखाई नहीं दे रहे हैं।

अमान्य आंशिक फ़ील्ड नाम

आप फ़ील्ड के नाम [email protected]और [email protected]अपने उदाहरण के मामले में ईमेल पते का उपयोग करते हैं:

signatureField.setPartialName("[email protected]");
...
signatureField1.setPartialName("[email protected]");

( TagPDFSignatureFieldsविधि addEmptySignField)

ये आंशिक फ़ील्ड नाम अमान्य हैं, आंशिक फ़ील्ड नामों में अवधि वर्ण ('।') नहीं होना चाहिए।

भविष्य के संस्करणों में PDFBox इसे रोकने की कोशिश करेगा, PDFBOX-5028 देखें ।

डिफ़ॉल्ट संसाधन और साइन अप करने पर डिफ़ॉल्ट रूप सेट करना

हस्ताक्षर करने के दौरान आप AcroForm शब्दकोश के डिफ़ॉल्ट संसाधन और डिफ़ॉल्ट उपस्थिति सेट करते हैं :

acroForm.setDefaultResources(resources);
...
acroForm.setDefaultAppearance(defaultAppearanceString);

( SignAndIdentifySignatureFieldsऔर Sign2विधि addEmptySignField)

अपने आप से यह एक बुरी बात नहीं है, लेकिन सावधान रहें, यदि आप इसे पहले से साइन की गई फ़ाइल में करते हैं, जिसमें पहले से ही ऐसी प्रविष्टियाँ हैं और आप उन्हें पहले से भिन्न मानों पर सेट करते हैं, तो यह पूर्व के हस्ताक्षर को अमान्य कर सकता है , यहाँ दिए गए मुद्दे को देखें ।

बिना आवश्यकता के पीडीएफ संस्करण की स्थापना

आप दस्तावेज़ का दावा किया गया पीडीएफ संस्करण बदलने की कोशिश करते हैं:

document.setVersion(1.0f);

( SignAndIdentifySignatureFieldsविधि addEmptySignField)

document.setVersion(2.0f);

( Sign2विधि addEmptySignField)

पहले निर्देश को अनदेखा कर दिया जाता है क्योंकि दस्तावेज़ में पहले से ही कम से कम 1.5 के संस्करण की आवश्यकता होती है, लेकिन दूसरा निर्देश वास्तव में दस्तावेज़ पीडीएफ संस्करण को 2.0 पर सेट करता है जो पुराने दर्शकों के साथ समस्या पैदा कर सकता है।

...

बहुत अधिक संभावनाएं हैं। मैं केवल पहली बार इन मुद्दों को देखा था इससे पहले कि मैं पहचान लिया कि पहले से ही केवल एक ही फिक्सिंग, डुप्लिकेट पेज प्रविष्टि, पहले हस्ताक्षर को चंगा करने के लिए पर्याप्त ...