您现在的位置是:首页 > 技术教程 正文

Java后端返回PDF预览给前端

admin 阅读: 2024-03-28
后台-插件-广告管理-内容页头部广告(手机)

前端要预览服务器PDF 可直接将要blob流返回给前端 即可用浏览器自带pdf预览功能打开,现有两种方式

方式1 返回blob流给前端 代码如下       

  1. @PostMapping(value = "/preview")
  2. @ResponseBody
  3. public void showPdf(HttpServletResponse response) {
  4. try {
  5. File file = new File("filePath");
  6. OutputStream out = null;
  7. try (BufferedInputStream br = new BufferedInputStream(new FileInputStream(file));
  8. ) {
  9. byte[] bs = new byte[1024];
  10. int len;
  11. response.reset(); // 非常重要
  12. URL u = new URL("file:///" + "filePath");
  13. String contentType = u.openConnection().getContentType();
  14. response.setContentType(contentType);
  15. response.setHeader("Content-Disposition", "inline;filename="
  16. + "preview.pdf");
  17. out = response.getOutputStream();
  18. while ((len = br.read(bs)) > 0) {
  19. out.write(bs, 0, len);
  20. }
  21. out.flush();
  22. out.close();
  23. }
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. }
  27. }

此时 前端解析可直接拿返回的文件流 例子如下

  1. let blob = this.response;
  2. const binaryData = [];
  3. binaryData.push(blob);
  4. const url = window.URL.createObjectURL(new Blob(binaryData, { type: 'application/pdf' }));
  5. window.open(url);

但有的时候 不想返回文件流 可把文件返回为base64 (注意 base64可能超长)此时代码修改如下

  1. File file = new File("filePath");
  2. OutputStream out = null;
  3. try (BufferedInputStream br = new BufferedInputStream(new FileInputStream(file));
  4. ByteArrayOutputStream outStream = new ByteArrayOutputStream();
  5. ) {
  6. int len;
  7. URL u = new URL("file:///" + "filePath");
  8. String contentType = u.openConnection().getContentType();
  9. byte[] buffer = new byte[1024];
  10. //每次读取的字符串长度,如果为-1,代表全部读取完毕
  11. //使用输入流从buffer里把数据读取出来
  12. while ((len = br.read(buffer)) != -1) {
  13. //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
  14. outStream.write(buffer, 0, len);
  15. }
  16. // 对字节数组Base64编码
  17. Base64Encoder base64 = new Base64Encoder();
  18. String base64Str = replaceEnter(base64.encode(outStream.toByteArray()));
  19. }
  20. } catch (Exception e) {
  21. }

前端修改如下

  1. let base64 = resBase64.data.base64;
  2. base64 = base64.replace(/[\n\r]/g, '')
  3. const raw = window.atob(base64)
  4. const rawLength = raw.length
  5. const uInt8Array = new Uint8Array(rawLength)
  6. for (let i = 0; i < rawLength; ++i) {
  7. uInt8Array[i] = raw.charCodeAt(i)
  8. }
  9. const url = window.URL.createObjectURL(new Blob([uInt8Array], { type: resBase64.data.contentType }));
  10. window.open(url);

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索