Java Grails从RESTWebService端点下载pdf文件
我正在尝试编写一个调用REST端点的功能,它将返回一个REST响应,内容类型为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
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()