Grails呈现PDF文件

时间:2016-04-12 09:53:45

标签: pdf grails render

我正在尝试在我的网页中呈现PDF文件,但是使用下面的语法我会得到一个奇怪的字符组合。

render file: new File ("path/to/file.pdf"), fileName: 'myPdfFile.pdf'

有谁知道我需要添加多于上面的行?

由于

4 个答案:

答案 0 :(得分:1)

我不认为Grails默认会这样做。
看一下 PDF渲染插件This看起来最新鲜,但请确保它与您的Grails版本兼容。
如果你使用的是Grails 3,那么this就可以了。

答案 1 :(得分:1)

在Grails 3中,你可以做到

render file: new File ("path/to/file.pdf")

答案 2 :(得分:0)

您是否尝试过建议的插件?我无法在我的项目中使用此依赖项。 1.0.0版本不存在,有2.0.0,2.0.2和2.0.3版本 - 但是当我尝试使用它们时,项目编译失败。

我曾尝试下载git源并运行它们 - 网站已启动,但我也看到以下错误:

Grails Runtime Exception

Error Details

Error 404: 
Servlet: grailsDispatcherServlet
URI: /

当我尝试访问特定的控制器操作时,它会像这样结束:

java.lang.reflect.InvocationTargetException

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

    at java.lang.Thread.run(Thread.java:745)

Caused by: java.lang.NullPointerException

    at java.beans.Introspector.getPublicDeclaredMethods(Introspector.java:1337)

    at java.beans.Introspector.getTargetMethodInfo(Introspector.java:1197)

    at java.beans.Introspector.getBeanInfo(Introspector.java:426)

    at java.beans.Introspector.getBeanInfo(Introspector.java:173)

    at grails.plugins.rendering.document.RenderEnvironment.init(RenderEnvironment.groovy:31)

答案 3 :(得分:0)

巧合的是,昨天我遇到了同样的问题,但有些不同。我必须在新选项卡中从Grails表单加载PDF,使用POST方法访问根据某些变量生成PDF的PHP脚本。

无论如何,我建议你检查你的标题。例如,如果获得二进制文件,则必须定义标头。所以,我们有例如:

控制器/操作:

    def generatesReport = {
        def url = StaticContextService.app.config.grailsPath.urlLocalServer,
        path = 'some/url/which/generates/this.pdf',         
        parameters = /* defining parameters bla bla bla */

        def bytes = SendHttpService.getYourBinaryHere(url, path, parameters)

        /* HERE IS MY ANSWER, properly */
        response.setContentType('application/pdf')
        response.setContentLength(bytes.length)
        response.setHeader('Content-Disposition', 'inline; filename="yourPdfFile.pdf"')
        ServletOutputStream outputStream = response.getOutputStream()
        outputStream.write(bytes,0,bytes.length)
        outputStream.flush()
        outputStream.close()        
    } // end method

有多种方法可以定义标题,因此您需要验证哪种设置更适合您的需求(:

不要忘记为依赖项添加必要的库。干杯!