15

我使用 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>
4

3 回答 3

41

我们总是传入图像而不是 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>
于 2012-11-29T14:38:24.950 回答
4

您可以轻松地从类路径/类加载器中获取 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
于 2016-07-08T13:01:02.070 回答
2

我没有设法让它与任何这些方法一起工作,我遇到了错误:

 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>
于 2020-09-03T06:04:44.667 回答