web-dev-qa-db-ja.com

jasperレポートのプロジェクトクラスパスからパラメータとして画像を追加する方法

レポートのタイトルにロゴ画像を追加したireportデザイナーを使用してジャスパーレポートをデザインしました。このイメージは、ローカルマシンのハードコードされたパスから追加されます。プロジェクトのクラスパスからロゴ画像を追加する必要があります。そのために、プログラムから提供されるレポートに画像のパラメーターを作成しました。

InputStream imgInputStream = this.getClass().getResourceAsStream("header.png");

HashMap<String, Object> parameters = new HashMap<String, Object>();
parameters.put("dateFrom", datum1);
parameters.put("dateTo", datum2);
parameters.put("logo", imgInputStream);


strQuery = "Select calldate,src,dst,duration,disposition,cdrcost from cdrcost where date(calldate) between '" + datum1 + "' and '" + datum2 + "'";

rs = conexiondb.Consulta(strQuery);
JRResultSetDataSource resultSetDataSource = new JRResultSetDataSource(rs);
//JasperPrint jasperPrint = JasperFillManager.fillReport(reportStream, parameters);

JasperRunManager.runReportToPdfStream(reportStream, fos, parameters, resultSetDataSource);

以下は、レポートの画像スニペットです。

<image>
  <reportElement x="0" y="1" width="555" height="61"/>
  <imageExpression><![CDATA[$P{logo}]]>
  </imageExpression>
</image>
8
Amit

InputStreamの代わりに常に画像を渡します。最初に画像をロードし、パラメータマップに設定します。

BufferedImage image = ImageIO.read(getClass().getResource("/images/IMAGE.png"));
parameters.put("logo", image );

次に、パラメータは次のように定義されます。

<parameter name="logo" class="Object" isForPrompting="false">
  <parameterDescription><![CDATA[The letterhead image]]></parameterDescription>
  <defaultValueExpression><![CDATA[]]></defaultValueExpression>
</parameter>

レポートに配置すると、次のようになります。

<image>
  <reportElement x="324" y="16" width="154" height="38"/>
  <imageExpression><![CDATA[$P{logo}]]></imageExpression>
</image>
30
Jacob Schoen

クラスパス/クラスローダーからURLを簡単に取得できます。これは<imageExpression>の有効な入力であるため、これを使用してPDFに画像を埋め込むことができます。以下は私のために働いた:

パラメータの設定:

URL url = this.getClass().getClassLoader().getResource("pdf/my_image.tif");
parameters.put("logo", url);

レポートでの宣言:

<parameter name="logo" class="Java.net.URL">
    <defaultValueExpression><![CDATA[]]></defaultValueExpression>
</parameter>

レポートでの使用法。

<image>
   <reportElement x="100" y="30" width="135" height="30"/>
   <imageExpression><![CDATA[$P{logo}]]></imageExpression>
</image>

いくつかの追加の観察

  • InputStreamを使用する前は、画像を1回だけ表示すると問題なく動作しました。画像を繰り返す必要がある場合、ストリームは最初のディスプレイで消費され、その後は使用できないため、InputStreamが機能しませんでした。リセットする簡単な方法が見つかりませんでした。
  • ここからURLを使用できることがわかりました: http://jasperreports.sourceforge.net/sample.reference/images/index.html
2
gus3001