ジャスパーレポートに画像を表示したい。 .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)
...
何が間違っていますか?
ありがとう!
ここに問題がありました:
前に言ったように、同じディレクトリに.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が呼び出されるディレクトリは、このすべてのデータを持っているディレクトリではありません。
ありがとう!
ファイルの絶対的な場所を指定するパラメーターを渡すことで、この作業を行いました。
<imageExpression class="Java.lang.String">
<![CDATA[$P{REPORTS_DIR} + "/images/logo.jpg"]]>
</imageExpression>
私はこのようにします-画像はパスで渡されます:
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>
レポートページでタイプdeclaring
のmyImgなどのInputStream
パラメーターを試してください。ページのparamおよびimageプレースホルダーの両方でこのタイプを宣言します。次に、次のようなものを使用してクラスパスからイメージを取得します(イメージ名が「imgName.ext」であり、「your.package」という名前のパッケージにあると仮定します)
InputStream imgInputStream =
this.getClass().getResourceAsStream("/your/package/imgName.ext");
parameters.put("myImg", imgInputStream);