使用 JasperReports 库和 MongoDB 生成 PDF

发布于 2025-01-06 11:22:52 字数 2431 浏览 4 评论 0原文

这是我的GeneratePdf.java 导入...

  public class GeneratePdf {
        public static void main(String[] args) {
        try {
            JRDataSource ds = getDatasource();
            // - Chargement et compilation du rapport
line32      JasperDesign jasperDesign = JRXmlLoader.load("/home/gocoffee.jrxml");
            JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);

            // - Paramètres à envoyer au rapport
            Map parameters = new HashMap();
            parameters.put("Titre", "Titre");

            // - Execution du rapport
            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
parameters, ds);

            // - Création du rapport au format PDF
            JasperExportManager.exportReportToPdfFile(jasperPrint, "home/test2.pdf");
        } catch (JRException e) {
        }
    }

Mongo 连接并获取数据():

private static JRDataSource getDatasource() {
        // Retrieve session
        try{
            Mongo m = new Mongo("localhost", 27017);
            DB db = m.getDB("test");
            DBCollection t = db.getCollection("test");
            List<DBObject> list = t.getIndexInfo();
            JRDataSource ds = new JRBeanCollectionDataSource(list);
            return ds;
        } catch (UnknownHostException e) {
            System.out.println("Error mongo connection");
        } catch (Exception e) {
            System.out.println("Other Exception");
        }
        return null;
    }
}

我收到此错误,但我不明白它:

run:
17-Feb-2012 17:07:26 org.apache.commons.digester.Digester endElement
SEVERE: End event threw exception
java.lang.reflect.InvocationTargetException
....
....
    at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:156)
    at GeneratePdf.main(GeneratePdf.java:32)

Caused by: net.sf.jasperreports.engine.JRRuntimeException: No query executer factory registered for the 'MongoDbQuery' language.
    at net.sf.jasperreports.engine.util.JRQueryExecuterUtils.getQueryExecuterFactory(JRQueryExecuterUtils.java:64)
    at net.sf.jasperreports.engine.design.JRDesignDataset.queryLanguageChanged(JRDesignDataset.java:1122)
    at net.sf.jasperreports.engine.design.JRDesignDataset.setQuery(JRDesignDataset.java:600)
    at net.sf.jasperreports.engine.design.JasperDesign.setQuery(JasperDesign.java:789)
    ... 28 more

Here is my GeneratePdf.java
Import ...

  public class GeneratePdf {
        public static void main(String[] args) {
        try {
            JRDataSource ds = getDatasource();
            // - Chargement et compilation du rapport
line32      JasperDesign jasperDesign = JRXmlLoader.load("/home/gocoffee.jrxml");
            JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);

            // - Paramètres à envoyer au rapport
            Map parameters = new HashMap();
            parameters.put("Titre", "Titre");

            // - Execution du rapport
            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
parameters, ds);

            // - Création du rapport au format PDF
            JasperExportManager.exportReportToPdfFile(jasperPrint, "home/test2.pdf");
        } catch (JRException e) {
        }
    }

Mongo connection and get data ():

private static JRDataSource getDatasource() {
        // Retrieve session
        try{
            Mongo m = new Mongo("localhost", 27017);
            DB db = m.getDB("test");
            DBCollection t = db.getCollection("test");
            List<DBObject> list = t.getIndexInfo();
            JRDataSource ds = new JRBeanCollectionDataSource(list);
            return ds;
        } catch (UnknownHostException e) {
            System.out.println("Error mongo connection");
        } catch (Exception e) {
            System.out.println("Other Exception");
        }
        return null;
    }
}

I get this error but I dont understand it:

run:
17-Feb-2012 17:07:26 org.apache.commons.digester.Digester endElement
SEVERE: End event threw exception
java.lang.reflect.InvocationTargetException
....
....
    at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:156)
    at GeneratePdf.main(GeneratePdf.java:32)

