Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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
Spring 为什么使用iTextPDF编辑的PDF在Web Servlet上下文中损坏?_Spring_Spring Mvc_Pdf_Itextpdf - Fatal编程技术网

Spring 为什么使用iTextPDF编辑的PDF在Web Servlet上下文中损坏?

Spring 为什么使用iTextPDF编辑的PDF在Web Servlet上下文中损坏?,spring,spring-mvc,pdf,itextpdf,Spring,Spring Mvc,Pdf,Itextpdf,我在WEB上下文应用程序中使用iTextPdf时遇到问题 我有一个web servlet,在运行时编辑PDF后,它可以下载PDF 如果调用在非WEB上下文应用程序中准备PDF的方法,PDF创建得非常完美,打开时不会出现任何问题 但是在WEB上下文应用程序中创建了该文件,但当我从测试页下载时,该文件已损坏:当我打开下载的文件时,该文件没有图像,并显示一条关于找不到字体的错误消息 如果我用文本编辑器打开“干净”文件和“损坏”文件,它们的行数相同,但实际上内容看起来不同 因此,我怀疑问题在于web响应

我在WEB上下文应用程序中使用iTextPdf时遇到问题

我有一个web servlet,在运行时编辑PDF后,它可以下载PDF

如果调用在非WEB上下文应用程序中准备PDF的方法PDF创建得非常完美,打开时不会出现任何问题

但是在WEB上下文应用程序中创建了该文件,但当我从测试页下载时,该文件已损坏:当我打开下载的文件时,该文件没有图像,并显示一条关于找不到字体的错误消息

如果我用文本编辑器打开“干净”文件和“损坏”文件,它们的行数相同,但实际上内容看起来不同

因此,我怀疑问题在于web响应中内容类型的呈现,或者类似的问题

我遵循了以下文件:

这是Spring MVC控制器的实现:

@RequestMapping(path = "/downloadPDF", method = RequestMethod.GET)
public void downloadPDF(HttpServletResponse response){
    try{
        response.setContentType("application/pdf;charset=UTF-8");       
        ByteArrayOutputStream baos = myPDFHandler.getPdf('filetest.pdf');
        OutputStream outputStream = response.getOutputStream();
        baos.writeTo(outputStream);
        outputStream.flush();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
以下是响应标题:

Response Headers

view source
Cache-Control:no-store
Cache-Control:no-cache
Content-Type:application/pdf;charset=UTF-8
Date:Tue, 24 May 2016 10:20:56 GMT
Expires:Thu, 01 Jan 1970 00:00:00 GMT
Pragma:no-cache
Server:Apache-Coyote/1.1
Strict-Transport-Security:max-age=31536000 ; includeSubDomains
Transfer-Encoding:chunked
X-Content-Type-Options:nosniff
X-Frame-Options:DENY
X-XSS-Protection:1; mode=block
问题不在“myPDFHandler.getPdf”方法中,因为在非WEB上下文中,它可以完美地工作

有什么想法吗?
谢谢。

我找到了解决办法

问题是
@Controller
的返回类型,将
void
更改为
@ResponseBody byte[]

我还删除了“charset=UTF-8”,并添加了标题“contentdisposition”


是否确定该文件是
UTF-8
编码的?我尝试使用charset=UTF-8,但结果是一样的。当我在非网络环境中尝试时,我不需要指定它…
charset=UTF-8
在那里是错误的。也就是说,你能在浏览器收到PDF文件后和服务器上存储PDF文件后共享它吗?@Alessandro尝试使用返回类型
ResponseEntity
。您可以使用构造函数指定相关的响应详细信息(名为body的参数的类型为
byte[]
)@Bond感谢您的建议。我已经尝试过了,但问题是我有一个Angular Spring数据Rest应用程序,它希望返回一个JSON,而不是一个字节数组。。。
@RequestMapping(path = "/downloadPDF", method = RequestMethod.GET)
public @ResponseBody byte[] downloadPDF(HttpServletResponse response){
    try{
        response.setContentType("application/pdf"); 
        response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=somefile.pdf");     
        ByteArrayOutputStream baos = myPDFHandler.getPdf('filetest.pdf');
        return baos.toByteArray();
    } catch (Exception e) {
        e.printStackTrace();
    }
}