2009-01-22 14 views
6

मेरे पास कई टेक्स्ट फ़ील्ड के साथ एक पीडीएफ फॉर्म है। इन क्षेत्रों में दर्ज मानों का उपयोग अन्य क्षेत्रों में मानों की गणना करने के लिए किया जाता है (गणना किए गए फ़ील्ड केवल पढ़ने के लिए होते हैं)।iTextSharp का उपयोग करते हुए अन्य फ़ील्ड भरते समय मैं पीडीएफ में स्वरूपण और गणना कैसे बल दूं?

जब मैं एडोब रीडर में फॉर्म खोलता हूं और फ़ील्ड भरता हूं, तो गणना किए गए फ़ील्ड स्वचालित रूप से फिर से गणना करते हैं।

हालांकि, मैं फ़ील्ड भरने के लिए iTextSharp का उपयोग कर रहा हूं, परिणामी रूप को फ़्लैट करता हूं, फिर वेब पर उपयोगकर्ता को फ़्लैट किए गए फॉर्म को वापस स्ट्रीम करता हूं।

वह हिस्सा गणना की गई फ़ील्ड को कभी भी गणना के अलावा ठीक काम करता है। मुझे लगता है कि चूंकि कोई उपयोगकर्ता घटनाओं को ट्रिगर नहीं करता है (जैसे कि कीडाउन या फोकस या धुंध) फायरिंग कर रहे हैं, गणना नहीं होती है।

जाहिर है, मैं भरने योग्य फॉर्म से गणना हटा सकता हूं और सर्वर पर सभी को कर रहा हूं क्योंकि मैं फ़ील्ड भर रहा हूं, लेकिन मैं भरने योग्य फॉर्म मनुष्यों के साथ-साथ सर्वर के माध्यम से उपयोग करने योग्य बनाना चाहता हूं।

क्या कोई जानता है कि गणनाओं को कैसे बल देना है?

संपादित करें: मैं बहुत अधिक पंछी/iTextSharp प्यार यहाँ नहीं लग रहा है ...

यहाँ कुछ अधिक जानकारी के कर रहे हैं। Stamper.AcroFields.GenerateAppearances सच करने में मदद नहीं करता है।

मुझे लगता है कि जवाब पेज कार्यों में कहीं निहित है, लेकिन मैं इसे कैसे को गति प्रदान करने नहीं पता ...

उत्तर

5

पाउलो सोरेस (नीली लपटें और iTextSharp की वर्तमान मेंटेनर के मुख्य devs में से एक) says:

iText क्योंकि बार है कि असंभव है के सबसे गणना क्षेत्रों ठीक करने के लिए किसी भी प्रयास नहीं करता है। PdfCopyFields इसके लिए कुछ समर्थन है कि कभी-कभी काम करता है और कभी-कभी नहीं करता है।

+0

एक खुश जवाब है, लेकिन इस के लिए मैं क्या देख रहा था है - कम से कम यह निर्णायक सबूत है कि यह वाला काम नहीं है और मैं ले जा सकते हैं कुछ और पर ... – CMPalmer

+0

हाँ। iText को एक्रोबैट के जावास्क्रिप्ट ऑब्जेक्ट मॉडल का समर्थन करना होगा (पूरी तरह से HTML के DOM से अलग)। यह तब तक बेहद असंभव है जब तक कोई ऐसा नहीं करता है और ऐसा करने के लिए iTextSoftware (बहुत कुछ) देता है। यह एक बड़ी नौकरी है। –

+0

क्या यह अभी भी सटीक है? – Denis

1

सर्वर साइड पर, अगर वहाँ गणना क्षेत्र में एक जवाब है देखते हैं। यदि नहीं, तो उनकी गणना करें।

1

जैसा कि ग्रेग हर्लमैन कहते हैं, आपको सर्वर पर गणना करना चाहिए। यह सिर्फ सुविधा के मुकाबले ज्यादा है, इसके लिए वास्तव में एक अच्छा कारण है।