Caused by: net.sf.jasperreports.engine.JRRuntimeException: No query executer factory registered for the 'MongoDbQuery' language.
    at net.sf.jasperreports.engine.util.JRQueryExecuterUtils.getQueryExecuterFactory(JRQueryExecuterUtils.java:64)
    at net.sf.jasperreports.engine.design.JRDesignDataset.queryLanguageChanged(JRDesignDataset.java:1122)
    at net.sf.jasperreports.engine.design.JRDesignDataset.setQuery(JRDesignDataset.java:600)
    at net.sf.jasperreports.engine.design.JasperDesign.setQuery(JasperDesign.java:789)
    ... 28 more

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

浮生面具三千个 2025-01-13 11:22:52

使用 JRBeanCollectionDataSource 并不是使用 MongoDB 连接器的正确方法。看一下 Jaspersoft MongoDB 连接器源附带的这个测试:

MongoDbDatasource/src/test/java/com/jaspersoft/mongodb/ReportTest.java

二进制连接器和源都位于 项目页面

为了保持这个答案的独立性,这里有一个代码片段,展示了如何填写 MongoDB 报告。这是我上面提到的文件的修改摘录。

String mongoURI = "mongodb://bdsandbox6:27017/test";
MongoDbConnection connection = null;
Map<String, Object> parameters = new HashMap<String, Object>();
try {
  connection = new MongoDbConnection(mongoURI, null, null);
  parameters.put(MongoDbDataSource.CONNECTION, connection);
  File jasperFile;
  jasperFile = new File("MongoDbReport.jasper");
  JasperCompileManager.compileReportToFile("MongoDbReport.jrxml", "MongoDbReport.jasper");
  JasperFillManager.fillReportToFile("MongoDbReport.jasper", parameters);
  JasperExportManager.exportReportToPdfFile("MongoDbReport.jrprint");
}
} catch (Exception e) {
  e.printStackTrace();
} finally {
  if (connection != null) {
    connection.close();
  }
}

Using the JRBeanCollectionDataSource is not the right way to go about using the MongoDB connector. Take a look at this test that comes with the Jaspersoft MongoDB Connector source:

MongoDbDatasource/src/test/java/com/jaspersoft/mongodb/ReportTest.java

Both the binary connector and the source are on the project page.

To keep this answer self-contained, here's a code snippet showing how to fill a MongoDB report. It's a modified extract from the file I mention above.

String mongoURI = "mongodb://bdsandbox6:27017/test";
MongoDbConnection connection = null;
Map<String, Object> parameters = new HashMap<String, Object>();
try {
  connection = new MongoDbConnection(mongoURI, null, null);
  parameters.put(MongoDbDataSource.CONNECTION, connection);
  File jasperFile;
  jasperFile = new File("MongoDbReport.jasper");
  JasperCompileManager.compileReportToFile("MongoDbReport.jrxml", "MongoDbReport.jasper");
  JasperFillManager.fillReportToFile("MongoDbReport.jasper", parameters);
  JasperExportManager.exportReportToPdfFile("MongoDbReport.jrprint");
}
} catch (Exception e) {
  e.printStackTrace();
} finally {
  if (connection != null) {
    connection.close();
  }
}
烟柳画桥 2025-01-13 11:22:52

您需要添加以下行:

JRProperties.setProperty("net.sf.jasperreports.query.executer.factory.MongoDbQuery", "com.jaspersoft.mongodb.query.MongoDbQueryExecuterFactory");

验证数据源 jar 文件中的路径,例如 js-mongodb-datasource-0.5.0

You need to add following line:

JRProperties.setProperty("net.sf.jasperreports.query.executer.factory.MongoDbQuery", "com.jaspersoft.mongodb.query.MongoDbQueryExecuterFactory");

Verify path in datasource jar file, e.g. js-mongodb-datasource-0.5.0

你的背包 2025-01-13 11:22:52

它通过添加适当的依赖关系来解决。

jrxml 中使用的 MongoDbQuery 需要 MongoDbQueryExecuter。并为此使用以下依赖项。
https://mvnrepository.com/artifact/com.jaspersoft。 Connectors.mongodb/js-mongodb-datasource

确保您安装了正确的驱动器 mongodb-driver-sync, mongodb-driver-legacy 和 mongodb-driver-core。

下面是我在项目中使用的版本的依赖项列表,它工作正常。

