2012-09-24 13 views
5

मैं मौजूदा पीडीएफ फ़ाइल में जानकारी जोड़ने के लिए iTextSharp 5.3.2.0 का उपयोग कर रहा हूं जिसमें डब्ल्यू -2 प्रपत्र। सब कुछ पूरी तरह से काम कर रहा है और ब्राउज़र की प्रतिक्रिया धारा में लिखे जाने पर पीडीएफ फ़ाइल बहुत अच्छी लगती है; हालांकि, जब उपयोगकर्ता पीडीएफ को देखता है, तो उससे पूछा जाता है "क्या आप बंद करने से पहले 'W2.pdf' में परिवर्तनों को सहेजना चाहते हैं?" हर बार जब वह वेब पेज से दस्तावेज़ देखता है।पीडीएफ में डेटा लिखने के लिए iTextSharp का उपयोग करना बहुत अच्छा काम करता है, लेकिन एक्रोबैट रीडर फ़ाइल को बंद करते समय 'क्या आप परिवर्तनों को सहेजना चाहते हैं' पूछता है

समस्या को कम करने की कोशिश में, मैंने वास्तव में मेरे सभी संशोधनों को हटा दिया है लेकिन समस्या जारी है। यहाँ मेरी कोड के सरल संस्करण है, अपने डेटा-लेखन कॉल के साथ बाहर टिप्पणी की:

PdfReader pdfReader = new PdfReader(dataSource.ReportTemplate); 

using(MemoryStream outputStream = new MemoryStream()) 
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, outputStream)) 
{ 
    //dataSource.DrawDataFields(pdfStamper); 
    pdfStamper.FormFlattening = true; 
    return outputStream; 
} 

इस मामले में, "खाली" पीडीएफ ब्राउज़र को पत्र लिखा और अच्छा लग रहा है है, लेकिन मैं अभी भी पूछे जाते, "क्या जब आप एक्रोबैट विंडो बंद करते हैं तो आप "सहेजना चाहते हैं।

इस बिंदु पर मैं सोच रहा था कि स्रोत पीडीएफ फ़ाइल में कुछ गड़बड़ है। हालांकि, जब मैं ब्राउज़र में पीडीएफ फ़ाइल के कच्चे बाइट वापस भेजता हूं, तो मुझे नीचे दिए गए कोड का उपयोग करते समय "क्या आप सहेजना चाहते हैं" प्रश्न से नहीं पूछा जाता है।

byte[] bytes = File.ReadAllBytes(dataSource.ReportTemplate); 

using (MemoryStream outputStream = new MemoryStream()) 
{ 
    outputStream.Write(bytes, 0, bytes.Length); 
    return outputStream; 
} 

मेरा निष्कर्ष है कि iTextSharp कुछ "बुरा" इसे खोलने और धारा बाइट्स लिखने की प्रक्रिया में पीडीएफ करने के लिए कर रहा है, लेकिन मैं iTextSharp के लिए नया हूँ और आसानी से कुछ कमी हो सकती है।

एफडब्ल्यूआईडब्ल्यू, यह एक्रोबैट रीडर 10.1.4 है जिसके बारे में हम बात कर रहे हैं।

संपादित करें: टेम्पलेट के रूप में उपयोग किया जाने वाला मूल पीडीएफ आकार में लगभग 80K है। अगर मैं अपने ब्राउज़र के माध्यम से स्ट्रीम की गई अस्थायी फ़ाइल को देखता हूं, तो iTextSharp द्वारा लिखी गई पीडीएफ फाइल लगभग 150K है। हालांकि, जब मैं एक्रोबैट रीडर द्वारा पूछे गए "सहेजें परिवर्तन" प्रश्न के लिए "हां" का उत्तर देता हूं, परिणामी फ़ाइल लगभग 80K फिर से होती है। iTextSharp निश्चित रूप से इस फ़ाइल के लिए अप्रत्याशित कुछ कर रहा है।

+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/2186817/itextsharp-filestream-corrupt-pdf-file – VahidN

+0

निश्चित रूप से http://thread.gmane.org/gmane.comp.java.lib के साथ एक डुप्लिकेट। itext.general/63197 –

+0

आईएमओ, यह वाहिडन द्वारा लिखे गए एक से अलग मुद्दा है - ध्यान दें कि मैं एक मौजूदा पीडीएफ फाइल में पढ़ रहा हूं, फिर उस पर टेक्स्ट लिख रहा हूं। लेकिन अगर मैं अपने टेक्स्ट-लेखन कोड पर टिप्पणी करता हूं, तो समस्या होती है। – marc

