2010-04-30 15 views
22

मैं एक जैस्पर रिपोर्ट पर एक छवि दिखाना चाहता हूं। मैं .jrxml पर निम्नलिखित हैं:जैस्पर रिपोर्ट पर एक छवि कैसे दिखाएं?

<image> 
    <reportElement x="181" y="0" width="209" height="74"/> 
    <imageExpression class="java.lang.String"><![CDATA["logo.jpg"]]></imageExpression> 
</image> 

छवि logo.jpg .jrxml रूप में एक ही निर्देशिका में है। बस यह कहकर कि यह मेरे लिए काम नहीं करता है। मैंने थोड़ी सी बात की और पता चला कि जैस्पर रिपोर्ट JJx निर्देशिका के सापेक्ष पथ के रूप में .jrxml पर रखी गई है और इसे बदलने के लिए मुझे एक फ़ाइल REesORT_FILE_RESOLVER "पैरामीटर के रूप में पास करने की आवश्यकता है जो फ़ाइल लौटाता है। तो, मैं अपने जावा में निम्नलिखित

FileResolver fileResolver = new FileResolver() { 

@Override 
public File resolveFile(String fileName) { 
    return new File(fileName); 
} 
}; 
HashMap<String, Object> parameters = new HashMap<String, Object>(); 

parameters.put("REPORT_FILE_RESOLVER", fileResolver); 
... 

कौन सा उम्मीद फ़ाइल लौटना चाहिए (.jrxml और छवि के रूप में एक ही स्थान पर स्थित है), लेकिन मैं अभी भी एक

net.sf.jasperreports.engine.JRException: Error loading byte data : logo.jpg 
    at net.sf.jasperreports.engine.util.JRLoader.loadBytes(JRLoader.java:301) 
    at net.sf.jasperreports.engine.util.JRLoader.loadBytesFromLocation(JRLoader.java:479) 
    at net.sf.jasperreports.engine.JRImageRenderer.getInstance(JRImageRenderer.java:180) 
... 

प्राप्त किया मैं क्या गलत कर रहा हूं?

धन्यवाद!

+0

देखें: http://stackoverflow.com/a/39320863/59087 –

उत्तर

11

यहाँ समस्या थी:

जैसा कि मैंने पहले कहा मैं एक ही निर्देशिका में है। jrxml, logo.jpg और .java जो .jrxml का उपयोग करता है।

बात यह है कि fileResolver

FileResolver fileResolver = new FileResolver() { 

@Override 
public File resolveFile(String fileName) { 
    return new File(fileName); 
} 
}; 

छवि फ़ाइल लौटे नहीं किया है। मैंने पाया कि यह एक अलग निर्देशिका पर मैप किया गया है, न कि जिसकी मैं अपेक्षा कर रहा था। तो, मैं इसे करने के लिए बदल:

FileResolver fileResolver = new FileResolver() { 

    @Override 
    public File resolveFile(String fileName) { 
     URI uri; 
     try { 
      uri = new URI(this.getClass().getResource(fileName).getPath()); 
      return new File(uri.getPath()); 
     } catch (URISyntaxException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      return null; 
     } 
    } 
}; 

और वह बाहर काम किया।

एक रिश्तेदार पथ नाम, इसके विपरीत, कुछ अन्य पथ नाम से लिया जानकारी के संदर्भ में व्याख्या की जानी चाहिए: मैं तथ्य यह है कि भूल गया। डिफ़ॉल्ट रूप से में कक्षाएं java.io पैकेज हमेशा वर्तमान उपयोगकर्ता निर्देशिका के विरुद्ध सापेक्ष पथनाम हल करती हैं। यह निर्देशिका है सिस्टम सिस्टम user.dir, द्वारा नामित और आमतौर पर में निर्देशिका है जो जावा वर्चुअल मशीन लागू की गई थी।

(जावा एपीआई से लिया - File (Java Platform SE 6))

निर्देशिका जिसमें JVM शुरू हो जाती है एक मैं यह सब डेटा नहीं है।

धन्यवाद!

19

मैं एक पैरामीटर फाइल के निरपेक्ष स्थान को निर्दिष्ट पास करके यह काम कर दिया है:

<imageExpression class="java.lang.String"> 
     <![CDATA[$P{REPORTS_DIR} + "/images/logo.jpg"]]> 
</imageExpression> 
8

अपने रिपोर्ट पेज में MyPmg प्रकार इनपुट इनपुट के रूप में एक param को घोषित करने का प्रयास करें। पृष्ठ पर परम और छवि प्लेसहोल्डर दोनों के लिए इस प्रकार की घोषणा करें। फिर, कुछ प्रकार का उपयोग करके क्लासपाथ से छवि को पकड़ें (माना जाता है कि छवि का नाम 'imgName.ext' है और यह 'आपका नाम' पैकेज में है।पैकेज ')

InputStream imgInputStream = this.getClass().getResourceAsStream("/your/package/imgName.ext"); parameters.put("myImg", imgInputStream);

17

मैं इसे इस तरह से करते हैं - छवि पथ से पारित कर दिया है:

HashMap<String, Object> params = new HashMap<String, Object>(); 
params.put("logo", ClassLoader.getSystemResource("logo.jpg").getPath()); 

.jrxml

<parameter name="logo" class="java.lang.String"/> 
... 
<image> 
    <reportElement x="0" y="1" width="100" height="37"/> 
    <imageExpression><![CDATA[$P{logo}]]></imageExpression> 
</image> 

... या छवि InputStream के रूप में पारित हो जाता है (मुझे नहीं पता क्यों, लेकिन <image>onErrorType विशेषता "Blank" पर सेट करने की आवश्यकता है, अन्यथा यह काम नहीं करता है - अपवाद फेंकता है):

HashMap<String, Object> params = new HashMap<String, Object>(); 
params.put("logo", ClassLoader.getSystemResourceAsStream("logo.jpg")); 

.jrxml

<parameter name="logo" class="java.io.InputStream"/> 
... 
<image onErrorType="Blank"> 
    <reportElement x="0" y="1" width="100" height="37"/> 
    <imageExpression><![CDATA[$P{logo}]]></imageExpression> 
</image> 
संबंधित मुद्दे