web-dev-qa-db-ja.com

ジャスパーレポートに画像を表示する方法

ジャスパーレポートに画像を表示したい。 .jrxmlには次のものがあります。

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

画像logo.jpgは、.jrxmlと同じディレクトリにあります。それを置くだけではうまくいきませんでした。少しグーグルで調べたところ、ジャスパーレポートは.jrxmlに置いたものをJVMディレクトリへの相対パスと見なし、これを変更するには、ファイルを返すFileResolverを「REPORT_FILE_RESOLVER」パラメーターとして渡す必要があることがわかりました。だから、私は私の.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)
...

何が間違っていますか?

ありがとう!

29
user297339

ここに問題がありました:

前に言ったように、同じディレクトリに.jrxml、logo.jpg、および.jrxmlを使用する.Javaがあります。

問題は、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によって名前が付けられ、通常はJava仮想マシンが呼び出されたディレクトリです。

(Java api- File(Java Platform SE 6) )から取得)

JVMが呼び出されるディレクトリは、このすべてのデータを持っているディレクトリではありません。

ありがとう!

13
user297339

ファイルの絶対的な場所を指定するパラメーターを渡すことで、この作業を行いました。

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

私はこのようにします-画像はパスで渡されます:

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>
21
marioosh

レポートページでタイプdeclaringのmyImgなどのInputStreamパラメーターを試してください。ページのparamおよびimageプレースホルダーの両方でこのタイプを宣言します。次に、次のようなものを使用してクラスパスからイメージを取得します(イメージ名が「imgName.ext」であり、「your.package」という名前のパッケージにあると仮定します)

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