我想在浏览器中显示PDF。我正在使用下面的代码来完成它。
call first.bat&&call second.bat
我发现,即使在上面的代码中将标题内容类型设置为application / pdf之后,我的实时http标头也会将内容显示为text / html
输出在浏览器中显示如下:
但下面的代码会在浏览器中显示PDF。
@Controller
@RequestMapping("/test.pdf")
public class DisplayPDF {
@RequestMapping(method = {RequestMethod.GET})
@ResponseBody
public ResponseEntity<byte[]> start() throws Exception {
FileInputStream fi = new FileInputStream(new File("/tmp/test.pdf"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int c;
while ((c = fi.read()) != -1) {
baos.write(c);
}
fi.close();
byte[] pdf = baos.toByteArray();
baos.close();
HttpHeaders headers = new HttpHeaders();
headers.setContentLength(pdf.length);
headers.setContentType(MediaType.parseMediaType("application/pdf"));
headers.set("Content-Disposition", "inline; filename=test.pdf");
headers.setCacheControl("must-revalidate, post-check=0, pre-check=0");
ResponseEntity<byte[]> responseE = new ResponseEntity<byte[]>(pdf, headers, HttpStatus.OK);
return responseE;
}
这两个代码之间有什么区别?
答案 0 :(得分:0)
相同的代码对我有用。如果不同的浏览器测试它。
您是否在实施中有任何可能正在使用响应标头的过滤器。你也可以共享日志文件。
答案 1 :(得分:0)
答案 2 :(得分:0)
也许为时已晚,但我会给你我的想法因为我几天前遇到了类似的问题:
在您的客户端(在我的情况下是一个JavaScript应用程序,我有类似的东西)
var data = this.toBinaryString(response.responseText);
// Here is the pdf content
data = "data:application/pdf;base64,"+btoa(data);
// Transforming binary data to string
toBinaryString: function(data) {
var ret = [];
var len = data.length;
var byte;
for (var i = 0; i < len; i++) {
byte=( data.charCodeAt(i) & 0xFF )>>> 0;
ret.push(String.fromCharCode(byte) );
}
return ret.join('');
},
此解决方法适用于我,我希望此代码可以帮助您。
再见!