// https://mvnrepository.com/artifact/org.springframework.数据/spring-data-mongodb
实现组:'org.springframework.data',名称:'spring-data-mongodb',版本:'4.1.2'
// https://mvnrepository.com/artifact/org.mongodb/mongodb-驱动程序同步
实现组:'org.mongodb',名称:'mongodb-driver-sync',版本:'4.10.2'
// https://mvnrepository.com/artifact/org.mongodb/mongodb-驱动程序遗留
实现组:'org.mongodb',名称:'mongodb-driver-legacy',版本:'4.10.2'
// https://mvnrepository.com/artifact/org.mongodb/mongodb-驱动核心
实现组:'org.mongodb',名称:'mongodb-driver-core',版本:'4.10.2'

// https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports
implementation group: 'net.sf.jasperreports', name: 'jasperreports', version: '6.20.6'
// https://mvnrepository.com/artifact/com.github.librepdf/openpdf
implementation group: 'com.github.librepdf', name: 'openpdf', version: '1.3.30'

// https://mvnrepository.com/artifact/com.jaspersoft.connectors.mongodb/js-mongodb-datasource
实施组:'com.jaspersoft.connectors.mongodb',名称:'js-mongodb-datasource',版本:'3.10.2'

    byte[] bytes = null;
    String mongoURI = "mongodb://127.0.0.1:29002/yourdatabase";
    MongoDbConnection connection = null;
    try {
        connection = new MongoDbConnection(mongoURI, null, null);
        Map<String, Object> parameters = new HashMap<String, Object>();
        final InputStream stream = this.getClass().getResourceAsStream("/test.jrxml");

        final JasperReport report = JasperCompileManager.compileReport(stream);
        final JasperPrint print = JasperFillManager.fillReport(report, parameters,connection);
        bytes = JasperExportManager.exportReportToPdf(print);


    }catch (Exception e){
        System.out.println(e.getMessage());
    }

It resolved by adding proper dependencies.

MongoDbQueryExecuter required for MongoDbQuery used in your jrxml. and for that use below dependencies.
https://mvnrepository.com/artifact/com.jaspersoft.connectors.mongodb/js-mongodb-datasource

make sure you have proper drives installed mongodb-driver-sync, mongodb-driver-legacy and mongodb-driver-core.

below is list of dependencies with versions I used in my project, and it was working fine.

// https://mvnrepository.com/artifact/org.springframework.data/spring-data-mongodb
implementation group: 'org.springframework.data', name: 'spring-data-mongodb', version: '4.1.2'
// https://mvnrepository.com/artifact/org.mongodb/mongodb-driver-sync
implementation group: 'org.mongodb', name: 'mongodb-driver-sync', version: '4.10.2'
// https://mvnrepository.com/artifact/org.mongodb/mongodb-driver-legacy
implementation group: 'org.mongodb', name: 'mongodb-driver-legacy', version: '4.10.2'
// https://mvnrepository.com/artifact/org.mongodb/mongodb-driver-core
implementation group: 'org.mongodb', name: 'mongodb-driver-core', version: '4.10.2'

// https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports
implementation group: 'net.sf.jasperreports', name: 'jasperreports', version: '6.20.6'
// https://mvnrepository.com/artifact/com.github.librepdf/openpdf
implementation group: 'com.github.librepdf', name: 'openpdf', version: '1.3.30'

// https://mvnrepository.com/artifact/com.jaspersoft.connectors.mongodb/js-mongodb-datasource
implementation group: 'com.jaspersoft.connectors.mongodb', name: 'js-mongodb-datasource', version: '3.10.2'

    byte[] bytes = null;
    String mongoURI = "mongodb://127.0.0.1:29002/yourdatabase";
    MongoDbConnection connection = null;
    try {
        connection = new MongoDbConnection(mongoURI, null, null);
        Map<String, Object> parameters = new HashMap<String, Object>();
        final InputStream stream = this.getClass().getResourceAsStream("/test.jrxml");

        final JasperReport report = JasperCompileManager.compileReport(stream);
        final JasperPrint print = JasperFillManager.fillReport(report, parameters,connection);
        bytes = JasperExportManager.exportReportToPdf(print);


    }catch (Exception e){
        System.out.println(e.getMessage());
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文