2010-11-18 11 views
9

यह मेरा पहला सवाल है, मुझे उम्मीद है कि मैं इसे सही कर रहा हूं। अग्रिम में मेरी खराब अंग्रेजी के लिए खेद है :)एफओपी: छवि स्रोत सापेक्ष पथ निर्दिष्ट करने के लिए कैसे?

मैं जेएसएफ 2.0 (ग्रहण आईडीई) का उपयोग कर रहा हूं और मैं अपाचे एफओपी 1.0 का उपयोग करके कुछ पीडीएफ फाइलें उत्पन्न करने की कोशिश कर रहा हूं।

मैं Apache Fop site पर निर्देशों का उपयोग करके सरल पीडीएफ फाइलें बनाने में सक्षम था, लेकिन मैं अपने एप्लिकेशन फ़ोल्डर से कोई भी छवि सम्मिलित नहीं कर सकता। मेरे फ़ोल्डर संरचना की तरह यह है: अपने आवेदन WebContent में मैं (किसी और के अलावा) pdf_transform/XSLT/transformFile.xsl है, और pdf_transform/XSLT/logo.jpg

transformFile.xsl में मैं

<fo:block><fo:external-graphic src="url('logo.jpg')"/></fo:block> 
है

लेकिन जब मैं clik मेरे सर्वलेट में 'showPDF' बटन, मैं पीडीएफ फाइल छवि के बिना प्राप्त (सब कुछ नहीं है), और कंसोल में इस संदेश:

गंभीर: स्रोत कि fr वापस आ गया था ओएम यूआरआई रिज़ॉल्यूशन में यूआरआई के लिए इनपुटस्ट्रीम नहीं था: logo.jpg नवंबर 18, 2010 5:16:49 अपराह्न org.apache.fop.events.LoggingEventListener प्रक्रिया सेव करें: छवि नहीं मिली। यूआरआई: logo.jpg। (कोई संदर्भ जानकारी उपलब्ध)

मैं 'logo.jpg' के बजाय यूआरएल ('logo.jpg') का उपयोग करने की कोशिश की, WebContent फ़ोल्डर के अंदर विभिन्न स्थानों पर छवि डालने और ("./ लोगो अलग नेविगेशन का उपयोग .jpg ") लेकिन यह काम नहीं किया।

यदि मैं पूर्ण पथ सेट करता हूं (उदाहरण के लिए "डी:/fop/images/logo.jpg") लेकिन यह मेरे आवेदन को सफ़ेद करने की आवश्यकता है, तो यह ठीक काम करता है।

खोज करते समय, मैंने पाया कि यह fopFactory.setURIResolver() और/या userAgent.setBaseURL() से संबंधित है। इसके साथ कुछ कोशिश की, लेकिन सफल नहीं हुआ।

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

संपादित करें: मैं नहीं चाहता कि किसी भी पूर्ण पथ और ऐप को कंप्यूटर पर अपने स्थान से स्वतंत्र रूप से काम करना चाहिए (प्रकाशित करने योग्य)। मेरी खोज मुझे बताती है कि एफओपी को कॉन्फ़िगर करने के साथ इसका कुछ संबंध है, लेकिन मुझे नहीं पता कि यह कैसे करें :)

अग्रिम धन्यवाद।

पीएस

public void printExchangeRateList(ActionEvent event) { 

    BufferedOutputStream output = null; 

    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    ExternalContext externalContext = facesContext.getExternalContext(); 
    HttpServletResponse response = (HttpServletResponse) externalContext.getResponse(); 

    String path = externalContext.getRealPath("/"); 


    try { 

     response.reset(); 
     response.setHeader("Content-Type", "application/pdf"); 
     output = new BufferedOutputStream(response.getOutputStream(), 10240); 

     File xsltfile = new File(path+"/pdf_transform/xslt/transformFile.xsl"); 

     FopFactory fopFactory = FopFactory.newInstance(); 
     FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); 

     try { 
      Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, output); 

      TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
      Transformer transformer = transformerFactory.newTransformer(new StreamSource(xsltfile)); 

      Source src = new DOMSource(makeXML()); // my method 
      Result res = new SAXResult(fop.getDefaultHandler()); 

      transformer.transform(src, res); 


     } finally { 
      if (output != null) output.close(); 
      /*try { 
       out.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }*/ 
     } 

    } catch (Exception e) { 
     // TODO Auto-generated catch block 
    } 

    facesContext.responseComplete(); 
} 

