前端怎么預覽pdf

1.背景

后臺返回了一個在線的pdf地址,需要我這邊去做一個pdf的預覽(需求1),并且支持配置是否可以下載(需求2),需要在當前頁就能預覽(需求3)。之前我寫過一篇預覽pdf的文章,但是當時后臺返回的是blob流文件,如果你們的pdf也是以流文件的形式返回的,可以看這篇文章(超鏈接點進去就行)。

2.簡單說下pdf預覽的實現方式

a.借助 <embed>  /  <iframe>標簽

這個是真的很簡單,我直接貼在下面了,缺點是: 沒辦法阻止用戶打印和下載pdf,所以我pass了這個方案

<embedtype="application/pdf":src="pdfUrl"width="800"height="600" /><iframe:src="pdfUrl"width="800"height="600" />

實現效果:
image.png

b.使用vue插件vue-pdf來渲染(應該還有一些其他的插件也可以使用,大家自己研究下實現的效果把)
這個方案我已經試了且用到項目上了,但是感覺很丑,跟瀏覽器打開pdf的效果差別很大,原因是這個插件大概得原理是把pdf轉成了圖片然后使用canvas來渲染的,然后很多東西都沒有,就被我pass了。你可以想象一下你的pdf,然后你截圖放進你網頁上的感覺,就差不多是這個效果了,圖片我忘記保存了,大家腦補一下
我找了個圖,這個其實別人還做了一些其他的渲染,比如下面的也是他自己寫的。我感覺是沒這么好看的,所以就拋棄了這個
image.png
c.使用pdf.js預覽
我覺得預覽pdf這一塊還是得用pdf.js,真的很成熟,樣式也還是很給力的,然后想要改成什么樣就可以改成什么樣,因為源碼在你手上。
缺點:稍微麻煩點,需要處理跨域的問題(但是如果你的網站、pdf文件所在位置,后臺返回的pdf位置都在同一個域名下的話,就不需要處理)。且可能需要知道一點運維的知識,不然很可能你在本地能運行成功,但是到線上可能訪問不到

3.使用pdf.js預覽pdf

a.到官網去下載pdf.js

image.png
建議下第二個!!!(別問我為啥,因為我下了第一個來寫demo發現有報錯,又踩坑了)
image.png

b.解壓之后直接丟到項目中的public文件夾下面去image.png
c.寫一個pdf.vue文件,內容如下(注意我的路徑,這個路徑跟public的路徑是一樣的,前面加了一個/,原因如下:當我們使用npm run serve時,我們的本地電腦也會開啟一個服務將public項目中的資源開發出來,此時跟服務器是一樣的,你去訪問:localhost:8080/pdf/web/viewer.html 是可以正常訪問通的,這里不理解的話,就依葫蘆畫瓢吧,沒關系的 ):
<template><iframe :src="'/pdf/web/viewer.html?file='+pdfUrl"></iframe>
</template>
<script>export default {name: 'Pdf',props: {pdfUrl: {type: String,default: ''}}
}
</script><style scoped>
iframe {/* width: 960px; */width: 1100px;max-width: 100%;height: 800px;margin-left: 50%;transform: translateX(-50%);
}
</style>
d.在頁面中導入使用:
<template><div class="home"><div>這下面是我用來預覽pdf文件的</div><pdf :pdfUrl="pdfUrl"></pdf></div>
</template><script>
import pdf from './pdf.vue';export default {name: 'HomeView',components:{pdf},data() {return {pdfUrl:'http://localhost:8080/怎么刪除wps中最后的空白頁.pdf'}},created(){},
};
</script>
e.預覽效果是這樣子的

image.png

f.到源碼中修改一下把打印和下載都去掉,這一步很簡單,大家自己去弄了,也可以直接使用我的pdf文件,我這里都已經改好了。最后的效果如下:

image.png

4.難點處理

很大概率你在本地能跑通代碼,但是到線上會出問題,可能會出現的問題我都羅列在下面了

a:線上404

