当前位置: 首页 > 知识库问答 >
问题:

Grails将HttpInputStream渲染为pdf

宣原
2023-03-14

使用以下代码,我得到了这样的坏输出:

%PDF-1.4%���� 4.0目标

而不是pdf。代码如下:

URL url = new URL(urlStr)
URLConnection connection = url.openConnection();
response.contentType = 'application/pdf'
response.setHeader("Content-Disposition","Attachment; filename=gdoc.pdf")
def bytes = connection.getInputStream().getBytes()
response.getOutputStream().write(bytes)
response.outputStream.flush()
response.outputStream.close()

/*
  //writing to a pdf file works perfectly
  def outputStream =  new FileOutputStream(new File("gdoc/abc.pdf"));
  outputStream.write(bytes)
  outputStream.close()
*/

如何在浏览器中获取实际的pdf输出。

共有3个答案

公羊涛
2023-03-14

我通过执行以下代码解决了问题:

控制器:

    def bytes = SendHttpService.executeGetBinary("http://app.com",  
                                                  "/pdf/", params)
    response.setHeader("Expires", "0");
    response.setHeader("Cache-Control","must-revalidate, post-check=0, pre-check=0");
    response.setHeader("Pragma", "public");
    response.setHeader("Content-Disposition", "inline; filename=\"relatorioGerencial.pdf\"");
    response.setContentType("application/pdf");
    response.setContentLength(bytes.length);
    ServletOutputStream ouputStream = response.getOutputStream();
    ouputStream.write(bytes,0,bytes.length);
    ouputStream.flush();
    ouputStream.close();

这里,像第一个示例一样发送请求以返回流,注意contentType是二进制的

    def executePostBinary = { String httpUrl, String dataBody, String path, query = null, method = Method.POST->

    def http = new HTTPBuilder()
    try{
        http.request( httpUrl , method , ContentType.BINARY ) { req ->

            uri.path = path
            uri.query = trataQuery(query)
            headers.'User-Agent' = "Mozilla/5.0 Firefox/3.0.4"
            headers.Accept = ContentType.BINARY
            if(method==groovyx.net.http.Method.POST && dataBody!=null){
                body = dataBody
            }

            response.success = { resp, inputStream  ->
                inputStream.bytes

            }

            response.'404' = {
                'Not found'
            }
        }
    }catch(HttpResponseException e){
        println "Error "+e
        println "Error Code "+e.statusCode
        return false
    }
}
拓拔辰钊
2023-03-14

这假设您在控制器中,控制器方法末尾的返回null确保Grails不会尝试渲染任何内容。此外,使用Apache commons复制内容可以避免在响应中发送之前将整个文件下载到内存中。这是根据生产代码修改的,我在生产代码中做了一些非常类似的事情。Grails版本1.3.7和2.0.4。

URL url = new URL(urlStr)

response.setContentType("application/pdf")
response.setHeader("Content-disposition", "attachment;filename=gdoc.pdf")

// this will actually buffer/stream the file in 8k chunks instead of reading the entire file into memory.
org.apache.commons.io.IOUtils.copy(url.openStream(), response.outputStream)
response.outputStream.flush()
response.outputStream.close()

// make sure Grails doesn't render anything for the request.
return null
施茂
2023-03-14

您是否在iframe中尝试响应?如果是这样,首先尝试直接在新窗口中打开输出,看看它是否打开。

如果它打开,尝试将您的控制器映射到类似abc.pdf的东西,以便您指向的url成为 /something/abc.pdf.

 类似资料:
  • 我刚刚安装了grails渲染插件,并想使用它来生成PDF文件。我创建了简单的模板,但此插件不渲染检查输入元素。当我将输入写为以下内容时: 我收到以下错误消息: 当我添加结束标记时,如下所示: 我在PDF中没有任何检查元素。我不是说,我想要在交互模式下进行检查,但是,我想要一个看起来像复选框的图像

  • 问题内容: 我刚刚安装了grails渲染插件,并希望将其用于生成PDF文件。我已经创建了简单的模板,但是没有任何CSS样式即可将其导出。如果仅从grails渲染模板,则页面将在Web浏览器中显示所有样式。 所以,我的问题是-在PDF生成过程中如何正确包含CSS文件? 我的模板: 而且我的webui.css中具有样式.odd,但是它不适用于该行。 任何帮助,将不胜感激。 Edit1:我发现以以下方式

  • 问题内容: 有没有一种方法可以将html渲染为PNG图片?我知道画布是可能的,但我想呈现例如div之类的标准html元素。 问题答案: 我知道这是一个很老的问题,已经有了很多答案,但是我仍然花了几个小时来尝试做自己想做的事情: 给定一个html文件,从命令行生成具有 透明 背景的(png)图像 使用无头的Chrome(此响应的版本为74.0.3729.157),实际上很容易: 命令说明: 您可以从

  • 问题内容: 今天遇到了这个奇怪的结果,试图在Grails 2.0.4中将对象列表呈现为JSON …(我知道我会后悔由于我鼻子底下的东西而问这个问题…… 已更新 5/26,我的预测是正确的,请参见下文:-)) 这很好用;JSON在浏览器中正确呈现… ..so为什么缩短的版本没有工作? 上面代码生成的JSON作为单行文本输出,因此我怀疑它没有被拾取,但是正确地加上了括号,这是怎么回事? [‘produ

  • 我正在尝试使用渲染插件将html文件渲染为pdf,我的控制器方法是, 和我的下载。gsp文件为, 我在BuildConfig中添加了以下依赖项。groovy文件 我收到以下堆栈跟踪, 注意:相同的代码库适用于grails 2.2.4版本,这个问题只在grails 2.5.0版本中出现

  • 问题内容: 对于我的django网站,我正在寻找一种将动态html页面转换为pdf的简单解决方案。 页面包含HTML和来自Google可视化API的图表(该图表基于javascript,但必须包含这些图表)。 问题答案: 尝试从Reportlab解决方案。 下载并像往常一样使用python setup.py install安装 你还需要安装以下模块:具有easy_install的xhtml2pdf