直接看问题直接看问题
解决思路
看了一下一个有问题的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);}}