2011-08-09 23 views
12

मुझे बहुत सारे डेटा के साथ बड़ी पीडीएफ फाइलें मिल रही हैं। वर्तमान पीडीएफ 350 एमबी है और इसमें लगभग 40000 पेज हैं। यह निश्चित रूप से छोटे पीडीएफ प्राप्त करने के लिए अच्छा रहा होगा, लेकिन मुझे अब इसके साथ काम करना है :-(एकल 40000 पेज पीडीएफ को एकल पृष्ठों में विभाजित करें, itextsharp, outofmemoryexception

मैं लोड होने पर कुछ देरी के साथ एक्रोबैट रीडर में इसे खोल सकता हूं लेकिन उस एक्रोबैट रीडर के तुरंत बाद

अब मैं एकल पृष्ठों में विशाल फ़ाइल विभाजित करनी होगी, तो एक या दो पृष्ठ कि प्रत्येक प्राप्तकर्ता प्रत्येक विशेष प्राप्तकर्ता को मिलना चाहिए भेजने पीडीएफ पृष्ठों से कुछ प्राप्तकर्ता डेटा पढ़ने की कोशिश करें, और तब।

यहाँ मेरा बहुत छोटा कोड अब तक का उपयोग कर रहा है Iextsharp:

var inFileName = @"huge350MB40000pages.pdf"; 
PdfReader reader = new PdfReader(inFileName); 
var nbrPages = reader.NumberOfPages; 
reader.Close(); 

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

मुझे लगता है कि "नया पीडीएफ रीडर" पूरे पीडीएफ को स्मृति में पढ़ने का प्रयास करता है।

क्या ऐसा करने के लिए कोई और बेहतर तरीका है? उदाहरण के लिए, क्या मैं किसी भी तरह पीडीएफ फाइल का केवल एक हिस्सा स्मृति में एक बार में पढ़ सकता हूं? क्या यह किसी अन्य लाइब्रेरी का उपयोग itextsharp से बेहतर कर सकता है?

+2

वोल्फ्राम अल्फा का कहना है कि दोनों पक्षों पर मुद्रित 40,000 पेज दस्तावेज़ 80 इंच लंबा होगा - 2 मीटर से अधिक। – Cheeso

+2

जिज्ञासा की बस, यह पीडीएफ क्या है? –

+0

http://stackoverflow.com/questions/656351/can-anyone-recommend-a-good-pdf-reading-library-for-net किसी अन्य लाइब्रेरी या दो को आजमाने के लिए उपयोगी हो सकता है यह देखने के लिए कि कुछ बेहतर गुण हैं या नहीं। –

उत्तर

15

जो मैंने पढ़ा है, उससे ऐसा लगता है कि पीडीएफ रीडर को तुरंत चालू करते समय आपको उस निर्माता का उपयोग करना चाहिए जो RandomAccessFileOrArray ऑब्जेक्ट में लेता है। अस्वीकरण: मैंने इसे स्वयं से नहीं देखा है।

iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(new iTextSharp.text.pdf.RandomAccessFileOrArray(@"C:\PDFFile.pdf"), null); 
+1

परीक्षणों में मैंने बस एक साधारण 40,000 पेज पीडीएफ पर भाग लिया, जब 'पीडीएफ रीडर (स्ट्रिंग)' कन्स्ट्रक्टर का इस्तेमाल किया गया तो इसमें 13.5 सेकेंड लगे जबकि 'पीडीएफ रीडर (रैंडमएक्सफाइलऑरएरे, बाइट [])' कन्स्ट्रक्टर ने केवल 2.2 सेकंड (6 बार तेजी से), इसलिए मुझे आपके सुझाव से सहमत होना है। –

+0

इसने समस्या हल की। अब मैं पीडीएफ को विभाजित करने में सक्षम हूं। धन्यवाद। – tomsv

3

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

इस विधि कि स्मृति में सब कुछ लोड करता है -

PdfReader reader; 
long before; 
before = getMemoryUse(); 
reader = new PdfReader(
"HelloWorldToRead.pdf", null); 
System.out.println("Memory used by the full read: " 
+ (getMemoryUse() - before)); 

यह स्मृति बचत रास्ता है, जहां दस्तावेज़ लोड किया जाना चाहिए बिट द्वारा - आवश्यकतानुसार -

before = getMemoryUse(); 
reader = new PdfReader(
new RandomAccessFileOrArray("HelloWorldToRead.pdf"), null); 
System.out.println("Memory used by the partial read: " 
+ (getMemoryUse() - before)); 
1

PDF Toolkit इन प्रकार के कार्यों के लिए काफी उपयोगी है। हालांकि अभी तक इतनी बड़ी फाइल के साथ कोशिश नहीं की है।

1

क्या यह किसी अन्य लाइब्रेरी का उपयोग itextsharp से बेहतर काम कर सकता है?

Aspose.Pdf for .NET जो आप split the PDF into single pages लिए अनुमति देता है: प्रयास करें या आप विभिन्न तरीकों से split the PDF to different sets of pages सकता है, या तो फाइल या स्मृति धाराओं का इस्तेमाल करके। एपीआई सीखना और उपयोग करना बहुत आसान है। यह बड़ी पीडीएफ फाइलों के साथ काम करता है जिसमें बड़ी संख्या में पेज होते हैं।

प्रकटीकरण: मैं Aspose पर डेवलपर प्रचारक के रूप में काम करता हूं।