Java預(yù)覽PDF時的文件名稱問題及解決
Java預(yù)覽PDF時的文件名稱
問題場景
今天在做新項(xiàng)目的時候,測試提交過來一個bug:在谷歌瀏覽器上預(yù)覽一些客戶上傳的pdf文件時,發(fā)現(xiàn)瀏覽器的標(biāo)簽上展示的要么不是我們看到的文件名,要么就直接是方法名,看起來不太合適,讓我想想辦法優(yōu)化優(yōu)化。

剛開始看到這個問題的時候確實(shí)很頭疼,因?yàn)橹皣L試過去解決這個問題,但是當(dāng)時因?yàn)橐恍┢渌脑?,沒有仔細(xì)的去思考這些個問題,這會做新項(xiàng)目剛好有時間去琢磨一下這個問題,
解決思路
看了一下一個有問題的PDF文件之后發(fā)現(xiàn)文件的名稱和文件的屬性名其實(shí)不一致,瀏覽器默認(rèn)展示的是文件的屬性名,而不是我們看到的文件名稱

這也就讓我定位到了問題的所在,出現(xiàn)這個bug的原因就是PDF文件的屬性名稱與文件名稱不一致,
定位到問題之后就很好解決了
解決方案
從pdfbox的 官網(wǎng)文檔 我們可以看到有一個靜態(tài)方法專門用于將輸入流解析為PDF文檔,我們就是用這個方法來進(jìn)行操作

接下來看代碼
/**
* 預(yù)覽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();
//設(shè)置PDF文檔屬性對象的文件名稱(最重要的環(huán)節(jié))
info.setTitle(StringUtils.isNotBlank(originFileName) ? originFileName : file.getName());
document.setDocumentInformation(info);
//修改完直接輸出到響應(yīng)體中
document.save(outputStream);
} catch (Exception e) {
log.error(this.getClass().getName() + ".viewPdfFile:", e);
}
}
設(shè)置完成之后,我們就可以看到在瀏覽器的頁簽上文件的名稱已經(jīng)正常了

至此,就達(dá)到了我們整個想要的一個效果。
預(yù)覽pdf時中文亂碼
項(xiàng)目在預(yù)覽pdf時,中文亂碼。
處理方式:
第一步
首先檢查是否設(shè)置了 request.setCharacterEncoding(“UTF-8”);
和
response.setContentType(“application/pdf; charset=UTF-8”);
第二步
如果部署在win上沒有亂碼,部署在linux上有亂碼,可能是在linux上面可能沒有對應(yīng)的字體,拷貝字體上去(我這個版本的字體不用安裝),指定路徑即可 FontSettings.setFontsFolder("/usr/share/fonts/", true);
如果有使用liberoffice,使用下面的方式:
liberoffice默認(rèn)讀取的時這個路徑下的字體/usr/share/fonts,把字體拷貝導(dǎo)這個路徑下面,chmod 777 * 進(jìn)行授權(quán),然后sudo fc-cache -fv刷新緩存,重啟系統(tǒng)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA創(chuàng)建MyBatis配置文件模板的方法步驟
這篇文章主要介紹了IDEA創(chuàng)建MyBatis配置文件模板的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
Java實(shí)現(xiàn)上傳文件到服務(wù)器的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)上傳文件到服務(wù)器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04
Java中定時任務(wù)的全方位場景實(shí)現(xiàn)思路分析
在開發(fā)過程中,根據(jù)需求和業(yè)務(wù)的不同經(jīng)常會有很多場景需要用到不同特性的定時任務(wù),本文將針對這些場景,提供不同的一個實(shí)現(xiàn)思路,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧2023-12-12
Spring Bean實(shí)例化實(shí)現(xiàn)過程解析
這篇文章主要介紹了Spring Bean實(shí)例化實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02
Idea進(jìn)行pull的時候Your local changes would be
這篇文章主要介紹了Idea進(jìn)行pull的時候Your local changes would be overwritten by merge.具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
SpringCloud之注冊中心之Nacos負(fù)載均衡詳解
Nacos提供多種負(fù)載均衡策略,包括權(quán)重、同機(jī)房、同地域、同環(huán)境等,服務(wù)下線和權(quán)重配置可以通過Nacos管理界面進(jìn)行,同時,Nacos使用Raft算法選舉Leader節(jié)點(diǎn),若IP地址改變可能會影響Leader選舉,配置同集群優(yōu)先訪問可以提高訪問速度,通過配置集群名稱和負(fù)載均衡策略2025-03-03

