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