Spring控制器在浏览器中将PDF显示为字节

时间:2015-09-23 06:39:28

标签: spring spring-mvc pdf

我想在浏览器中显示PDF。我正在使用下面的代码来完成它。

call first.bat&&call second.bat

我发现,即使在上面的代码中将标题内容类型设置为application / pdf之后,我的实时http标头也会将内容显示为text / html

输出在浏览器中显示如下:

Output in browser

但下面的代码会在浏览器中显示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;
    }

这两个代码之间有什么区别?

3 个答案:

答案 0 :(得分:0)

相同的代码对我有用。如果不同的浏览器测试它。

您是否在实施中有任何可能正在使用响应标头的过滤器。你也可以共享日志文件。

答案 1 :(得分:0)

  1. 将PDF作为mime类型添加到您的服务器。
  2. 不是内联,请尝试附件。
  3. 我不熟悉API,但不会这样做: headers.setContentType( “应用/ PDF”);

答案 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('');
},

此解决方法适用于我,我希望此代码可以帮助您。

再见!