2015-11-26 10 views
6

पर सहेजे जाने पर Android PdfDocument क्षतिग्रस्त हो गया है। मैं Androids देशी PdfDocument क्लास (एपीआई 1 9 से) का उपयोग करके एक साधारण पीडीएफ दस्तावेज़ बनाने की कोशिश कर रहा हूं। मैं चाहता हूं कि एक XML लेआउट फ़ाइल हो, उदाहरण के लिए pdf_doc.xml कहा जाता है, और फिर पीडीएफ बनाते समय इसे फुलाएं। pdf_doc.xml के अंदर मैं कोड में लाया गया दृश्यों का एक समूह होगा, और उसके बाद पीडीएफ दस्तावेज़ पृष्ठों पर अलग-अलग खींचा जाएगा। समस्या यह है कि यह एक क्षतिग्रस्त पीडीएफ फाइल बनाता है।बाहरी स्टोरेज

दूसरी ओर, अगर मैं सिर्फ अपनी main_activity.xml (गतिविधि मैं जब पीडीएफ बनाने का उपयोग कर रहा से xml) में एक साधारण TextView, बना सकते हैं और बजाय कि TextView उपयोग करें, यह ठीक काम करता है।

टेक्स्टव्यू एक फुलाए गए लेआउट या गतिविधि के लेआउट से आता है या नहीं, इससे कोई फर्क क्यों पड़ता है? क्या मैं इसे गलत तरीके से करने की कोशिश कर रहा हूं?

एफवाईआई: यह टेक्स्टव्यू प्रोग्रामेटिक रूप से बनाते समय भी विफल रहता है।

नीचे मेरा स्रोत कोड है। इन दोनों कार्यों को एक दूसरे के बाद सही कहा जाता है। पहला पीडीएफ बनाता है, दूसरा इसे बचाता है। समस्या दृश्य में है, जिसे सामग्री कहा जाता है, जो मुझे फुलाए गए लेआउट से प्राप्त हो रहा है। यदि मैं इसके बजाय गतिविधि के एक्सएमएल में उस टेक्स्ट व्यू को डालता हूं और फिर इसे गतिविधि से प्राप्त करता हूं, जैसे act.findViewById(R.id.pdf_text); तो यह इच्छित के रूप में कार्य करता है।

कोड:

public static PdfDocument createPdf(Activity act){ 
     PrintAttributes printAttrs = new PrintAttributes.Builder(). 
       setColorMode(PrintAttributes.COLOR_MODE_COLOR). 
       setMediaSize(PrintAttributes.MediaSize.ISO_A4). 
       setMinMargins(PrintAttributes.Margins.NO_MARGINS). 
       build(); 

     ViewGroup mainLayout = (ViewGroup) View.inflate(act, R.layout.pdf_doc, null); 

     int pageHeight = printAttrs.getMediaSize().getHeightMils()/1000 * 72; 
     int pageWidth = printAttrs.getMediaSize().getWidthMils()/1000 * 72; 

     PdfDocument document = new PrintedPdfDocument(act, printAttrs); 
     PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(pageWidth, pageHeight, 1).create(); 
     PdfDocument.Page page = document.startPage(pageInfo); 

     View content = mainLayout.findViewById(R.id.pdf_text); 
     content.draw(page.getCanvas()); 
     document.finishPage(page); 

     return document; 
    } 

    public static void saveFile(PdfDocument doc){ 
     String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString(); 
     File myDir = new File(root + "/pdf_test"); 
     myDir.mkdirs(); 

     File file = new File(myDir, "test.pdf"); 

     if (file.exists()) { 
      file.delete(); 
     } 

     try { 
      FileOutputStream out = new FileOutputStream(file); 
      doc.writeTo(out); 
      doc.close(); 
      out.flush(); 
      out.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     String path = file.getAbsolutePath(); 
     Log.d("pdftest", "path: " + path); 
    } 
+0

@ FrankN.Stein शायद मैं पर्याप्त स्पष्ट नहीं था, लेकिन मैं पूरे लेआउट को एक बार में खींचने की कोशिश नहीं कर रहा हूं। मैं बस लेआउट से टेक्स्ट व्यू ले रहा हूं और इसे आकर्षित करने की कोशिश कर रहा हूं। मैं ऐसा करने में अंतर नहीं देख सकता, इसे लेआउट से ले जाने की तुलना में गतिविधि का उपयोग कर रहा है ... –

+0

बिलकुल नहीं। जैसा कि मैंने कहा, अगर मैं गतिविधि के एक्सएमएल से टेक्स्टव्यू लेता हूं, तो मैं इसे पीडीएफ डॉक्यूमेंट पेज कैनवास पर खींच सकता हूं, लेकिन मैं प्रोग्रामेटिक रूप से फुलाए गए लेआउट से टेक्स्ट व्यू के साथ ऐसा नहीं कर सकता? –

उत्तर

1

दो सुझाव:

  1. के बाद से अपने mainLayout शून्य ऊंचाई शून्य चौड़ाई (आप इसे एक माता पिता में फुलाया नहीं किया है), यह पता बिछाने मैन्युअल की कोशिश करनी होगी , उस क्रम में measure() और layout() पर कॉल करके। आपको पिक्सेल में एक आकार निर्दिष्ट करने की आवश्यकता होगी जिसे आप लेआउट का आकार बदलना चाहते हैं।

  2. out.getFd().sync()out.flush() के बाद और out.close() से पहले कॉल करें। मुझे संदेह है कि यह आपकी विशिष्ट समस्या का कारण बन रहा है, लेकिन यह एक अच्छा विचार है और चोट पहुंचाने की संभावना नहीं है।

+0

दो रचनात्मक सुझावों के लिए धन्यवाद। मैं कल सुबह कोशिश करूँगा! –

+0

पैरामीटर मापने के लिए क्या होगा() यदि मैं लेआउट चाहता था कि जितना संभव हो उतना स्थान भरें? ज्यादा से ज्यादा? –

+0

@ थॉमस टिलमन: मुझे मारता है। मैंने कोशिश नहीं की है। मुझे यकीन नहीं है कि "जितना संभव हो उतना स्थान" है, क्योंकि कोई अभिभावक नहीं है। चूंकि आईआईआरसी आपको पिक्सल में पेपर आकार प्रदान करना है, शायद इसके लिए पिक्सल (या शायद थोड़ा कम) का उपयोग करें। – CommonsWare

संबंधित मुद्दे