線上404的話,說明你線上的這個pdf的資源沒有上傳到線上,或者線上寫的路徑不對!比如你的ip為192.168.1.182。如果正常的話,你去訪問192.168.1.182/pdf/web/viewer.html 是可以正常訪問通的。如果都沒有出現正常的這個頁面,如下:
image.png
那么說明你pdf文件資源沒上傳或者你寫的路徑不對。 1.檢查dist包里面是否有這個pdf文件(一般放在public文件夾的都會原封不動的打到dist包中,這里還是需要檢查下) 2.如果發現有的話,說明沒問題,那么你需要到服務器上看下有沒有這個pdf文件上傳上去了沒有。如果有的話,那就是你寫的路徑不對,或者是后臺沒有開發這個靜態資源文件夾。此時如果你不懂的話,你就跟后臺說下你要去訪問這個頁面,應該要用什么路徑去訪問才能訪問的到。正常來說 192.168.1.182/pdf/web/viewer.html是可以的,如果不可以,可能是要加什么路徑,比如192.168.1.182/web/pdf/web/viewer.html這種。如果你是web/pdf/web/viewer.html才能訪問的到,那么你就要在你的pdf.vue里面改下路徑以對應生產環境

b:線上顯示資源跨域

這里是很明顯從瀏覽器面板能看到的。這個的處理,需要你和后臺一起處理,首先你訪問/pdf/web/viewer.html這個的地址和你訪問的頁面的地址是需要在一個域名下的(如果不在的話,需要后臺處理,開放個別域名),第二點,就是/pdf/web/viewer.htmlfile='+pdfUrl" 這個pdfUrl的地址最好也是跟你的pdf的viewer.html在同一個域名下,相當于三個都在同一域名下,就不會有跨域問題了。如果后臺說是靜態資源都放到另一臺主機上了,那么麻煩他讓他做個資源映射,保證你的pdfUrl是跟你的pdf的viewer.html在同一個域名下的

5.demo地址

demo地址可下載自己看代碼:https://github.com/rui-rui-an/viewpdf
參考文章:https://juejin.cn/post/7207078219215732794?searchId=2024060423581130C1D707D73A6338E3BA#heading-14

6.更新

關于下載(忘記寫下載了)
html:
我這里用的是一個div,然后文件名作為用戶下載的入口,點擊就能去下載

