Spring 为什么使用iTextPDF编辑的PDF在Web Servlet上下文中损坏?
我在WEB上下文应用程序中使用iTextPdf时遇到问题 我有一个web servlet,在运行时编辑PDF后,它可以下载PDF 如果调用在非WEB上下文应用程序中准备PDF的方法,PDF创建得非常完美,打开时不会出现任何问题 但是在WEB上下文应用程序中创建了该文件,但当我从测试页下载时,该文件已损坏:当我打开下载的文件时,该文件没有图像,并显示一条关于找不到字体的错误消息 如果我用文本编辑器打开“干净”文件和“损坏”文件,它们的行数相同,但实际上内容看起来不同 因此,我怀疑问题在于web响应中内容类型的呈现,或者类似的问题 我遵循了以下文件: 这是Spring MVC控制器的实现: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响应
@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();
}
}