Как показать изображение в отчете о яшме? - PullRequest
28 голосов
/ 30 апреля 2010

Я хочу показать изображение в отчете о яшме. У меня есть следующее на .jrxml:

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

Изображение logo.jpg находится в том же каталоге, что и .jrxml. Просто говоря, что это не сработало для меня. Я немного погуглил и обнаружил, что отчет jasper рассматривает то, что я положил в .jrxml, как относительный путь к каталогу JVM, и что для его изменения мне нужно передать в качестве параметра «REPORT_FILE_RESOLVER» FileResolver, который возвращает файл. Итак, я сделал следующее в моем .java (находится там же, где и .jrxml и изображение)

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);
...

Который должен вернуть ожидаемый файл, но я все равно получаю

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)
...

Что я делаю не так?

Спасибо!

Ответы [ 4 ]

22 голосов
/ 30 апреля 2010

Я сделал эту работу, передав параметр, указывающий абсолютное местоположение файла:

<imageExpression class="java.lang.String">
      <![CDATA[$P{REPORTS_DIR} + "/images/logo.jpg"]]>
</imageExpression>
21 голосов
/ 13 мая 2012

Я делаю это так - изображение передается путем:

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>
13 голосов
/ 03 мая 2010

Здесь была проблема:

Как я уже говорил ранее, у меня есть в том же каталоге .jrxml, logo.jpg и .java, которые используют .jrxml.

Дело в том, что файл Resolver

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, и, как правило, каталог в которой была виртуальная машина Java прибег.

(взято из Java API - Файл (Java Platform SE 6) )

Каталог, в котором вызывается JVM, не тот, в котором у меня есть все эти данные.

Спасибо!

9 голосов
/ 21 октября 2011

Попробуйте declaring параметр, такой как myImg типа InputStream на странице отчета. Объявите этот тип как для параметра, так и для заполнителя изображения на странице. Затем возьмите изображение из classpath, используя что-то вроде (при условии, что имя изображения - imgName.ext, и оно находится в пакете с именем your.package)

InputStream imgInputStream = 
    this.getClass().getResourceAsStream("/your/package/imgName.ext");
parameters.put("myImg", imgInputStream);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...