उत्तर

2

आप उपयोग कर सकते हैं आप चित्रों के लिए वेब यूआरएल तक पहुँच है कि रूप में अच्छी तरह जब रिपोर्ट जनरेट, यानी http://localhost/images/logo.jpg: यह विधि जो पीडीएफ प्रदर्शित करने के लिए कहा जाता है।

लेकिन जब मैं अभी भी वेब सर्वर पर स्थानीय स्तर पर चित्र थे, मैं XML फ़ाइल में आवेदन करने के लिए पथ शामिल है और इस तरह इसका इस्तेमाल किया:

<xsl:variable name="base_path" select="base-path"/> 
<xsl:variable name="logo" select="companies/company/logo"/> 
<fo:external-graphic src="url({$base_path}{logo})"/> 

XML संरचना कहाँ कुछ इस तरह हो सकता है:

<?xml version="1.0" encoding="UTF-8"?> 
<base-path>/path/to/app/</base-path> 
<companies> 
    <company> 
    <logo>images/company1.jpg</logo> 
    </company> 
    <company> 
    <logo>images/company2.jpg</logo> 
    </company> 
</companies> 
+0

आपके उत्तर के लिए धन्यवाद। लेकिन वह नहीं है जो मैं ढूंढ रहा हूं। जब आप xml बनाते हैं, "/ path/to/app /" स्ट्रिंग को "C: \ Eclipse \ workspace \ myProject \ .. आदि" जैसा दिखना चाहिए (यदि मुझे यह सही हो रहा है)। मैं इस एप्लिकेशन को प्रकाशित करने योग्य बनाने के लिए बना रहा हूं और सभी एक्सएमएल डेटा और छवियों को एक्सेस करने के लिए व्हाईटिन एप्लिकेशन स्कोप का संदर्भ दिया जाना चाहिए (क्षमा करें, मेरे प्रश्न में स्पष्ट रूप से लिखा नहीं है, मैं इसे अभी संपादित कर दूंगा)। – Nikola

10

मुझे मेरी समस्या का समाधान मिला। मैंने सोचा कि मैंने कोशिश की है, लेकिन ऐसा लगता है कि मैंने फिर कुछ गलती की है। वैसे भी, निम्न कोड के साथ

FacesContext facesContext = FacesContext.getCurrentInstance(); 
ExternalContext externalContext = facesContext.getExternalContext(); 
String basePath = externalContext.getRealPath("/"); 

FopFactory fopFactory = FopFactory.newInstance(); 
fopFactory.setBaseURL(basePath); 
FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); 
foUserAgent.setBaseURL(fopFactory.getBaseURL()); 

Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, output); // for some output 

आप अपने xslt रिश्तेदार पथ अपने आवेदन की WebContent फ़ोल्डर से शुरू का उपयोग कर फ़ाइल से अपने छवियों (और अन्य संसाधनों) पहुँच सकते हैं। मेरे मामले में, मैं इस

<fo:external-graphic src="url('pdf_transform/xslt/logo.jpg')"/> 

तरह logo.jpg उपयोग कर सकते हैं मुझे समय लिया इस यह पता लगाने की, मैं इसे नहीं मिलता क्यों नेट पर इस तरह के बुनियादी बात के साथ कोई उदाहरण (या मैं नहीं मिल सकता है उन्हें :)

0

मैं एक ही समस्या थी और इस समाधान की कोशिश की:

FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); 
    Request request = RequestCycle.get().getRequest(); 
    //sort of a hack to find the path to the files that are in /img folder. 
    String baseUrl = request.getUrl().getProtocol()+"://"+request.getUrl().getHost()+":"+request.getUrl().getPort(); 
    foUserAgent.setBaseURL(baseUrl); 

फिर, XSL पर मैं प्रयोग किया है:

<fo:external-graphic src="/img/image.png" /> 

टी करने के लिए अगर यह काम कर रहा है, तो आपको प्रोटोकॉल पर छवि देखने में सक्षम होना चाहिए: // link: port/img/image.png

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