Java预览PDF时的文件名称问题

news/2024/9/20 8:56:22/文章来源:https://www.cnblogs.com/lcaiqin/p/18371758

 直接看问题直接看问题

解决思路

看了一下一个有问题的PDF文件之后发现文件的名称和文件的属性名其实不一致,浏览器默认展示的是文件的属性名,而不是我们看到的文件名称

这也就让我定位到了问题的所在,出现这个bug的原因就是PDF文件的属性名称与文件名称不一致
定位到问题之后就很好解决了

解决方案

从pdfbox的官网我们可以看到有一个静态方法专门用于将输入流解析为PDF文档,我们就是用这个方法来进行操作

代码

/*** 预览PDF文件** @param filePath* @param originFileName* @return void* @author ss.xin* @date 2021/2/5 9:27*/@GetMapping("/filePdf")private void viewPdfFile(HttpServletResponse response, String uuid) {if (StringUtils.isBlank(uuid)) {throw new RuntimeException("请指定文件ID");}UpdateWrapper<WikiPageFile> wrapperFile = new UpdateWrapper<>();wrapperFile.eq("uuid", uuid);WikiPageFile pageFile = wikiPageFileService.getOne(wrapperFile);if (pageFile == null) {throw new RuntimeException("未找到指定文件");}File file = new File(pageFile.getFileUrl());try (OutputStream outputStream = response.getOutputStream();//加载pdf附件到PDF流中PDDocument document = PDDocument.load(new FileInputStream(file))) {String originFileName = Optional.ofNullable(pageFile.getFileName()).orElse("");response.setCharacterEncoding("UTF8");String showName = StringUtils.isNotBlank(originFileName) ? originFileName : file.getName();showName = URLEncoder.encode(showName, "UTF8");response.setHeader("Content-Disposition", "inline;fileName=" + showName + ";fileName*=UTF-8''" + showName);//从PDF流中获得PDF文档属性对象PDDocumentInformation info = document.getDocumentInformation();//设置PDF文档属性对象的文件名称(最重要的环节)info.setTitle(StringUtils.isNotBlank(originFileName) ? originFileName : file.getName());document.setDocumentInformation(info);//修改完直接输出到响应体中document.save(outputStream);} catch (Exception e) {log.error(this.getClass().getName() + ".viewPdfFile:", e);}}

 

解决

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/784865.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零到一,全面掌握Apache DolphinScheduler发版流程,实战派经验分享!

引言 Apache DolphinScheduler的发版流程对于确保软件质量和社区协作至关重要,社区Committer王兴杰为我们详细介绍了Apache DolphinScheduler的发版流程,包括环境准备、流程文档、基础工具准备、依赖包确认等关键步骤,并指出了发版流程中可能会遇到的麻烦以及相应的解决方案…

对抗训练综述学习笔记

本文基于这篇综述进行讨论学习:《Bai T, Luo J, Zhao J, et al. Recent advances in adversarial training for adversarial robustness[J]. arXiv preprint arXiv:2102.01356, 2021.》对抗训练主要目的是让模型能够对于对抗样本做出正确的判断。常见的对抗样本的生成方式(或…

Chrome谷歌浏览器报错:ERR_TOO_MANY_REDIRECTS

开发系统的时候,经常需要调用地址进行测试,容易遇到浏览器报错:该网页无法正常运作**** 将您重定向的次数过多。尝试删除您的 Cookie.ERR_TOO_MANY_REDIRECTS(如图) 解决方法: 1.删除浏览器缓存记录 2.开启无痕模式,重新浏览

KingbaseES V8R6备份恢复案例之---sys_backup.sh init无法创建stanza

KingbaseES、备份恢复案例说明: KingbaseES V8R6数据库执行物理备份初始化操作,出现以下故障“ERROR: create stanza failed, check log file...",初始化失败。 适用版本:KingbaseES V8R6 一、问题现象 如下所示,执行sys_backup.sh init,出现”ERROR: create stanza…

【Linux】grub命令行引导进入windows系统

@目录1.grub命令行界面2.设置启动目录3.chainloader加载windows启动文件4.启动5.grub命令行无响应办法在卸载Linux系统后,有的小白可能会忘记删除Linux的EFI引导。这样的话,下次开机时就会自动进入grub的命令行,连windows系统都进不去了!本文提供了使用grub命令行进入win系…

cmake openssl 生成失败

生成azerothcode的时候报错,改成1.x版本就好了,我用的1.1.1。 CMake Error at E:/Soft/CMake326/share/cmake-3.26/Modules/FindPackageHandleStandardArgs.cmake:230 (message): Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system varia…

12米空间分辨率DEM数据申请下载:TanDEM-X数据集

本文介绍全球12米与30米高空间分辨率的数字高程模型(DEM)数据——TanDEM-X数据的下载申请方法~本文介绍全球12米与30米高空间分辨率的数字高程模型(DEM)数据——TanDEM-X数据的下载申请方法。Tandem-X卫星项目于2010年6月启动,并于2010年6月21日和2010年12月21日分别发射两…

Halcon图像减操作

图像减操作,也叫图像灰度值的操作 可以得到固定位置的差异 * 区域处理read_image (car1, D:/hoclan/traffic1.png) read_image (car2, D:/hoclan/traffic2.png) *显示边缘模式 dev_set_draw (margin)*图像减操作(图像灰度值的操作) 可以得到固定位置的差异 * (Traffic1 - Traf…

Echarts 5 动态按需引入图表

官网提供的按需引入方法为全量按需引入,在打包分离中,仍旧存在使用不到的图表被打包进去。 例如:组件A使用了折线图、柱状图,组件B只用到了折线图,但是打包组件B的时候,柱状图也就被打包进去。 本文提供一种动态按需引入的思路,使得只用到折线图的组件B,打包的时候只打…

柱状图倒圆角4.9版本

series处理const stackInfo = {};for (let i = 0; i < series[0].data.length; ++i) {for (let j = 0; j < series.length; ++j) {const stackName = series[j].stack;if (!stackName) {continue;}if (!stackInfo[stackName]) {stackInfo[stackName] = {stackStart: [],s…

源码解析之为何要用ConcurrentHashMap

为什么要用ConcurrentHashMap? ConcurrentHashMap是JUC包下的一个线程安全的HashMap类,我们都知道多线程的场景下要用ConcurrentHashMap来代替HashMap使用,有没有想过为什么不能用HashMap,为什么能用ConcurrentHashMap呢?下面我通过走源码的方式,带大家看一看其中的一些细…