我有一个带有glassfish 3.1 + JSF的EJB站点,用于jasperreport 4.0.1。该网站在流式传输pdf时没有问题,但是当使用runReportToPdfStream打印PDF时,它产品为空白PDF,下面是代码片段:
EJB
public class BookEJB {
public void printReport() throws ClassNotFoundException, IOException, JRException {
Map parameterMap = new HashMap();
FacesContext ctx = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) ctx.getExternalContext().getResponse();
InputStream reportStream = ctx.getExternalContext().getResourceAsStream("/reports/test.jasper");
ServletOutputStream servletOutputStream = response.getOutputStream();
servletOutputStream.flush();
response.setContentType("application/pdf");
JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, parameterMap);
servletOutputStream.flush();
servletOutputStream.close();
ctx.responseComplete();
}}
test.jrxml - 没有SQL连接的简单报告
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="test" pageWidth="800" pageHeight="1200" columnWidth="555" leftMargin="25" rightMargin="25" topMargin="30" bottomMargin="30">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<queryString>
<![CDATA[]]>
</queryString>
<pageHeader>
<band height="100">
<staticText>
<reportElement x="0" y="0" width="285" height="36"/>
<textElement>
<font size="24" isBold="true"/>
</textElement>
<text><![CDATA[Report of Testing]]></text>
</staticText>
</band>
</pageHeader>
<detail>
<band height="200">
<staticText>
<reportElement x="0" y="0" width="374" height="48"/>
<textElement>
<font size="18"/>
</textElement>
<text><![CDATA[If you don't see this, it didn't work blah blah blah.... ]]></text>
</staticText>
</band>
</detail>
<pageFooter>
<band height="100"/>
</pageFooter>
</jasperReport>
在JSF上生成此报告时没有错误记录glassfish,但只显示了空白PDF。请帮忙,如果您需要进一步的分析信息,请告诉我。
史蒂芬
答案 0 :(得分:38)
毕竟,JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, parameterMap, new JREmptyDataSource());
解决了这个问题。
来自Jasperreport的Sanda引用:
默认情况下,如果报表中没有数据源信息,则JR不会生成任何页面。另一个选项(可以在报告的
whenNoDataType
属性中设置)将打印所有报告部分,<detail>
除外。此报告包含详细信息部分,但仅包含一些静态数据。为确保此部分也将被打印,最简单的方法是提供一个包含单个空记录的空数据源。
答案 1 :(得分:0)
除了Mythox所说的以外,我还将展示在jasper中以及如果需要在JasperServer上伪造数据源的最佳方法。
1)定义一个空数据适配器(一个简单的.xml文件),并将其部署在Server中或将其放置在reports文件夹中:
<?xml version="1.0" encoding="UTF-8" ?><emptyDataAdapter class="net.sf.jasperreports.data.empty.EmptyDataAdapterImpl"><name>Nuovo Data Adapter 1</name><recordCount>1</recordCount></emptyDataAdapter>
2)将其链接到主报告中:
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="repor" language="javascript" pageWidth="612" pageHeight="792" whenNoDataType="NoDataSection" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" isFloatColumnFooter="true" uuid="c0eee90e-1b1a-4f34-ad99-1112847752de">
<property name="net.sf.jasperreports.data.adapter" value="EmptyDataAdapter.xml"/>
如果xml部署在jasper服务器上,则将前缀“ repo:”设置为数据适配器的属性值。
属性“ whenNoDataType”将被忽略。
其他详细信息here。
答案 2 :(得分:0)
当您不使用详细信息栏(仅静态值)时,可以执行以下操作:
右键单击iReport项目,然后选择“属性”,搜索属性“当没有数据时”,然后选择“所有节,没有详细信息”
使用iReport 4.0对我有用