├── libs └── README.md ├── jrxml ├── README.md └── test.jrxml ├── .gitattributes ├── settings.json ├── package.json ├── LICENSE ├── .gitignore ├── README.md └── index.js /libs/README.md: -------------------------------------------------------------------------------- 1 | Put the jar files here. -------------------------------------------------------------------------------- /jrxml/README.md: -------------------------------------------------------------------------------- 1 | Put the Jasper Reports JRXML files here. -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "reports":{ 3 | "test1": { 4 | "jrxml": "/jrxml/test.jrxml" 5 | }, 6 | "test2": { 7 | "jrxml": "/jrxml/test2.jrxml", 8 | "subreports":{ 9 | "parametername1": { 10 | "jrxml": "/jrxml/test2subreport1.jrxml" 11 | } 12 | } 13 | } 14 | }, 15 | "drivers": { 16 | "postgresql": { 17 | "path": "/libs/postgresql-42.2.1.jar", 18 | "class": "org.postgresql.Driver" 19 | } 20 | }, 21 | "connections": { 22 | "mytestdatabase": { 23 | "jdbc": "jdbc:postgresql://localhost:5432/mytestdatabase", 24 | "user": "myusername", 25 | "password": "mypassword" 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-jasper-server", 3 | "version": "1.0.2", 4 | "description": "Jasper Reports Server in NodeJS", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [ 10 | "Jasper", 11 | "Reports", 12 | "Node" 13 | ], 14 | "author": "Andrew M. Loable - Loable Technologies", 15 | "email": "andrew@loable.tech", 16 | "url": "https://loable.tech", 17 | "license": "MIT", 18 | "dependencies": { 19 | "async": "^2.6.0", 20 | "body-parser": "^1.18.2", 21 | "cors": "^2.8.4", 22 | "express": "^4.16.3", 23 | "extend": "^3.0.1", 24 | "fs": "0.0.1-security", 25 | "java": "^0.9.0", 26 | "path": "^0.12.7", 27 | "sleep": "^5.1.1", 28 | "tmp": "0.0.33", 29 | "util": "^0.10.3" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Andrew Loable 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | -------------------------------------------------------------------------------- /jrxml/test.jrxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | <band height="79" splitType="Stretch"> 14 | <staticText> 15 | <reportElement x="0" y="10" width="550" height="30" uuid="b7417be3-ada6-47ae-b079-932f5158438d"/> 16 | <textElement textAlignment="Center"> 17 | <font size="20"/> 18 | </textElement> 19 | <text><![CDATA[Test Jasper Report]]></text> 20 | </staticText> 21 | </band> 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # jasper-node-server 2 | Host Jasper Reports in NodeJS 3 | 4 | 5 | ## Download 6 | 7 | ``` 8 | git clone git:github.com/andrewloable/jasper-node-server.git 9 | npm install 10 | ``` 11 | 12 | ## Libraries 13 | 14 | Put all Jasper Reports libraries (jar files) under the /libs folder. 15 | The easiest way to get the libraries is to copy all jar files from JasperReports Server under 16 | 17 | ``` 18 | /apache-tomcat/webapps/jasperserver/WEB-INF/lib 19 | ``` 20 | 21 | ## Configure 22 | 23 | All reports, drivers and connections are set in settings.json. 24 | A sample configuration is shown below. 25 | 26 | ``` 27 | { 28 | "reports":{ 29 | "test1": { 30 | "jrxml": "/jrxml/test.jrxml" 31 | }, 32 | "test2": { 33 | "jrxml": "/jrxml/test2.jrxml", 34 | "subreports":{ 35 | "parametername1": { 36 | "jrxml": "/jrxml/test2subreport1.jrxml" 37 | } 38 | } 39 | } 40 | }, 41 | "drivers": { 42 | "postgresql": { 43 | "path": "/libs/postgresql-42.2.1.jar", 44 | "class": "org.postgresql.Driver" 45 | } 46 | }, 47 | "connections": { 48 | "mytestdatabase": { 49 | "jdbc": "jdbc:postgresql://localhost:5432/mytestdatabase", 50 | "user": "myusername", 51 | "password": "mypassword" 52 | } 53 | } 54 | } 55 | ``` 56 | 57 | ## Run 58 | 59 | Execute the command below. 60 | 61 | ``` 62 | node index.js 63 | ``` 64 | 65 | This will run an express app that listens to port 3000 and will accept connections from localhost only. 66 | 67 | ## API 68 | 69 | * **/generate_pdf** 70 | Generate a PDF report. 71 | 72 | * **/generate_html** 73 | Generate an HTML report. 74 | 75 | * **/generate_rtf** 76 | Generate an RTF report. 77 | 78 | * **/generate_csv** 79 | Generate a CSV report. 80 | 81 | * **/generate_docx** 82 | Generate a Docx report. 83 | 84 | * **/generate_pptx** 85 | Generate a Pptx report. 86 | 87 | * **/generate_xlsx** 88 | Generate an xlsx report. 89 | 90 | * **/generate_odt** 91 | Generate an ODT report. 92 | 93 | ## Examples 94 | 95 | To generate a report into PDF 96 | 97 | * **http** 98 | ``` 99 | POST /generate_pdf HTTP/1.1 100 | Host: localhost:3000 101 | Content-Type: application/json 102 | Cache-Control: no-cache 103 | 104 | { 105 | "name": "test", 106 | "connection": "none", 107 | "parameters": { 108 | "Parameter1": "Parameter 1", 109 | "Parameter2": "PARAM2" 110 | } 111 | } 112 | ``` 113 | 114 | * **go** 115 | ``` 116 | package main 117 | 118 | import ( 119 | "fmt" 120 | "strings" 121 | "net/http" 122 | "io/ioutil" 123 | ) 124 | 125 | func main() { 126 | 127 | url := "http://localhost:3000/generate_pdf" 128 | 129 | payload := strings.NewReader("{\n\t\"name\": \"test\",\n\t\"connection\": \"none\",\n\t\"parameters\": {\n\t\t\"Parameter1\": \"Parameter 1\",\n\t\t\"Parameter2\": \"PARAM2\"\n\t}\n}") 130 | 131 | req, _ := http.NewRequest("POST", url, payload) 132 | 133 | req.Header.Add("content-type", "application/json") 134 | req.Header.Add("cache-control", "no-cache") 135 | 136 | res, _ := http.DefaultClient.Do(req) 137 | 138 | defer res.Body.Close() 139 | body, _ := ioutil.ReadAll(res.Body) 140 | 141 | fmt.Println(res) 142 | fmt.Println(string(body)) 143 | 144 | } 145 | ``` 146 | 147 | * **nodejs request** 148 | ``` 149 | var request = require("request"); 150 | 151 | var options = { method: 'POST', 152 | url: 'http://localhost:3000/generate_pdf', 153 | headers: 154 | { 'cache-control': 'no-cache', 155 | 'content-type': 'application/json' }, 156 | body: 157 | { name: 'test', 158 | connection: 'none', 159 | parameters: { Parameter1: 'Parameter 1', Parameter2: 'PARAM2' } }, 160 | json: true }; 161 | 162 | request(options, function (error, response, body) { 163 | if (error) throw new Error(error); 164 | 165 | console.log(body); 166 | }); 167 | ``` 168 | 169 | * **curl** 170 | ``` 171 | curl -X POST \ 172 | http://localhost:3000/generate_pdf \ 173 | -H 'cache-control: no-cache' \ 174 | -H 'content-type: application/json' \ 175 | -d '{ 176 | "name": "test", 177 | "connection": "none", 178 | "parameters": { 179 | "Parameter1": "Parameter 1", 180 | "Parameter2": "PARAM2" 181 | } 182 | }' 183 | ``` 184 | 185 | * **python requests** 186 | ``` 187 | import requests 188 | 189 | url = "http://localhost:3000/generate_pdf" 190 | 191 | payload = "{\n\t\"name\": \"test\",\n\t\"connection\": \"none\",\n\t\"parameters\": {\n\t\t\"Parameter1\": \"Parameter 1\",\n\t\t\"Parameter2\": \"PARAM2\"\n\t}\n}" 192 | headers = { 193 | 'content-type': "application/json", 194 | 'cache-control': "no-cache", 195 | } 196 | 197 | response = requests.request("POST", url, data=payload, headers=headers) 198 | 199 | print(response.text) 200 | ``` 201 | 202 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /* 2 | Jasper Server for NodeJS 3 | (c) 2018 Loable Technologies 4 | Andrew M. Loable 5 | https://loable.tech 6 | */ 7 | const java = require('java'); 8 | const fs = require('fs'); 9 | const path = require('path'); 10 | const util = require('util'); 11 | const tmp = require('tmp'); 12 | const sleep = require('sleep'); 13 | const async = require('async'); 14 | const express = require('express'); 15 | const cors = require('cors'); 16 | const bodyParser = require('body-parser'); 17 | const app = express(); 18 | const vm = this; 19 | 20 | vm.modulePath = path.dirname(__filename); // main directory 21 | vm.libraryPath = path.join(vm.modulePath, 'libs'); // Put jars in lib directory 22 | 23 | vm.settings = { 24 | reports: {}, 25 | drivers: {}, 26 | connections: {} 27 | }; 28 | 29 | // Add jar to java classpath 30 | function loadJar(file){ 31 | if (path.extname(file) == '.jar'){ 32 | console.log("Loading: " + file); 33 | java.classpath.push(file); 34 | } 35 | } 36 | 37 | // Import JasperReports 38 | function importJasperReports(){ 39 | 40 | }; 41 | 42 | // Returns the connection identified by the report 43 | function getReportConnection(report){ 44 | var conn = vm.settings.connections[report.connection]; 45 | console.log(conn); 46 | if (conn){ 47 | // Return Jasper Connection 48 | return vm.driverManager.getConnectionSync(conn.jdbc, conn.user, conn.password); 49 | } else { 50 | console.error("Connection " + report.connection + " is not registered."); 51 | // Return Empty Data Source 52 | return new vm.jasperEmptyDataSource(); 53 | } 54 | }; 55 | 56 | // Parse Locale String 57 | function parseLocaleString(str){ 58 | var s = str.split(/[_|-]/); 59 | if (s.length > 1){ 60 | return vm.locale(s[0], s[1]); 61 | } else { 62 | return vm.locale(s[0]); 63 | } 64 | }; 65 | 66 | // Generate JasperPrint from a report 67 | function generateJasperPrint(report){ 68 | console.log("check registered reports"); 69 | for (var r in vm.settings.reports){ 70 | if (report.name === r){ 71 | report.jrxml = vm.settings.reports[r].jrxml; 72 | report.subreports = vm.settings.reports[r].subreports; 73 | } 74 | } 75 | 76 | var parameters = new vm.hashMap(); 77 | 78 | if (report.jrxml){ 79 | jrxmlLoader = java.callStaticMethodSync("net.sf.jasperreports.engine.xml.JRXmlLoader", "load", path.join(vm.modulePath, report.jrxml)); 80 | report.jasper = java.callStaticMethodSync("net.sf.jasperreports.engine.JasperCompileManager", "compileReport", jrxmlLoader); 81 | if (report.subreports){ 82 | console.log("subreports detected"); 83 | for(subreport in report.subreports){ 84 | var obj = report.subreports[subreport]; 85 | objJrxmlLoader = java.callStaticMethodSync("net.sf.jasperreports.engine.xml.JRXmlLoader", "load", path.join(vm.modulePath, obj.jrxml)); 86 | objJasper = java.callStaticMethodSync("net.sf.jasperreports.engine.JasperCompileManager", "compileReport", objJrxmlLoader); 87 | // add subreports as parameters. make sure to use parameters for subreport definition 88 | parameters.putSync(subreport, objJasper); 89 | } 90 | } 91 | } else { 92 | console.error("jrxml not defined in report object"); 93 | } 94 | 95 | var toExports = []; 96 | 97 | if (report.jasper){ 98 | var toExport = null; 99 | 100 | //process parameters 101 | if (report.parameters){ 102 | for (var p in report.parameters) { 103 | if (p === "REPORT_LOCALE") { 104 | report.parameters[p] = parseLocaleString(report.parameters[p]); 105 | } 106 | parameters.putSync(p, report.parameters[p]); 107 | } 108 | } 109 | 110 | // Get connection used by report 111 | var connection = getReportConnection(report); 112 | var jasperPrint = vm.jasperFillManager.fillReportSync(report.jasper, parameters, connection); 113 | return jasperPrint; 114 | } else { 115 | console.error("jasper not generated by previous process"); 116 | } 117 | 118 | return null; 119 | }; 120 | 121 | // Generate PDF From JasperPrint 122 | function generatePDF(report){ 123 | var tmpFile = tmp.fileSync(); 124 | var outputFile = tmpFile.name + ".pdf"; 125 | var jasperPrint = generateJasperPrint(report); 126 | if (jasperPrint){ 127 | var jasperReportsContext = java.callStaticMethodSync("net.sf.jasperreports.engine.DefaultJasperReportsContext", "getInstance"); 128 | var exporter = new vm.jasperPdfExporter(jasperReportsContext); 129 | exporter.setExporterInputSync(new vm.simpleExporterInput(jasperPrint)); 130 | exporter.setExporterOutputSync(new vm.simpleOutputStreamExporterOutput(outputFile)); 131 | exporter.exportReportSync(); 132 | 133 | var toStream = fs.readFileSync(outputFile); 134 | fs.unlinkSync(outputFile); 135 | return toStream; 136 | } 137 | return null; 138 | }; 139 | 140 | // Generate HTML From JasperPrint 141 | function generateHTML(report){ 142 | var tmpFile = tmp.fileSync(); 143 | var outputFile = tmpFile.name + ".html"; 144 | var jasperPrint = generateJasperPrint(report); 145 | if (jasperPrint){ 146 | var jasperReportsContext = java.callStaticMethodSync("net.sf.jasperreports.engine.DefaultJasperReportsContext", "getInstance"); 147 | var exporter = new vm.jasperHtmlExporter(jasperReportsContext); 148 | exporter.setExporterInputSync(new vm.simpleExporterInput(jasperPrint)); 149 | exporter.setExporterOutputSync(new vm.simpleHtmlExporterOutput(outputFile)); 150 | exporter.exportReportSync(); 151 | 152 | var toStream = fs.readFileSync(outputFile); 153 | fs.unlinkSync(outputFile); 154 | return toStream; 155 | } 156 | return null; 157 | }; 158 | 159 | // Generate RTF From JasperPrint 160 | function generateRTF(report){ 161 | var tmpFile = tmp.fileSync(); 162 | var outputFile = tmpFile.name + ".rtf"; 163 | var jasperPrint = generateJasperPrint(report); 164 | if (jasperPrint){ 165 | var jasperReportsContext = java.callStaticMethodSync("net.sf.jasperreports.engine.DefaultJasperReportsContext", "getInstance"); 166 | var exporter = new vm.jasperRtfExporter(jasperReportsContext); 167 | exporter.setExporterInputSync(new vm.simpleExporterInput(jasperPrint)); 168 | exporter.setExporterOutputSync(new vm.simpleWriterExporterOutput(outputFile)); 169 | exporter.exportReportSync(); 170 | 171 | var toStream = fs.readFileSync(outputFile); 172 | fs.unlinkSync(outputFile); 173 | return toStream; 174 | } 175 | return null; 176 | }; 177 | 178 | // Generate CSV From JasperPrint 179 | function generateCSV(report){ 180 | var tmpFile = tmp.fileSync(); 181 | var outputFile = tmpFile.name + ".csv"; 182 | var jasperPrint = generateJasperPrint(report); 183 | if (jasperPrint){ 184 | var jasperReportsContext = java.callStaticMethodSync("net.sf.jasperreports.engine.DefaultJasperReportsContext", "getInstance"); 185 | var exporter = new vm.jasperCsvExporter(jasperReportsContext); 186 | exporter.setExporterInputSync(new vm.simpleExporterInput(jasperPrint)); 187 | exporter.setExporterOutputSync(new vm.simpleWriterExporterOutput(outputFile)); 188 | exporter.exportReportSync(); 189 | 190 | var toStream = fs.readFileSync(outputFile); 191 | fs.unlinkSync(outputFile); 192 | return toStream; 193 | } 194 | return null; 195 | }; 196 | 197 | // Generate DocX From JasperPrint 198 | function generateDOCX(report){ 199 | var tmpFile = tmp.fileSync(); 200 | var outputFile = tmpFile.name + ".docx"; 201 | var jasperPrint = generateJasperPrint(report); 202 | if (jasperPrint){ 203 | var jasperReportsContext = java.callStaticMethodSync("net.sf.jasperreports.engine.DefaultJasperReportsContext", "getInstance"); 204 | var exporter = new vm.jasperDocxExporter(jasperReportsContext); 205 | exporter.setExporterInputSync(new vm.simpleExporterInput(jasperPrint)); 206 | exporter.setExporterOutputSync(new vm.simpleOutputStreamExporterOutput(outputFile)); 207 | exporter.exportReportSync(); 208 | 209 | var toStream = fs.readFileSync(outputFile); 210 | fs.unlinkSync(outputFile); 211 | return toStream; 212 | } 213 | return null; 214 | }; 215 | 216 | // Generate PptX From JasperPrint 217 | function generatePPTX(report){ 218 | var tmpFile = tmp.fileSync(); 219 | var outputFile = tmpFile.name + ".pptx"; 220 | var jasperPrint = generateJasperPrint(report); 221 | if (jasperPrint){ 222 | var jasperReportsContext = java.callStaticMethodSync("net.sf.jasperreports.engine.DefaultJasperReportsContext", "getInstance"); 223 | var exporter = new vm.jasperPptxExporter(jasperReportsContext); 224 | exporter.setExporterInputSync(new vm.simpleExporterInput(jasperPrint)); 225 | exporter.setExporterOutputSync(new vm.simpleOutputStreamExporterOutput(outputFile)); 226 | exporter.exportReportSync(); 227 | 228 | var toStream = fs.readFileSync(outputFile); 229 | fs.unlinkSync(outputFile); 230 | return toStream; 231 | } 232 | return null; 233 | }; 234 | 235 | // Generate XlsX From JasperPrint 236 | function generateXLSX(report){ 237 | var tmpFile = tmp.fileSync(); 238 | var outputFile = tmpFile.name + ".xls"; 239 | var jasperPrint = generateJasperPrint(report); 240 | if (jasperPrint){ 241 | var jasperReportsContext = java.callStaticMethodSync("net.sf.jasperreports.engine.DefaultJasperReportsContext", "getInstance"); 242 | var exporter = new vm.jasperXlsxExporter(jasperReportsContext); 243 | exporter.setExporterInputSync(new vm.simpleExporterInput(jasperPrint)); 244 | exporter.setExporterOutputSync(new vm.simpleOutputStreamExporterOutput(outputFile)); 245 | exporter.exportReportSync(); 246 | 247 | var toStream = fs.readFileSync(outputFile); 248 | fs.unlinkSync(outputFile); 249 | return toStream; 250 | } 251 | return null; 252 | }; 253 | 254 | // Generate ODT From JasperPrint 255 | function generateODT(report){ 256 | var tmpFile = tmp.fileSync(); 257 | var outputFile = tmpFile.name + ".odt"; 258 | var jasperPrint = generateJasperPrint(report); 259 | if (jasperPrint){ 260 | var jasperReportsContext = java.callStaticMethodSync("net.sf.jasperreports.engine.DefaultJasperReportsContext", "getInstance"); 261 | var exporter = new vm.jasperOdtExporter(jasperReportsContext); 262 | exporter.setExporterInputSync(new vm.simpleExporterInput(jasperPrint)); 263 | exporter.setExporterOutputSync(new vm.simpleOutputStreamExporterOutput(outputFile)); 264 | exporter.exportReportSync(); 265 | 266 | var toStream = fs.readFileSync(outputFile); 267 | fs.unlinkSync(outputFile); 268 | return toStream; 269 | } 270 | return null; 271 | }; 272 | 273 | // Start Of Process 274 | async.auto({ 275 | getSettings: function(callback){ 276 | console.log("get settings"); 277 | vm.settings = JSON.parse(fs.readFileSync('settings.json', 'utf8')); 278 | callback(); 279 | }, 280 | getJarsFromLib: ['getSettings', function(results, callback){ 281 | var dir = vm.libraryPath; 282 | console.log("get jars from " + dir); 283 | var files = fs.readdirSync(dir); 284 | for (var file in files){ 285 | file = path.join(dir, files[file]); 286 | var stat = fs.statSync(file); 287 | if (stat && stat.isDirectory()){ 288 | // directory found, do not process 289 | console.log("found subdirectory " + file); 290 | } else { 291 | console.log("found file " + file); 292 | // Load Jar 293 | loadJar(file); 294 | } 295 | } 296 | callback(); 297 | }], 298 | loadSQLDrivers: ['getJarsFromLib', function(results, callback){ 299 | console.log("load sql drivers"); 300 | var classLoader = java.callStaticMethodSync("java.lang.ClassLoader", "getSystemClassLoader"); 301 | if (vm.settings.drivers){ 302 | for (var name in vm.settings.drivers){ 303 | var driver = vm.settings.drivers[name]; 304 | var file = path.join(vm.modulePath, driver.path); 305 | loadJar(file); 306 | classLoader.loadClassSync(driver.class).newInstanceSync(); 307 | } 308 | } 309 | callback(); 310 | }], 311 | importJasper: ['loadSQLDrivers', function(results, callback){ 312 | console.log("import jasper"); 313 | vm.driverManager = java.import("java.sql.DriverManager"); 314 | vm.hashMap = java.import("java.util.HashMap"); 315 | vm.locale = java.import("java.util.Locale"); 316 | vm.byteAraryInputStream = java.import("java.io.ByteArrayInputStream"); 317 | vm.jasperEmptyDataSource = java.import("net.sf.jasperreports.engine.JREmptyDataSource"); 318 | vm.jasperCompileManager = java.import("net.sf.jasperreports.engine.JasperCompileManager"); 319 | vm.jasperFillManager = java.import("net.sf.jasperreports.engine.JasperFillManager"); 320 | vm.jasperExportManager = java.import("net.sf.jasperreports.engine.JasperExportManager"); 321 | vm.jasperPdfExporter = java.import("net.sf.jasperreports.engine.export.JRPdfExporter"); 322 | vm.jasperHtmlExporter = java.import("net.sf.jasperreports.engine.export.HtmlExporter"); 323 | vm.jasperRtfExporter = java.import("net.sf.jasperreports.engine.export.JRRtfExporter"); 324 | vm.jasperCsvExporter = java.import("net.sf.jasperreports.engine.export.JRCsvExporter"); 325 | vm.jasperDocxExporter = java.import("net.sf.jasperreports.engine.export.ooxml.JRDocxExporter"); 326 | vm.jasperPptxExporter = java.import("net.sf.jasperreports.engine.export.ooxml.JRPptxExporter"); 327 | vm.jasperXlsxExporter = java.import("net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter"); 328 | vm.jasperOdtExporter = java.import("net.sf.jasperreports.engine.export.oasis.JROdtExporter"); 329 | vm.jasperJsonExporter = java.import("net.sf.jasperreports.engine.export.JsonExporter"); 330 | vm.simpleExporterInput = java.import("net.sf.jasperreports.export.SimpleExporterInput"); 331 | vm.simpleOutputStreamExporterOutput = java.import("net.sf.jasperreports.export.SimpleOutputStreamExporterOutput"); 332 | vm.simpleHtmlExporterOutput = java.import("net.sf.jasperreports.export.SimpleHtmlExporterOutput"); 333 | vm.simpleWriterExporterOutput = java.import("net.sf.jasperreports.export.SimpleWriterExporterOutput"); 334 | vm.jasperXmlLoader = java.import("net.sf.jasperreports.engine.xml.JRXmlLoader") 335 | callback(); 336 | }] 337 | }, 338 | function(error, results) { 339 | console.log("start express"); 340 | // Start of Express 341 | app.use(cors({ origin: true })); 342 | app.use(bodyParser.json()); 343 | 344 | app.post("/generate_pdf", function(req, res){ 345 | var report = req.body; 346 | if (report){ 347 | console.log(report); 348 | var obj = generatePDF(report); 349 | res.setHeader('Content-Disposition', 'attachment; filename=' + report.name + ".pdf"); 350 | res.contentType("application/pdf"); 351 | res.send(obj); 352 | return; 353 | } else { 354 | res.status(400).send("invalid parameters"); 355 | } 356 | 357 | }); 358 | app.post("/generate_html", function(req, res){ 359 | var report = req.body; 360 | if (report){ 361 | console.log(report); 362 | var obj = generateHTML(report); 363 | res.setHeader('Content-Disposition', 'attachment; filename=' + report.name + ".html"); 364 | res.contentType("text/html"); 365 | res.send(obj); 366 | return; 367 | } else { 368 | res.status(400).send("invalid parameters"); 369 | } 370 | 371 | }); 372 | app.post("/generate_rtf", function(req, res){ 373 | var report = req.body; 374 | if (report){ 375 | console.log(report); 376 | var obj = generateRTF(report); 377 | res.setHeader('Content-Disposition', 'attachment; filename=' + report.name + ".rtf"); 378 | res.contentType("application/rtf"); 379 | res.send(obj); 380 | return; 381 | } else { 382 | res.status(400).send("invalid parameters"); 383 | } 384 | 385 | }); 386 | app.post("/generate_csv", function(req, res){ 387 | var report = req.body; 388 | if (report){ 389 | console.log(report); 390 | var obj = generateCSV(report); 391 | res.setHeader('Content-Disposition', 'attachment; filename=' + report.name + ".csv"); 392 | res.contentType("application/rtf"); 393 | res.send(obj); 394 | return; 395 | } else { 396 | res.status(400).send("invalid parameters"); 397 | } 398 | 399 | }); 400 | app.post("/generate_docx", function(req, res){ 401 | var report = req.body; 402 | if (report){ 403 | console.log(report); 404 | var obj = generateDOCX(report); 405 | res.setHeader('Content-Disposition', 'attachment; filename=' + report.name + ".docx"); 406 | res.contentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); 407 | res.send(obj); 408 | return; 409 | } else { 410 | res.status(400).send("invalid parameters"); 411 | } 412 | 413 | }); 414 | app.post("/generate_pptx", function(req, res){ 415 | var report = req.body; 416 | if (report){ 417 | console.log(report); 418 | var obj = generatePPTX(report); 419 | res.setHeader('Content-Disposition', 'attachment; filename=' + report.name + ".pptx"); 420 | res.contentType("application/vnd.openxmlformats-officedocument.presentationml.presentation"); 421 | res.send(obj); 422 | return; 423 | } else { 424 | res.status(400).send("invalid parameters"); 425 | } 426 | 427 | }); 428 | app.post("/generate_xlsx", function(req, res){ 429 | var report = req.body; 430 | if (report){ 431 | console.log(report); 432 | var obj = generateXLSX(report); 433 | res.setHeader('Content-Disposition', 'attachment; filename=' + report.name + ".xlsx"); 434 | res.contentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 435 | res.send(obj); 436 | return; 437 | } else { 438 | res.status(400).send("invalid parameters"); 439 | } 440 | 441 | }); 442 | app.post("/generate_odt", function(req, res){ 443 | var report = req.body; 444 | if (report){ 445 | console.log(report); 446 | var obj = generateODT(report); 447 | res.setHeader('Content-Disposition', 'attachment; filename=' + report.name + ".odt"); 448 | res.contentType("application/vnd.oasis.opendocument.text"); 449 | res.send(obj); 450 | return; 451 | } else { 452 | res.status(400).send("invalid parameters"); 453 | } 454 | 455 | }); 456 | 457 | console.log("Listening at port 3000"); 458 | app.listen(3000, 'localhost'); 459 | }); 460 | 461 | 462 | 463 | 464 | --------------------------------------------------------------------------------