【问题标题】:Verify data exists before generating PDF with Grails controller在使用 Grails 控制器生成 PDF 之前验证数据是否存在
【发布时间】:2017-10-13 19:38:57
【问题描述】:

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

这是来自控制器的代码 sn-p:

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 数据或消息,但那是一场灾难。

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

【问题讨论】:

  • 以上是通过ajax调用的吗?

标签: pdf grails render


【解决方案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

【讨论】:

  • 这确实有效,除了提交参数的表单有一个 target="_blank" 会导致新的选项卡/窗口立即打开。这是一个要求。此外,我在此页面上有很多 ajax,并且希望“空”消息出现在页面上类似于 flash.message 的某处,但无法在“成功”中获取 PDF 数据函数然后以某种方式渲染它使这变得困难。
猜你喜欢
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
相关资源
最近更新 更多