DEV Community

Biruk Abreham
Biruk Abreham

Posted on

Jasper Report Gist

  • Compile the Java code
javac -Xlint:unchecked -cp "lib/*" JasperReportCli.java
Enter fullscreen mode Exit fullscreen mode
  • Run the Java code
java -cp .:lib/* JasperReportCli input.json output.pdf template.jrxml
Enter fullscreen mode Exit fullscreen mode

Code version 1

import java.io.*;
import java.util.*;
import java.nio.file.*;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.*;

public class JasperReportCli {

    public static void main(String[] args) {
        if (args.length < 3) {
            System.out.println("Usage: java -cp .:lib/* JasperReportCli input.json output.pdf template.jrxml");
            System.exit(1);
        }

        String jsonFilePath = args[0];
        String pdfFilePath = args[1];
        String templateFilePath = args[2];

        generateReport(jsonFilePath, pdfFilePath, templateFilePath);
    }

    public static void generateReport(String jsonFilePath, String pdfFilePath, String templateFilePath) {
        try {
            // Read the JSON file from the file system
            InputStream inputStream = new FileInputStream(jsonFilePath);
            Reader reader = new InputStreamReader(inputStream);

            // Convert JSON data to Map
            Map<String, Object> jsonData = new Gson().fromJson(reader, new TypeToken<Map<String, Object>>() {}.getType());
            // System.out.println("jsonData: " + jsonData);

            // Access relevant data from the Map
            String logo = (String) jsonData.get("logo");
            String reportTitle = (String) jsonData.get("report_title");
            String reportSubtitle = (String) jsonData.get("report_subtitle");
            String dateGenerated = (String) jsonData.get("date_generated");
            String companyName = (String) jsonData.get("company_name");
            Map<String, Object> content = (Map<String, Object>) jsonData.get("content");
            List<String> header = (List<String>) content.get("header");
            List<Map<String, String>> reportContent = (List<Map<String, String>>) content.get("report_content");

            // Create parameters for the report
            Map<String, Object> parameters = new HashMap<>();
            parameters.put("logo", logo);
            parameters.put("report_title", reportTitle);
            parameters.put("report_subtitle", reportSubtitle);
            parameters.put("date_generated", dateGenerated);
            parameters.put("company_name", companyName);
            parameters.put("header", header);
            parameters.put("report_content", reportContent);

            // System.out.println("parameters: " + parameters);

            // // Create CSV from data
            // String csvFilePath = createCsvFromData(header, reportContent);
            // // Create a JRDataSource from the CSV file
            // JRCsvDataSource dataSource = new JRCsvDataSource(new File(csvFilePath));
            // dataSource.setUseFirstRowAsHeader(true);

            // Read the file using java.io.File
            File jsonFile = new File(jsonFilePath);
            // Convert JSON data to JsonDataSource
            JsonDataSource dataSource = new JsonDataSource(jsonFile);
            System.out.println("JsonDataSource: " + dataSource);

            // Compile JasperReports template
            InputStream templateStream = new FileInputStream(templateFilePath);
            JasperReport jasperReport = JasperCompileManager.compileReport(templateStream);

            // Fill the JasperReports template with data
            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);

            // Export the filled report to PDF
            JasperExportManager.exportReportToPdfFile(jasperPrint, pdfFilePath);
            System.out.println("PDF Report generated successfully at: " + pdfFilePath);

            // close IO objects
            reader.close();
            inputStream.close();
        } catch(FileNotFoundException e) {
            e.printStackTrace();
            System.out.println("JSON file not found");
            System.exit(1);
        } catch(IOException e) {
            e.printStackTrace();
            System.out.println("Filed to read JSON file");
            System.exit(1);
        } catch (JRException e) {
            e.printStackTrace();
            System.exit(1);
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }
    }

    public static String createCsvFromData(List<String> header, List<Map<String, String>> reportContent) throws IOException {
        // Define the path for the CSV file
        String csvFilePath = "report_table_content_tmp.csv";

        // Create the CSV file
        File csvFile = new File(csvFilePath);
        try (PrintWriter writer = new PrintWriter(csvFile)) {
            // Write header row
            for (int i = 0; i < header.size(); i++) {
                writer.print(header.get(i));
                if (i < header.size() - 1) {
                    writer.print(",");
                }
            }
            writer.println();

            // Write report content rows
            for (Map<String, String> row : reportContent) {
                for (int i = 0; i < header.size(); i++) {
                    writer.print(row.get(header.get(i)));
                    if (i < header.size() - 1) {
                        writer.print(",");
                    }
                }
                writer.println();
            }
        }
        return csvFilePath;
    }    
}


<?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="ReportTemplate" pageWidth="842" pageHeight="595" columnWidth="555" leftMargin="20" 
    rightMargin="20" topMargin="20" bottomMargin="20">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>

    <style name="ngLine" forecolor="#003258" />
    <style name="ngFont" forecolor="#003258" fontName="DejaVu Sans" />
    <style name="table_TH" mode="Opaque" backcolor="#F0F8FF">
        <box>
            <pen lineColor="#000000" lineWidth="0.5"/>
        </box>
    </style>
    <style name="table_CH" mode="Opaque" backcolor="#FFFFFF">
        <box>
            <bottomPen lineWidth="2.0" lineColor="#003258"/>
        </box>
    </style>

    <field name="report_title" class="java.lang.String" />
    <field name="report_subtitle" class="java.lang.String" />
    <field name="date_generated" class="java.lang.String" />
    <field name="company_name" class="java.lang.String" />

    <field name="dataSource" class="net.sf.jasperreports.engine.data.JsonDataSource" />
    <field name="header" class="java.util.List">
        <fieldDescription><![CDATA[$F{dataSource}.selectNodes("$.content.header")]]></fieldDescription>
    </field>

    <title>
        <band height="140" splitType="Stretch">
            <image hAlign="Left" vAlign="Middle">
                <reportElement x="20" y="2" width="100" height="81" backcolor="#FFFFFF"/>
                <imageExpression><![CDATA["logo.png"]]></imageExpression>
            </image>
            <textField>
                <reportElement style="ngFont" mode="Transparent" x="650" y="2" width="150" height="37"/>
                <textElement textAlignment="Right" verticalAlignment="Middle">
                    <font size="20" isBold="true" />
                </textElement>
                <textFieldExpression><![CDATA[$F{report_title}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement style="ngFont" x="650" y="35" width="150" height="23"/>
                <textElement textAlignment="Right" verticalAlignment="Middle" />
                <textFieldExpression><![CDATA[$F{report_subtitle}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement style="ngFont" x="650" y="62" width="150" height="23"/>
                <textElement textAlignment="Right" verticalAlignment="Middle" />
                <textFieldExpression><![CDATA[$F{date_generated}]]></textFieldExpression>
            </textField>
            <line>
                <reportElement style="ngLine" x="0" y="85" width="800" height="2"/>
            </line>
        </band>
    </title>

    <detail>
        <band height="500" splitType="Stretch">
        <!-- <componentElement>
            <reportElement key="table" x="0" y="0" width="700" height="500" uuid="f7159b22-2721-4a17-a3df-d2c0dd42f857" isRemoveLineWhenBlank="true"/>
            <jr:table xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components"
                      xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
                <datasetRun subDataset="table">
                    <dataSourceExpression><![CDATA[$P{header}]]></dataSourceExpression>
                </datasetRun>
                <jr:column width="650">
                    <jr:tableHeader>
                        <staticText>
                            <reportElement x="0" y="0" width="100" height="20"/>
                            <text><![CDATA[Column Header]]></text>
                        </staticText>
                    </jr:tableHeader>
                    <jr:detailCell>
                        <textField>
                            <reportElement x="0" y="0" width="100" height="20"/>
                            <textFieldExpression><![CDATA[$F{header}]]></textFieldExpression>
                        </textField>
                    </jr:detailCell>
                </jr:column>
            </jr:table>
        </componentElement> -->
        </band>
    </detail>

    <pageFooter>
        <band height="37">
            <line>
                <reportElement style="ngLine" x="0" y="2" width="800" height="2"/>
            </line>
            <textField>
                <reportElement style="ngFont" x="0" y="7" width="150" height="30"/>
                <textElement textAlignment="Right" verticalAlignment="Top">
                    <font size="10" isBold="true" />
                </textElement>
                <textFieldExpression><![CDATA[$F{company_name}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement style="ngFont" x="300" y="7" width="150" height="30"/>
                <textElement textAlignment="Right" verticalAlignment="Top">
                    <font size="10" isBold="false" />
                </textElement>
                <textFieldExpression class="java.lang.String"><![CDATA["CONFIDENTIAL"]]></textFieldExpression>
            </textField>
        </band>
    </pageFooter>
</jasperReport>

{
  "logo": "logo.png",
  "report_title": "User List Report",
  "report_subtitle": "Application User List",
  "date_generated": "April 23, 2024",
  "content": {
    "header": [
      "User ID",
      "Username",
      "Email",
      "Created Date"
    ],
    "report_content": [
      {
        "User ID": "1",
        "Username": "john.doe",
        "Email": "john.doe@example.com",
        "Created Date": "2024-03-15"
      },
      {
        "User ID": "2",
        "Username": "jane.smith",
        "Email": "jane.smith@example.com",
        "Created Date": "2024-04-10"
      },
      {
        "User ID": "3",
        "Username": "admin",
        "Email": "admin@example.com",
        "Created Date": "2024-02-01"
      },
      {
        "User ID": "4",
        "Username": "happy_coder12",
        "Email": "happy_coder12@example.com",
        "Created Date": "2023-11-21"
      },
      {
        "User ID": "5",
        "Username": "bookworm_87",
        "Email": "bookworm_87@example.com",
        "Created Date": "2024-02-05"
      },
      {
        "User ID": "6", 
        "Username": "traveling_cat",
        "Email": "traveling_cat@example.com",
        "Created Date": "2024-03-29"
      },
      {
        "User ID": "7",
        "Username": "music_lover45",
        "Email": "music_lover45@example.com",
        "Created Date": "2023-09-10"
      },
      {
        "User ID": "8",
        "Username": "coding_enthusiast",
        "Email": "coding_enthusiast@example.com",
        "Created Date": "2024-04-15"
      },
      {
        "User ID": "9",
        "Username": "green_thumb77",
        "Email": "green_thumb77@example.com",
        "Created Date": "2024-01-31"
      },
      {
        "User ID": "10",
        "Username": "cloud_dreamer99",
        "Email": "cloud_dreamer99@example.com",
        "Created Date": "2023-12-25"
      },
      {
        "User ID": "11",
        "Username": "baking_wizard",
        "Email": "baking_wizard@example.com",
        "Created Date": "2024-04-08"
      },
      {
        "User ID": "12",
        "Username": "data_diver",
        "Email": "data_diver@example.com",
        "Created Date": "2024-03-04"
      },
      {
        "User ID": "13",
        "Username": "design_thinker",
        "Email": "design_thinker@example.com",
        "Created Date": "2023-10-22"
      },
      {
        "User ID": "14",
        "Username": "history_buff21",
        "Email": "history_buff21@example.com",
        "Created Date": "2024-02-12"
      },
      {
        "User ID": "30",
        "Username": "user30",
        "Email": "user30@example.com",
        "Created Date": "2024-04-20"
      }
    ]
  },
  "company_name": "XYZ Inc"
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)