java接口返回pdf时修改文件名称问题
最近遇到一个问题,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时修改文件名称问题相关推荐
- 【JAVA工具类】批量修改文件名称修改成特定名称
网上下载一些电子书可是这些电子书总是含有网址,太长看起来不好看,使用JAVA代码批量修改下 /********************************************* 系统名称: ...
- xpdf读取pdf文件并根据pdf内容修改文件名称
0:前言 今天一哥们说他苦逼,导师逼他看文档,全是pdf,而且还是英文的,而且非常多,1000多个,我了个shit,更搞的是文档名字不是标题名,是编号,什么5026a001.pdf,都是这种 然后我说 ...
- 安卓上传文件时修改文件名称_使用mmv命令批量修改文件名称
在 Linux 中使用 mv 命令可以重命名或者移动文件及目录,但是它不支持一次重命名多个文件.本文介绍mmv的使用方式,使用通配符模式移动/复制/追加/链接多个文件 环境 Centos7.7 安装m ...
- java修改file的名字_File类——JAVA实现批量修改文件名称
最近做了一道题目如下 批量修改文件名称 假设你某天跟朋友出去玩,使用某数码相机拍摄了一些照片 但是当你回来的时候你发现所有的照片都是如下命名的 P1020335.JPG P1020336.JPG P1 ...
- JAVA 实现返回PDF文件流并进行下载
JAVA 实现返回PDF文件流并进行下载 首先确保本地存放pdf 保证通过路径可以拿到文件 我这边把pdf放在e盘下的目录 1.前台方法 原生ajax 发送请求返回文件流进行下载 function d ...
- Java批量修改文件名称(十四)
古语有云: 万恶淫为首,百善孝为先. 我们后辈当自勉. 上一章简单介绍了Properties 类的详细使用(十三),如果没有看过,请观看上一章 一.批量修改文件名称 在生活和工作中,常常会遇到批量修改 ...
- 怎样把服务器的文件改名字,linux服务器如何修改文件名称rm命令删除文件时排除特定文件...
grep -i richard telnos 在文件telnos中检索字符串richard,不顾字母的大小写. grep '[0-9]*' chapter1 由于[0-9]*与空字符串匹配,上述命令打 ...
- 利用Python按数字顺序批量修改文件名称
为了按顺序修改文件名称,采用对[文件名称列表]进行排序的方法. 要对列表进行排序,这里使用列表的sort()方法.这个方法会在不创建新的列表的情况下直接对列表进行排序. 逆序排列:sort(rever ...
- 怎么批量改计算机名字,批量修改文件名,教您如何批量修改文件名称
现在使用电脑.智能手机,无非是为了多快好省的帮助我们完成各种"任务",加快效率.就拿文件批量重命名来说吧,现在个人电脑文件是越来越多的,对文件名进行统一规范的修改例如批量更改文件名 ...
最新文章
- 利用BeanUtils在对象间复制属性
- idea maven项目下载源码及关联源码
- statistics_level参数的介绍
- 【theano-windows】学习笔记十八——混合蒙特卡洛采样
- 两个摄像头合成一路_教你把一个摄像机添加到两台录像机
- python-turtle库-01
- 13 个开源备份解决方案
- python matplot绘图legend_Python matplotlib绘图基本元素
- python中while的特点_Python【2】:初入python 用户输入,if,(while 循环)
- pre-commit钩子,代码质量检查
- ImportError: No module named MySQLdb
- linux命令ftps,Linux下ftp+ssl实现ftps
- HDFS原理(超详解)
- 华为设备静态路由配置命令
- 《2019年中国互联网网络安全报告》发布,恶意程序攻击半数来自美国
- Office - 0x4004F00C解决方法
- Python——枚举(enum)
- delphi xe7 EMS是什么 什么作用,怎么使用?
- 邮件服务器DNS设置-----MX、SPF、DKIM记录详解
- 手机有时触摸失灵解决方法