使用Grails控制器

时间:2017-10-13 19:38:58

标签: pdf grails render

我没有使用PDF插件。我只是使用Jasper的Java API。一切都很好。 PDF将在单独的窗口中打开。我遇到的问题是,当找不到数据时,它仍会打开浏览器中的空白选项卡。我试图拦截这个并显示一条消息,而不是没有数据,但我尝试过的任何工作都没有。

以下是控制器的代码段:

projAccomps = projAccomps.findAll { ProjectAccomplishment pa ->
    pa.workDate >= startDate && pa.workDate <= endDate
}

// I'd like to be able to check right here for no data
// and send back a message instead
// 
// if (projAccomps.size() < 1) ...

JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(projAccomps)

String jasperFile =
        grailsApplication.mainContext
                .getResource('reports/accomplishment-listing.jasper')
                .file
                .getAbsoluteFile()

// Report parameter
Map<String, String> reportParam = new HashMap<String, String>()

String projectQuery = "All projects"
String dateRange = ""
Boolean allProjects = true
if (params.project) {
    projectQuery = project.name
    allProjects = false
}
if (params.startDate) {
    dateRange = startDate.format('MM/dd/yyyy')
}
if (params.endDate) {
    dateRange += " - " + endDate.format('MM/dd/yyyy')
}

String reportCriteria = "Work Order: ${wo.workOrderNumber}, Project(s): ${projectQuery}, Dates: ${dateRange}"
reportParam['report_criteria'] = reportCriteria
reportParam['all_projects'] = allProjects

JasperPrint print = JasperFillManager.fillReport(jasperFile, reportParam, ds );

byte[] bytes = JasperExportManager.exportReportToPdf(print)

render(file: bytes, contentType: 'application/pdf')

我已经尝试过Jquery.ajax并试图在成功函数中获取PDF数据或消息,但这是一场灾难。

任何人对如何做到这一点都有任何想法?

1 个答案:

答案 0 :(得分:1)

在控制器操作中,有几种方法可以创建响应,例如重定向或渲染,在您公开的情况下使用重定向然后返回

是有意义的

我认为这应该有用

// ... get projAccomps data

if (!projAccomps) {
    flash.message "No result between $startDate and $endDate"

    redirect uri: '/some/url'
    return
}

// ... render pdf logic

有一个库可以使用构建器创建pdf或word文档,如果你想尝试jasper的替代品,我可以共享链接

https://github.com/craigburke/document-builder