最近遇到一个问题,java接口返回一个pdf文件,浏览器直接预览,但是预览时显示的文件名称不是在响应头中设置的filename值。

一、问题

未改动代码 测试Controller:

 @RequestMapping("preview")public void preview(HttpServletResponse response) {try {byte[] pdfByte = getTestFile(); //从本地读取一个pdf文件做测试String pdfName = "自定义PDF标题";response.reset();response.setContentType("application/pdf;charset=UTF-8");response.setHeader("Content-Disposition", "inline;filename=" + URLEncoder.encode(pdfName, "UTF-8"));//这里的名字并不起作用OutputStream out = response.getOutputStream();out.write(pdfByte);out.close();} catch (Exception e) {e.printStackTrace();}}

我这里使用了用chrome浏览器测试,这时自定义的标题并不会被显示,显示为请求名称,或者文件名字(这个文件名字与我们在本地磁盘上看到的文件名不一定相同)

二、原因

pdf文件用编辑器打开,可以查看文档属性,我这里用了wps。

对比可以看出,文档属性中的这个标题属性才是被浏览器显示的标题,这个属性为空就会显示为请求名。并且这个标题属性跟磁盘上看到的文件名没有关系。所以想修改预览时的文件名,应该是更改这个属性才可以。

三、解决

有个这个方向,我搜索了一些方法,成功了一个,就是利用pdfbox这个工具,可能还有其他的好方法,暂时没有想到。

一、首先引入工具jar的maven依赖

<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.19</version>
</dependency>

二、修改代码

@RequestMapping("preview")public void preview(HttpServletResponse response) {try {byte[] pdfByte = getTestFile(); //从本地读取一个pdf文件做测试String pdfName = "自定义PDF标题";response.reset();response.setContentType("application/pdf;charset=UTF-8");response.setHeader("Content-Disposition", "inline;filename=" + URLEncoder.encode(pdfName, "UTF-8"));//这里的名字并不起作用OutputStream out = response.getOutputStream();PDDocument document = PDDocument.load(pdfByte); //加载pdfPDDocumentInformation info = document.getDocumentInformation(); //获得文档属性对象info.setTitle(pdfName); //修改标题属性  这个标题会被展示document.setDocumentInformation(info);document.save(out); //修改完直接输出到响应体中document.close();out.close();} catch (Exception e) {e.printStackTrace();}}

对比原来的代码,就是在文件流写入响应体之前,经过一下pdfbox,修改标题属性,然后pdfbox的save方法可以直接写入到响应体中。

再次测试:

可以看到自定义标题已经生效了。问题解决~

java接口返回pdf时修改文件名称问题相关推荐

  1. 【JAVA工具类】批量修改文件名称修改成特定名称

    网上下载一些电子书可是这些电子书总是含有网址,太长看起来不好看,使用JAVA代码批量修改下  /********************************************* 系统名称: ...

  2. xpdf读取pdf文件并根据pdf内容修改文件名称

    0:前言 今天一哥们说他苦逼,导师逼他看文档,全是pdf,而且还是英文的,而且非常多,1000多个,我了个shit,更搞的是文档名字不是标题名,是编号,什么5026a001.pdf,都是这种 然后我说 ...

  3. 安卓上传文件时修改文件名称_使用mmv命令批量修改文件名称

    在 Linux 中使用 mv 命令可以重命名或者移动文件及目录,但是它不支持一次重命名多个文件.本文介绍mmv的使用方式,使用通配符模式移动/复制/追加/链接多个文件 环境 Centos7.7 安装m ...

  4. java修改file的名字_File类——JAVA实现批量修改文件名称

    最近做了一道题目如下 批量修改文件名称 假设你某天跟朋友出去玩,使用某数码相机拍摄了一些照片 但是当你回来的时候你发现所有的照片都是如下命名的 P1020335.JPG P1020336.JPG P1 ...

  5. JAVA 实现返回PDF文件流并进行下载

    JAVA 实现返回PDF文件流并进行下载 首先确保本地存放pdf 保证通过路径可以拿到文件 我这边把pdf放在e盘下的目录 1.前台方法 原生ajax 发送请求返回文件流进行下载 function d ...

  6. Java批量修改文件名称(十四)

    古语有云: 万恶淫为首,百善孝为先. 我们后辈当自勉. 上一章简单介绍了Properties 类的详细使用(十三),如果没有看过,请观看上一章 一.批量修改文件名称 在生活和工作中,常常会遇到批量修改 ...

  7. 怎样把服务器的文件改名字,linux服务器如何修改文件名称rm命令删除文件时排除特定文件...

    grep -i richard telnos 在文件telnos中检索字符串richard,不顾字母的大小写. grep '[0-9]*' chapter1 由于[0-9]*与空字符串匹配,上述命令打 ...

  8. 利用Python按数字顺序批量修改文件名称

    为了按顺序修改文件名称,采用对[文件名称列表]进行排序的方法. 要对列表进行排序,这里使用列表的sort()方法.这个方法会在不创建新的列表的情况下直接对列表进行排序. 逆序排列:sort(rever ...

  9. 怎么批量改计算机名字,批量修改文件名,教您如何批量修改文件名称

    现在使用电脑.智能手机,无非是为了多快好省的帮助我们完成各种"任务",加快效率.就拿文件批量重命名来说吧,现在个人电脑文件是越来越多的,对文件名进行统一规范的修改例如批量更改文件名 ...

最新文章

  1. 利用BeanUtils在对象间复制属性
  2. idea maven项目下载源码及关联源码
  3. statistics_level参数的介绍
  4. 【theano-windows】学习笔记十八——混合蒙特卡洛采样
  5. 两个摄像头合成一路_教你把一个摄像机添加到两台录像机
  6. python-turtle库-01
  7. 13 个开源备份解决方案
  8. python matplot绘图legend_Python matplotlib绘图基本元素
  9. python中while的特点_Python【2】:初入python 用户输入,if,(while 循环)
  10. pre-commit钩子,代码质量检查
  11. ImportError: No module named MySQLdb
  12. linux命令ftps,Linux下ftp+ssl实现ftps
  13. HDFS原理(超详解)
  14. 华为设备静态路由配置命令
  15. 《2019年中国互联网网络安全报告》发布,恶意程序攻击半数来自美国
  16. Office - 0x4004F00C解决方法
  17. Python——枚举(enum)
  18. delphi xe7 EMS是什么 什么作用,怎么使用?
  19. 邮件服务器DNS设置-----MX、SPF、DKIM记录详解
  20. 手机有时触摸失灵解决方法

热门文章

  1. 信创终端之Linux桌面系统:原生桌面 vs 定制魔改
  2. 区县公安合成作战中心调研:(一)引言
  3. android java加密_Android、iOS和Java通用的AES128加密解密示例代码
  4. 01 hbuilder账号的注册
  5. 每天可以一看的哲理句子
  6. 二维码和条形码简单实现
  7. JAVA POI 读取2017Excel
  8. Excel如何设置下拉列表
  9. 带哨兵的冒泡排序_冒泡排序(Bubble Sort)
  10. 【网络】Padavan固件获取运营商ipv6设置