byteArray
メソッドを使用して送信する方法を変更したため、次render
のようになりました。
render(file: jasperService.generateReport(reportDef).toByteArray(), contentType: 'application/pdf')
しかし、別のエラーが発生しました:
Error 500: Internal Server Error
Class
java.lang.ClassNotFoundException
Message
org.apache.commons.collections.ReferenceMap
プラグインの問題だと思います.jasperプラグインはgrails 2.4.2と互換性がないと思います. jasper ライブラリを直接使用することにしました。必要な .jar をlib/
フォルダーにコピーします。この .jar をダウンロードします。
commons-beanutils-1.9.2.jar
commons-collections-3.2.jar
commons-digester-2.1.jar
commons-logging-1.2.jar
itext-2.1.7.jar
jasperreports-5.6.0.jar
次に、コントローラーを次のように変更します。
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.JRPdfExporter;
class LaporanController {
def printbarang() {
try {
String reportName = "c:/xampp/halo"
// compiles jrxml
JasperCompileManager.compileReportToFile(reportName + ".jrxml");
// fills compiled report with parameters and a connection
// JasperPrint print = JasperFillManager.fillReport(reportName + ".jasper", parameters, connection);
JasperPrint print = JasperFillManager.fillReport(reportName + ".jasper", null);
ByteArrayOutputStream pdfStream = new ByteArrayOutputStream();
// exports report to pdf
JRExporter exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
// exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, new FileOutputStream(reportName + ".pdf")); // your output goes here
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, pdfStream); // your output goes here
exporter.exportReport();
} catch (Exception e) {
render('something when wrong')
throw new RuntimeException("It's not possible to generate the pdf report.", e);
} finally {
render(file: pdfStream.toByteArray(), contentType: 'application/pdf')
}
}
}