<div class="downpdf" href="#" v-if="is_download" @click="goDownload">{{ pdfname }}</div>
方法1(直接下載):
downloadPdf(pdfurl) {let fileName = this.pdfnamelet reg = /^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~/])+$/if (!reg.test(pdfurl)) {throw new Error('傳入參數不合法,不是標準的文件鏈接')} else {let xhr = new XMLHttpRequest()xhr.open('get', pdfurl, true)xhr.setRequestHeader('Content-Type', 'application/pdf')xhr.responseType = 'blob'let that = thisxhr.onload = function () {if (this.status == 200) {//接受二進制文件流var blob = this.responsethat.downloadExportFile(blob, fileName)}}xhr.send()}},downloadExportFile(blob, tagFileName) {let downloadElement = document.createElement('a')let href = blobif (typeof blob == 'string') {downloadElement.target = '_blank'} else {href = window.URL.createObjectURL(blob) //創建下載的鏈接}downloadElement.href = hrefdownloadElement.download = tagFileName//下載后文件名document.body.appendChild(downloadElement)downloadElement.click() //點擊下載document.body.removeChild(downloadElement) //下載完成移除元素if (typeof blob != 'string') {window.URL.revokeObjectURL(href) //釋放掉blob對象}},
方法二(通過調自己的后端的下載api來下載,這里得問自己的后臺,我這里就不貼代碼了)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62807.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62807.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62807.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python 參數配置使用 XML 文件的教程:輕松管理你的項目配置

Python 參數配置使用 XML 文件的教程&#xff1a;輕松管理你的項目配置 一句話總結&#xff1a;當配置項存儲在外部文件&#xff08;如 XML、JSON&#xff09;時&#xff0c;修改配置無需重新編譯和發布代碼。通過更新 XML 文件即可調整參數&#xff0c;無需更改源代碼&#xf…

解決 MySQL 啟動失敗與大小寫問題,重置數據庫

技術文檔&#xff1a;解決 MySQL 啟動失敗與大小寫問題&#xff0c;重置數據庫 1. 問題背景 在使用 MySQL 時&#xff0c;可能遇到以下問題&#xff1a; MySQL 啟動失敗&#xff0c;日志顯示 “permission denied” 或 “Can’t create directory” 錯誤。MySQL 在修改配置文…

python webdriver-manager 實現selenium 免下載安裝webdriver

python webdriver-manager 實現selenium 免下載安裝webdriver selenium在自動化測試中,通常需要使用瀏覽器驅動來與瀏覽器進行交互。然而,手動下載、安裝、以及管理這些驅動非常麻煩,尤其是當驅動版本頻繁更新時。為此,webdriver-manager庫提供了一個極簡的方案,自動幫我…

滑動窗口算法專題

滑動窗口簡介 滑動窗口就是利用單調性&#xff0c;配合同向雙指針來優化暴力枚舉的一種算法。 該算法主要有四個步驟 1. 先進進窗口 2. 判斷條件&#xff0c;后續根據條件來判斷是出窗口還是進窗口 3. 出窗口 4.更新結果&#xff0c;更新結果這個步驟是不確定的&#xff0c…

C# 中的Task

文章目錄 前言一、Task 的基本概念二、創建 Task使用異步方法使用 Task.Run 方法 三、等待 Task 完成使用 await 關鍵字使用 Task.Wait 方法 四、處理 Task 的異常使用 try-catch 塊使用 Task.Exception 屬性 五、Task 的延續使用 ContinueWith 方法使用 await 關鍵字和異步方法…

【AIGC】如何高效使用ChatGPT挖掘AI最大潛能?26個Prompt提問秘訣幫你提升300%效率的!

還記得第一次使用ChatGPT時&#xff0c;那種既興奮又困惑的心情嗎&#xff1f;我是從一個對AI一知半解的普通用戶&#xff0c;逐步成長為現在的“ChatGPT大神”。這一過程并非一蹴而就&#xff0c;而是通過不斷的探索和實踐&#xff0c;掌握了一系列高效使用的技巧。今天&#…

浩辰CAD教程004:柱梁板

文章目錄 柱梁板標準柱角柱構造柱柱齊墻邊繪制梁繪制樓板 柱梁板 標準柱 繪制標準柱&#xff1a; ①&#xff1a;點選插入柱子②&#xff1a;沿著一根軸線布置柱子③&#xff1a;指定的矩形區域內的軸線交點插入柱子 替換現有柱子&#xff1a;選擇替換之后的柱子形狀&#x…

UNIX數據恢復—UNIX系統常見故障問題和數據恢復方案

UNIX系統常見故障表現&#xff1a; 1、存儲結構出錯&#xff1b; 2、數據刪除&#xff1b; 3、文件系統格式化&#xff1b; 4、其他原因數據丟失。 UNIX系統常見故障解決方案&#xff1a; 1、檢測UNIX系統故障涉及的設備是否存在硬件故障&#xff0c;如果存在硬件故障&#xf…

橋接模式的理解和實踐

橋接模式&#xff08;Bridge Pattern&#xff09;&#xff0c;又稱橋梁模式&#xff0c;是一種結構型設計模式。它的核心思想是將抽象部分與實現部分分離&#xff0c;使它們可以獨立地進行變化&#xff0c;從而提高系統的靈活性和可擴展性。本文將詳細介紹橋接模式的概念、原理…

HTML綜合

一.HTML的初始結構 <!DOCTYPE html> <html lang"en"><head><!-- 設置文本字符 --><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><!-- 設置網頁…

二維碼數據集,使用yolov,voc,coco標注,3044張各種二維碼原始圖片(未圖像增強)

二維碼數據集&#xff0c;使用yolov&#xff0c;voc&#xff0c;coco標注&#xff0c;3044張各種二維碼原始圖片&#xff08;未圖像增強&#xff09; 數據集分割 訓練組70&#xff05; 2132圖片 有效集20&#xff05; 607圖片 測試集10&#xff05; 305圖…

Python爬蟲技術的最新發展

在互聯網的海洋中&#xff0c;數據就像是一顆顆珍珠&#xff0c;而爬蟲技術就是我們手中的潛水艇。2024年&#xff0c;爬蟲技術有了哪些新花樣&#xff1f;讓我們一起潛入這個話題&#xff0c;看看最新的發展和趨勢。 1. 異步爬蟲&#xff1a;速度與激情 隨著現代Web應用的復…

用豆包MarsCode IDE,從0到1畫出精美數據大屏!

豆包MarsCode IDE 是一個云端 AI IDE 平臺&#xff0c;通過內置的 AI 編程助手&#xff0c;開箱即用的開發環境&#xff0c;可以幫助開發者更專注于各類項目的開發。 作為一名前端開發工程師&#xff0c;今天想嘗試利用豆包MarsCode IDE&#xff0c;選擇 Vue Echarts 創建一個…

游戲引擎學習第42天

倉庫: https://gitee.com/mrxiao_com/2d_game 簡介 目前我們正在研究的內容是如何構建一個基本的游戲引擎。我們將深入了解游戲開發的每一個環節&#xff0c;從最基礎的技術實現到高級的游戲編程。 角色移動代碼 我們主要討論的是角色的移動代碼。我一直希望能夠使用一些基…

Redis是什么?Redis和MongoDB的區別在那里?

Redis介紹 Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的、基于內存的數據結構存儲系統&#xff0c;它可以用作數據庫、緩存和消息中間件。以下是關于Redis的詳細介紹&#xff1a; 一、數據結構支持 字符串&#xff08;String&#xff09; 這是Redis最…

計算機網絡中的三大交換技術詳解與實現

目錄 計算機網絡中的三大交換技術詳解與實現1. 計算機網絡中的交換技術概述1.1 交換技術的意義1.2 三大交換技術簡介 2. 電路交換技術2.1 理論介紹2.2 Python實現及代碼詳解2.3 案例分析 3. 分組交換技術3.1 理論介紹3.2 Python實現及代碼詳解3.3 案例分析 4. 報文交換技術4.1 …

[Python] 操作redis使用pipeline保證原子性

1. pipeline介紹 在Python中使用Redis的Pipeline可以使多個Redis命令在一個請求中批量執行&#xff0c;從而提高效率。redis-py庫提供了對Redis Pipeline的支持&#xff0c;下面是一個基本的例子&#xff1a; 首先&#xff0c;確保你已安裝了redis庫&#xff1a; pip instal…

Bug 解決 無法正常登錄或獲取不到用戶信息

目錄 1、跨域問題 2、后端代碼問題 3、前端代碼問題 我相信登錄這個功能是很多人做項目時候遇到第一個檻&#xff01; **看起來好像很簡單的登錄功能&#xff0c;實際上還是有點坑的&#xff0c;比如明明賬號密碼都填寫正確了&#xff0c;**為什么登錄后請求接口又說我沒登…

論文翻譯 | ChunkRAG: Novel LLM-Chunk Filtering Method for RAG Systems

摘要 使用大型語言模型&#xff08;LLM&#xff09;的檢索-增強生成&#xff08;RAG&#xff09;系統經常由于檢索不相關或松散相關的信息而生成不準確的響應。現有的在文檔級別操作的方法無法有效地過濾掉此類內容。我們提出了LLM驅動的塊過濾&#xff0c;ChunkRAG&#xff0…

Maven(生命周期、POM、模塊化、聚合、依賴管理)詳解

Maven構建項目的生命周期 在Maven出現之前&#xff0c;項目構建的生命周期就已經存在&#xff0c;軟件開發人員每天都在對項目進行清理&#xff0c;編譯&#xff0c;測試&#xff0c;部署等工作&#xff0c;這個過程就是項目構建的生命周期。雖然大家都在不停的做構建工作&…