Java預覽PDF時的文件名稱問題及解決
Java預覽PDF時的文件名稱
問題場景
今天在做新項目的時候,測試提交過來一個bug:在谷歌瀏覽器上預覽一些客戶上傳的pdf文件時,發(fā)現(xiàn)瀏覽器的標簽上展示的要么不是我們看到的文件名,要么就直接是方法名,看起來不太合適,讓我想想辦法優(yōu)化優(yōu)化。
剛開始看到這個問題的時候確實很頭疼,因為之前嘗試過去解決這個問題,但是當時因為一些其他的原因,沒有仔細的去思考這些個問題,這會做新項目剛好有時間去琢磨一下這個問題,
解決思路
看了一下一個有問題的PDF文件之后發(fā)現(xiàn)文件的名稱和文件的屬性名其實不一致,瀏覽器默認展示的是文件的屬性名,而不是我們看到的文件名稱
這也就讓我定位到了問題的所在,出現(xiàn)這個bug的原因就是PDF文件的屬性名稱與文件名稱不一致,
定位到問題之后就很好解決了
解決方案
從pdfbox的 官網文檔 我們可以看到有一個靜態(tài)方法專門用于將輸入流解析為PDF文檔,我們就是用這個方法來進行操作
接下來看代碼
/** * 預覽PDF文件 * * @param filePath * @param originFileName * @return void * @author ss.xin * @date 2021/2/5 9:27 */ private void viewPdfFile(String filePath, String originFileName) { File file = new File(filePath); try (OutputStream outputStream = response.getOutputStream(); //加載pdf附件到PDF流中 PDDocument document = PDDocument.load(new FileInputStream(file))) { response.setCharacterEncoding(Constant.UTF8); String showName = StringUtils.isNotBlank(originFileName) ? originFileName : file.getName(); showName = URLEncoder.encode(showName, Constant.UTF8); response.setHeader("Content-Disposition", "inline;fileName=" + showName + ";fileName*=UTF-8''" + showName); //從PDF流中獲得PDF文檔屬性對象 PDDocumentInformation info = document.getDocumentInformation(); //設置PDF文檔屬性對象的文件名稱(最重要的環(huán)節(jié)) info.setTitle(StringUtils.isNotBlank(originFileName) ? originFileName : file.getName()); document.setDocumentInformation(info); //修改完直接輸出到響應體中 document.save(outputStream); } catch (Exception e) { log.error(this.getClass().getName() + ".viewPdfFile:", e); } }
設置完成之后,我們就可以看到在瀏覽器的頁簽上文件的名稱已經正常了
至此,就達到了我們整個想要的一個效果。
預覽pdf時中文亂碼
項目在預覽pdf時,中文亂碼。
處理方式:
第一步
首先檢查是否設置了 request.setCharacterEncoding(“UTF-8”);
和
response.setContentType(“application/pdf; charset=UTF-8”);
第二步
如果部署在win上沒有亂碼,部署在linux上有亂碼,可能是在linux上面可能沒有對應的字體,拷貝字體上去(我這個版本的字體不用安裝),指定路徑即可 FontSettings.setFontsFolder("/usr/share/fonts/", true);
如果有使用liberoffice,使用下面的方式:
liberoffice默認讀取的時這個路徑下的字體/usr/share/fonts,把字體拷貝導這個路徑下面,chmod 777 * 進行授權,然后sudo fc-cache -fv刷新緩存,重啟系統(tǒng)
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
理解Java注解及Spring的@Autowired是如何實現(xiàn)的
今天通過本文帶領大家學習注解的基礎知識,學習Spring的@Autowired是怎么實現(xiàn)的,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-07-07java操作mongodb時,對象bean和DBObject相互轉換的方法(推薦)
下面小編就為大家?guī)硪黄猨ava操作mongodb時,對象bean和DBObject相互轉換的方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11Seata集成Mybatis-Plus解決多數(shù)據(jù)源事務問題
當進行業(yè)務操作時,訂單發(fā)生異常 ,進行了回滾操作,因為在不同的數(shù)據(jù)庫實例中,余額卻扣除成功,此時發(fā)現(xiàn)數(shù)據(jù)不一致問題,本文給大家介紹Seata集成Mybatis-Plus解決多數(shù)據(jù)源事務問題,感興趣的朋友一起看看吧2023-11-11