Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Grails从RESTWebService端点下载pdf文件_Java_Pdf_Grails - Fatal编程技术网

Java Grails从RESTWebService端点下载pdf文件

Java Grails从RESTWebService端点下载pdf文件,java,pdf,grails,Java,Pdf,Grails,我正在尝试编写一个调用REST端点的功能,它将返回一个REST响应,内容类型为content-type:application/pdf,如下所示: %PDF-1.4 %���� 4304 0 obj 4330 0 obj 流 h�bb�����������؀���内容提供商�a\h�B�Q���K��F���X���%�我现在看不出有什么关键性的区别,但这对我来说很有效 def generatePdf(){ ByteArrayOutputStream docStream = /*call

我正在尝试编写一个调用REST端点的功能,它将返回一个REST响应,内容类型为
content-type:application/pdf
,如下所示:

%PDF-1.4
%����
4304 0 obj

4330 0 obj

h�bb�����������؀���内容提供商�a\h�B�Q���K��F���X���%�我现在看不出有什么关键性的区别,但这对我来说很有效

def generatePdf(){
    ByteArrayOutputStream docStream = /*call that generates pdf data*/
    response.setHeader(HttpHeaders.CONTENT_DISPOSITION, 'inline; filename=print.pdf')
    response.setContentType('applicaton/pdf')
    response.contentLength = docStream.size()
    response.outputStream << docStream.toByteArray()
}
def generatePdf(){
ByteArrayOutputStream docStream=/*生成pdf数据的调用*/
response.setHeader(HttpHeaders.CONTENT\u处置,'inline;filename=print.pdf')
response.setContentType('applicaton/pdf')
response.contentLength=docStream.size()

response.outputStream这是调整后的代码..但我仍然得到相同的结果

def generatePDF(){

 String body = documentContents.responseEntity.body
 ByteArrayOutputStream docStream = new ByteArrayOutputStream() 
 docStream.write(body.bytes) /* Write bytes into byte array*/
 response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=test.pdf")
 response.setContentType("application/pdf")
 response.setCharacterEncoding("UTF-8")
 response.contentLength = docStream.size()
 response.outputStream << docStream.toByteArray()
 response.outputStream.flush()
 response.outputStream.close()
}
def generatePDF(){
字符串正文=documentContents.responseEntity.body
ByteArrayOutputStream docStream=新建ByteArrayOutputStream()
docStream.write(body.bytes)/*将字节写入字节数组*/
response.setHeader(HttpHeaders.CONTENT\u处置,“附件;文件名=test.pdf”)
response.setContentType(“application/pdf”)
响应。setCharacterEncoding(“UTF-8”)
response.contentLength=docStream.size()
response.outputStream您也可以使用

// assuming you have already retrieved the file 
// you can also use new File(path) instead of data
render(file: data, fileName: "fileName.pdf", contentType: "application/pdf")

仅供参考:这适用于Grails 3.x。它没有在旧版本中进行测试。

使用提供PDF文件字节流的REST服务,您可以基于inputstream进行接收,因此您可以利用强大的Apache IOUtils库。 请参见下面的控制器代码(在GRAILS3上测试):


PDF内容来自哪里?看看这个问题,你可能会知道:PDF内容来自其中一台服务器中的web服务端点。我检查了后端的代码,它似乎也不是base64编码的。它只是发送字节。据我所知,响应的编码是UTF-8,它是不是base_64编码。但是,当我卷曲文件时,它工作正常。我不确定卷曲在转换方面对文件的实际作用。忘记了a)在filename=test.pdf之后“实际上,我将该文件下载到本地驱动器,并尝试通过Grails将该文件流式传输到网站,这显示了PDF文件的全部内容。这让我认为这实际上可能是一个编码问题,即使在响应中,编码是UTF-8,在响应头中我也将其设置为UTF-8。
// assuming you have already retrieved the file 
// you can also use new File(path) instead of data
render(file: data, fileName: "fileName.pdf", contentType: "application/pdf")
import org.apache.commons.io.IOUtils

def content=urlrestservicestring.toURL().getBytes()
if (!content) throw new Exception("Pdf not available")
def docStream   = new ByteArrayInputStream(content)
response.setHeader("Content-disposition", "inline; filename=thenameyouwant.pdf")
response.setContentType('multipart/form-data')
IOUtils.copy(docStream,response.outputStream)
response.outputStream.flush()
response.outputStream.close()