簡體   English   中英

如何從 jasper 報告中的項目類路徑中添加圖像作為參數

[英]How to add image as parameter from projects classpath in jasper reports

我使用 ireport 設計器設計了一個 jasper 報告,其中我在報告的標題中添加了徽標圖像。 該圖像是從本地機器上的硬編碼路徑添加的。 我需要從我的項目類路徑中添加徽標圖像。 為此,我為程序提供的報告中的圖像創建了一個參數。

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>

我們總是傳入圖像而不是 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>

您可以輕松地從類路徑/類加載器中獲取 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 之前,它在只顯示一次圖像時工作正常。 當我需要重復圖像時,InputStream 不起作用,因為流在​​第一個顯示器上被消耗,因此之后無法使用。 我沒有找到一種簡單的方法來重置它。
  • 我發現可以從這里使用 URL: http : //jasperreports.sourceforge.net/sample.reference/images/index.html

我沒有設法讓它與任何這些方法一起工作,我遇到了錯誤:

 Error evaluating expression for source text

在java中編譯報告。

在 Java 中,您必須將圖像發送到輸入流,因此要么

byte[] image = imageRepository.getLogo();
InputStream logo= new ByteArrayInputStream(image);
parameters.put("logo",logo);

因為我從數據庫中將圖像作為 byteArray 獲取,但是如果您在 JAR 中的某個地方有它:

ResourceLoader resourceLoader;
InputStream logo= resourceLoader.getResource("classpath:/image/logo.jpg").getInputStream();
parameters.put("logo",logo);

然后在 jrxml 中它簡單地給出:

    <parameter name="logo" class="java.io.InputStream"/>

    <image scaleImage="RealSize">
        <imageExpression><![CDATA[$P{logo}]]></imageExpression>
    </image>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM