Java后端返回PDF預(yù)覽給前端的實(shí)現(xiàn)
前端要預(yù)覽服務(wù)器PDF 可直接將要blob流返回給前端 即可用瀏覽器自帶pdf預(yù)覽功能打開(kāi),現(xiàn)有兩種方式
方式1 返回blob流給前端 代碼如下
@PostMapping(value = "/preview") @ResponseBody public void showPdf(HttpServletResponse response) { try { File file = new File("filePath"); OutputStream out = null; try (BufferedInputStream br = new BufferedInputStream(new FileInputStream(file)); ) { byte[] bs = new byte[1024]; int len; response.reset(); // 非常重要 URL u = new URL("file:///" + "filePath"); String contentType = u.openConnection().getContentType(); response.setContentType(contentType); response.setHeader("Content-Disposition", "inline;filename=" + "preview.pdf"); out = response.getOutputStream(); while ((len = br.read(bs)) > 0) { out.write(bs, 0, len); } out.flush(); out.close(); } } catch (Exception e) { e.printStackTrace(); } }
此時(shí) 前端解析可直接拿返回的文件流 例子如下
let blob = this.response; const binaryData = []; binaryData.push(blob); const url = window.URL.createObjectURL(new Blob(binaryData, { type: 'application/pdf' })); window.open(url);
但有的時(shí)候 不想返回文件流 可把文件返回為base64 (注意 base64可能超長(zhǎng))此時(shí)代碼修改如下
File file = new File("filePath"); OutputStream out = null; try (BufferedInputStream br = new BufferedInputStream(new FileInputStream(file)); ByteArrayOutputStream outStream = new ByteArrayOutputStream(); ) { int len; URL u = new URL("file:///" + "filePath"); String contentType = u.openConnection().getContentType(); byte[] buffer = new byte[1024]; //每次讀取的字符串長(zhǎng)度,如果為-1,代表全部讀取完畢 //使用輸入流從buffer里把數(shù)據(jù)讀取出來(lái) while ((len = br.read(buffer)) != -1) { //用輸出流往buffer里寫入數(shù)據(jù),中間參數(shù)代表從哪個(gè)位置開(kāi)始讀,len代表讀取的長(zhǎng)度 outStream.write(buffer, 0, len); } // 對(duì)字節(jié)數(shù)組Base64編碼 Base64Encoder base64 = new Base64Encoder(); String base64Str = replaceEnter(base64.encode(outStream.toByteArray())); } } catch (Exception e) { }
前端修改如下
let base64 = resBase64.data.base64; base64 = base64.replace(/[\n\r]/g, '') const raw = window.atob(base64) const rawLength = raw.length const uInt8Array = new Uint8Array(rawLength) for (let i = 0; i < rawLength; ++i) { uInt8Array[i] = raw.charCodeAt(i) } const url = window.URL.createObjectURL(new Blob([uInt8Array], { type: resBase64.data.contentType })); window.open(url);
到此這篇關(guān)于Java后端返回PDF預(yù)覽給前端的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java 返回PDF預(yù)覽給前端內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Boot?Admin?監(jiān)控指標(biāo)接入Grafana可視化的實(shí)例詳解
Spring Boot Admin2 自帶有部分監(jiān)控圖表,如圖,有線程、內(nèi)存Heap和內(nèi)存Non Heap,這篇文章主要介紹了Spring?Boot?Admin?監(jiān)控指標(biāo)接入Grafana可視化,需要的朋友可以參考下2022-11-11java調(diào)用shell命令并獲取執(zhí)行結(jié)果的示例
今天小編就為大家分享一篇java調(diào)用shell命令并獲取執(zhí)行結(jié)果的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07如何實(shí)現(xiàn)廣告彈窗觸達(dá)頻率的控制?
這篇文章主要介紹了如何實(shí)現(xiàn)廣告彈窗觸達(dá)頻率的控制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Java使用volatile關(guān)鍵字的注意事項(xiàng)
volatile關(guān)鍵字是Java中的一種稍弱的同步機(jī)制,為什么稱之為弱機(jī)制。這篇文章主要介紹了Java使用volatile關(guān)鍵字的注意事項(xiàng),需要的朋友可以參考下2017-02-02原理分析SonarQube中IdentityProvider賬戶互斥現(xiàn)象
這篇文章主要為大家介紹分析SonarQube中IdentityProvider賬戶互斥現(xiàn)象原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02SpringBoot 集成 Kettle的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot 集成 Kettle的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01Spring?Session(分布式Session共享)實(shí)現(xiàn)示例
這篇文章主要介紹了Spring?Session(分布式Session共享)實(shí)現(xiàn)示例,文章內(nèi)容詳細(xì),需要的朋友可以參考下2023-01-01詳解eclipse下創(chuàng)建第一個(gè)spring boot項(xiàng)目
本文詳細(xì)介紹了創(chuàng)建第一個(gè)基于eclipse(eclipse-jee-neon-3-win32-x86_64.zip)+spring boot創(chuàng)建的項(xiàng)目。2017-04-04