2012-02-22 28 views
6

में दिखाई देने के लिए पीडीएफ सामग्री (स्प्रिंग एमवीसी नियंत्रक विधि से परोसा गया) कैसे प्राप्त करें मैं स्प्रिंग एमवीसी के साथ एक नौसिखिया हूं लेकिन क्षमताओं से काफी प्रभावित हूं।एक नई विंडो

मैं 3.1.0-रिलीज का उपयोग कर रहा हूं और मुझे फॉर्म के जवाब में पीडीएफ दिखाने की ज़रूरत है: फॉर्म सबमिशन।

@RequestMapping(value = "new_product", method = RequestMethod.POST, params = "print") 
@ResponseBody 
public void saveAndShowPDF(ModelMap map, ShippingRequestInfo requestInfo, HttpServletRequest request, HttpServletResponse httpServletResponse) throws IOException { 
    saveProductChanges(map, requestInfo, request, httpServletResponse); 
    httpServletResponse.setContentType("application/pdf"); 
    byte[] pdfImage = productService.getPDFImage(requestInfo.getRequestId()); 
    httpServletResponse.getOutputStream().write(pdfImage); 
} 

इस कोड को पीडीएफ बाइट [] वापस मूल विंडो के भेजता है:

यहाँ (छोटे) कोड मैं नियंत्रक में लिखा है।

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

संपादित मैं सामग्री-विन्यास सेट करने के लिए ऐसी है कि ब्राउज़र एक को बचाने/खुला जहां उपयोगकर्ता (मुख्य ब्राउज़र पेज खोने के साथ) एडोब खोल सकते हैं बॉक्स

httpServletResponse.setHeader("Content-Disposition","attachment;filename=cool.pdf"); 

सभी को धन्यवाद लाता है का फैसला किया !

उत्तर

5

टैग में target="_blank" निर्दिष्ट करें जो आपके फॉर्म को सबमिट करता है।

+0

लक्ष्य = "_ खाली" (उम्मीद है) पीडीएफ को एक अलग विंडो में दिखाएगा। अगर मैं नियंत्रक विधि को एक स्ट्रिंग लौटाता हूं तो क्या मेरे पास मूल विंडो एक नया पृष्ठ प्रस्तुत कर सकती है (पीडीएफ के साथ एक नई विंडो में)? –

+1

डर्न ... मैं लक्ष्य = "__ खाली" का उपयोग नहीं कर सकता क्योंकि फ़ॉर्म में एकाधिक प्रकार = "सबमिट" बटन हैं और मुझे केवल इस बटन को एक अलग विंडो में इसकी प्रतिक्रिया (पीडीएफ) की आवश्यकता है। मैंने एक सेव/ओपन बॉक्स लाने के लिए सामग्री-डिस्पोजिशन सेट करने का निर्णय लिया जहां उपयोगकर्ता एडोब खोल सकता है (मुख्य ब्राउजर पेज खोने के साथ) httpServletResponse.setHeader ("सामग्री-डिस्पोजिशन", "अटैचमेंट; filename = product.pdf "); –

0

आप क्या करना होगा कि ग्राहक पक्ष पर कुछ जावास्क्रिप्ट जैसे के साथ ,:

<a href="http://www.myWebApp.com/somePdf.pdf" onclick="window.open('http://www.myWebApp.com/somePdf.pdf'); return false;" target="_blank">My Super Awesome Docment</a> 

(सुंदर jQuery सत्ता के रूप में वांछित के साथ विकल्प) आप मुख्य विंडो में होने की कुछ और चाहते हैं, बस नहीं है ऑनक्लिक घटना से झूठी वापसी करें, और नियमित विंडो पर क्लिक करें जो आप मुख्य विंडो में करना चाहते हैं

यदि ब्राउज़र ब्राउज़र या एडोब में पीडीएफ खुलता है तो यह आपके ऊपर नहीं है, यह कॉन्फ़िगरेशन पर है उपयोगकर्ता का कंप्यूटर

-

इसके अलावा, सिर्फ एक void विधि पर एक वसंत बात, @ResponseBody रूप में किसी भी मतलब नहीं है। @ResponseBody वसंत को प्रतिक्रिया के रूप में विधि के रिटर्न प्रकार का उपयोग करने के लिए कह रहा है। यही है, आप विधि से byte[] वापस कर देंगे और स्प्रिंग सौदे को सर्वलेट प्रतिक्रिया में बदलने के साथ दे देंगे। विधि

+0

यदि आप मुख्य विंडो में कुछ और करना चाहते हैं तो ऑनक्लिक ईवेंट से झूठी वापसी न करें, और नियमित रूप से क्लिक करें जो भी आप मुख्य विंडो में करना चाहते हैं। – Affe

1

के अंदर सीधे प्रतिक्रिया लिखने के बजाय प्रतिक्रिया के प्रकार को परिभाषित करने के लिए @RequestMapping उत्पादन का उपयोग करें।

@RequestMapping(value = doc/{docId}, method = RequestMethod.GET, produces = "application/pdf") 
@ResponseBody 
public byte[] getDocument(@PathVariable("docId") String docId) throws Exception 
{ 
    return service.getDocument(docId); 
} 
संबंधित मुद्दे