jasper-reportsexport-to-pdf

Jasper Reports - How to dynamically set PDF properties in .jrxml


Upon generating a PDF, I can specify the document's Title property in Java, like this...

jasperPrint.setProperty("net.sf.jasperreports.export.pdf.metadata.title", "Report ID "+REPORT_ID);

Question: How do I do the same thing in the .jrxml file instead, getting the ID from a value of a field in the data?

What I've tried:

Placing a <propertyExpression> with the other <property> tags sort-of works, but gives "Report ID null" (because it comes before the field declarations? Is that how jrxml works?):

<propertyExpression name="net.sf.jasperreports.export.pdf.metadata.title"><![CDATA["Report ID " + $F{REPORT_ID}]]></propertyExpression>

= "Report ID null"

When I move the <propertyExpression> tag beneath my field declarations, it throws an error that <propertyExpression> is not a valid tag (even though it's still a child of the root element):

<field name="REPORT_ID" class="java.lang.String"/>
...
<propertyExpression name="net.sf.jasperreports.export.pdf.metadata.title"><![CDATA["Report ID " + $F{REPORT_ID}]]></propertyExpression>

Error Reference :- 1716423819763 - : javax.ejb.EJBException: net.sf.jasperreports.engine.JRException: org.xml.sax.SAXParseException; lineNumber: 232; columnNumber: 76; cvc-complex-type.2.4.a: Invalid content was found starting with element 'propertyExpression'. One of '{"http://jasperreports.sourceforge.net/jasperreports":variable, "http://jasperreports.sourceforge.net/jasperreports":filterExpression, "http://jasperreports.sourceforge.net/jasperreports":group, "http://jasperreports.sourceforge.net/jasperreports":background, "http://jasperreports.sourceforge.net/jasperreports":title, "http://jasperreports.sourceforge.net/jasperreports":pageHeader, "http://jasperreports.sourceforge.net/jasperreports":columnHeader, "http://jasperreports.sourceforge.net/jasperreports":detail, "http://jasperreports.sourceforge.net/jasperreports":columnFooter, "http://jasperreports.sourceforge.net/jasperreports":pageFooter, "http://jasperreports.sourceforge.net/jasperreports":lastPageFooter, "http://jasperreports.sourceforge.net/jasperreports":summary, "http://jasperreports.sourceforge.net/jasperreports":noData}' is expected.


Solution

  • Set evaluationType="Report" for the property expression:

    <propertyExpression name="net.sf.jasperreports.export.pdf.metadata.title" evaluationType="Report"><![CDATA["Report ID " + $F{REPORT_ID}]]></propertyExpression>
    

    The property will be evaluated when the report ends and will use the last value of the REPORT_ID field.