ग्राहक के पास कोई भी फ़ाइल है, उनके पास स्क्रू करने की क्षमता है। मुझे नहीं पता कि पीडीएफ फॉर्म क्या हैं, लेकिन संभावना है कि यह किसी भी तरह से पैसे से जुड़ा हुआ है, इसलिए गणना करने से लोगों को धोखा देने के लिए संभावित परिणाम गलत परिणाम दिखाता है। यदि आप ग्राहक पक्ष पर किए गए गणनाओं पर भरोसा करते हैं, तो आपके पास इसका पता लगाने का कोई तरीका नहीं है।

जब आप क्लाइंट से पीडीएफ फॉर्म प्राप्त करते हैं, तो आपको सभी गणनाओं को फिर से करना चाहिए ताकि आप जानते हैं कि वे सही हैं। फिर यदि आपके पास क्लाइंट के संस्करणों की तुलना करने के लिए भी है, तो आपको यह जांचना चाहिए कि क्या उन्हें खराब कर दिया गया है या नहीं।

ऐसा नहीं लगता कि आपके ग्राहक अविश्वसनीय हैं? आपके लिए अच्छा है, लेकिन सबूत असहमत हैं। प्रोग्रामिंग के लिए मेरे शुरुआती परिचयों में से एक सिमसिटी के लिए savegames खोल रहा था ताकि मैं खुद को और अधिक पैसा दे सकूं। अगर अवसर किसी तरह से धोखा देने का अवसर है, तो किसी बिंदु पर लोग इसे आजमाएंगे।

+0

यह एक अच्छा जवाब है, लेकिन इस मामले में मेरे पास पहले से एक ऐसा फॉर्म है जो गणना करता है और मेरा इरादा उन लोगों के लिए होता है, जिन्हें मैंने सर्वर पर भर दिया था, उन्हें भरने के बाद उन्हें एक अपरिवर्तनीय रूप में भरने के लिए। गणनाएं मुश्किल थीं और मैं पहले से ही क्या लाभ उठाना चाहता था। – CMPalmer

+0

हाँ, वही गणना दो बार लिखना एक दर्द है, लेकिन इसलिए लापता डॉलर को ट्रैक करना है। –

2

मैं डॉक्टर वस्तु पर जावास्क्रिप्ट विधि calculateNow फोन करके मेरी pdfs के सभी गणना फ़ील्ड अपडेट कर दिया है।

एडोब के अनुसार जावास्क्रिप्ट प्रलेखन this.calculateNow();

बलों वर्तमान दस्तावेज़ में सभी गणना क्षेत्रों की गणना।

जब किसी फ़ॉर्म में कई गणनाएं होती हैं, तो उपयोगकर्ता डेटा को डेटा में इनपुट करने के बाद एक महत्वपूर्ण देरी हो सकती है, भले ही यह गणना क्षेत्र न हो। एक रणनीति कुछ बिंदुओं पर गणना बंद करना और उन्हें बाद में चालू करना है (उदाहरण देखें)।

iTextSharp के साथ जावास्क्रिप्ट कॉल शामिल करने के लिए:

using (PdfReader pdfReader = new PdfReader(pdfTemplate)) 
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(newFile, FileMode.Create))) 
{ 
    // fill f1 field and more... 
    AcroFields pdfFormFields = pdfStamper.AcroFields; 
    pdfFormFields.SetField("f1", "100"); 
    //... 

    // add javascript on load event of the pdf 
    pdfStamper.JavaScript = "this.calculateNow();"; 
    pdfStamper.Close(); 
} 
नहीं
+0

चूंकि पीपीएफ दर्शक में ओपन खोले जाने से पहले ओपी फॉर्म को फ़्लैट करता है, जोड़कर जेएस कॉल उसकी मदद नहीं करेगा। – mkl