उत्तर

14

गैर काम:

public byte[] MergeDataByDrawing(int copies) 
{ 
    PdfReader pdfReader = new PdfReader(reportTemplate); 

    using (MemoryStream outputStream = new MemoryStream()) 
    using (PdfStamper pdfStamper = new PdfStamper(pdfReader, outputStream)) 
    { 
     pdfStamper.FormFlattening = true; 
     return outputStream.GetBuffer(); 
    } 
} 

कार्य:

public byte[] MergeDataByDrawing(int copies) 
{ 
    PdfReader pdfReader = new PdfReader(reportTemplate); 

    using (MemoryStream outputStream = new MemoryStream()) 
    using (PdfStamper pdfStamper = new PdfStamper(pdfReader, outputStream)) 
    { 
     pdfStamper.FormFlattening = true; 
     return outputStream.ToArray(); 
    } 
} 

लगता GetBuffer विधि एक समस्या है। मुझे समझ में नहीं आता क्यों, लेकिन मैं परिणाम ले जाऊंगा!

Props to MKL for giving me an idea और Fredrik for the right example at the right time

+2

'MemoryStream.GetBuffer()' स्ट्रीम में निहित वास्तविक डेटा में कचरा जोड़ सकता है। [दस्तावेज़ीकरण देखें] (http://msdn.microsoft.com/en-us/library/system.io.memorystream.getbuffer.aspx)। तो iTextSharp के साथ काम करते समय हमेशा 'ToArray()' को कॉल करें। – kuujinbo

+2

एक पीडीएफ नीचे से ऊपर तक पढ़ा जाता है। एक पीडीएफ रीडर अंतिम बाइट्स '%% EOF' होने की अपेक्षा करता है। यदि अन्य बाइट्स '%% EOF' की अंतिम घटना के बाद जोड़े जाते हैं, तो कुछ पाठक इसे ठीक करने का प्रयास करेंगे। क्या आपकी समस्या को ठीक करने के लिए 'ToArray()' है? उस स्थिति में, मुझे पीडीएफ भेजने के लिए जरूरी नहीं है। यह सुनिश्चित करने के लिए कि आपको सही समाधान मिल गया है, आप 'GetBuffer()' बनाम 'ToArray() 'द्वारा उत्पादित बाइट्स की संख्या की तुलना कर सकते हैं। यदि 'ToArray()' कम बाइट उत्पन्न करता है, तो आपने समस्या हल कर ली है। –

+0

हां, ToArray() लगभग बाइट्स की संख्या वापस लौटा और प्रतिष्ठा !, सब ठीक था। – marc

1

देखें http://itextpdf.com/history/?branch=52&node=521

Bugfix AcroForms: कुछ मामलों में, एडोब रीडर एक्स पूछता है कि आप करना चाहते हैं "परिवर्तनों को सहेजने" चपटा पीडीएफ प्रपत्र बंद करने के बाद। यह /AcroForm शब्दकोश में कुछ अनावश्यक प्रविष्टियों की उपस्थिति के कारण था ( उदाहरण के लिए जब ओओओ के साथ फ़ॉर्म बनाया गया था)।

मैं ब्रूनो हूं जिसने इस बग को ठीक किया है। मुझे याद है कि यह एडोब रीडर 10 में हुआ था, लेकिन एडोब रीडर 9 में नहीं। मैं बग को ठीक करने में सक्षम था क्योंकि यह रिपोर्ट करने वाला व्यक्ति एक ग्राहक था जिसने मुझे एक पीडीएफ भेजा जिसने इस व्यवहार को दिखाया।

यदि आप अपना पीडीएफ साझा करेंगे, तो हम देख सकते हैं और /AcroForm शब्दकोश से अन्य प्रविष्टियों को हटाया जाना चाहिए। मैंने केवल उन लोगों को हटा दिया जिन्हें ओपन ऑफिस का उपयोग करते समय फॉर्म बनाया गया था। यदि आप पीडीएफ साझा नहीं करना चाहते हैं, तो कारण हमेशा एक रहस्य रहेगा।

+0

मैं अपना पीडीएफ साझा करने के लिए उत्सुक हूं - मैं इसे आपको कैसे प्राप्त करूं? मैं कहूंगा कि मैंने "pdfReader.Catalog.Remove (PdfName.ACROFORM)" करने का प्रयास किया, लेकिन इसका कोई प्रभाव नहीं पड़ा। – marc