欧美激情中文字幕在线_国产区精品视频_免费久久99精品国产自_日韩精品 欧美

JavaScript實現網頁截圖導出方案

前言

網頁截圖導出不是一個非常高頻的需求,但時不時的也會遇到。這里總結一下系統的解決方案,然后從中選擇合適自己的。

截圖導出可以看到是兩個功能,第一步實現截圖,第二步實現導出也就是下載能力。

截圖實現

首先,我們必須明白正常javascript是運行在瀏覽器里的,本身沒有截圖的能力。所以要想實現截圖,必須通過其他迂回方案實現,廢話少說,直接上結論。

前端方案1 canvas

[dh url="https://html2canvas.hertzen.com/" icon="" des="html2canvas官網"]html2canvas[/dh]

[dh url="https://html2canvas.hertzen.com/" icon="" des="中文文檔"]中文文檔[/dh]

實現原理:
html2canvas 是一個 HTML 渲染器,屏幕截圖是基于 DOM,因此生成的圖片并不一定 100% 一致,因為它沒有制作實際的屏幕截圖,而是根據頁面上可用的信息構建屏幕截圖。
文檔介紹的比較清楚,canvas只是去還原dom的展示效果。

根據實現原理,可以想象,實現成本還是比較高的,需要解析dom和css樣式,而且css樣式不一定能完美映射到canvas,另外還會受限于canvas收到的一些限制,比如跨域資源問題。

前端方案2 svg

[dh url="https://github.com/tsayen/dom-to-image" icon="" des="html2canvas官網"]dom-to-image[/dh]

[dh url="https://github.com/1904labs/dom-to-image-more" icon="" des="Github"]dom-to-image升級版[/dh]

實現原理:

核心要素是SVG 的一個特性,允許在 <foreignObject> 標簽中包含任意的 HTML 內容。所以為了渲染該dom節點,需要如下步驟:

  1. 遞歸克隆原始DOM節點
  2. 計算節點和每個子節點的樣式并將其復制到相應的克隆,并且要重新創建偽元素,因為它們當然不會以任何方式克隆
  3. 嵌入網頁字體,鏈接所有css樣式到style標簽,應用到clone節點
  4. 嵌入圖像
    在 <img> 元素中嵌入圖像 URL
    背景 CSS 屬性中使用的內嵌圖像,以類似于字體的方式
  5. 將克隆的節點序列化為 XML
  6. 將 XML 包裹到 <foreignObject> 標簽中,然后包裹到 SVG 中,然后使其成為數據 URL
  7. 創建一個以 SVG 作為源的 Image 元素,并將其呈現在您也已創建的離屏畫布上,然后從畫布中讀取內容

嗯,這就是svg方式實現了,和canvas方式一樣,需要我們處理dom,css和資源,但是后續的繪制渲染工作交給了瀏覽器,所以減輕了很多工作量和代碼量。

服務端方案

 

[dh url="https://zhaoqize.github.io/puppeteer-api-zh_CN" icon="" des="官方文檔"]Puppeteer [/dh]

Puppeteer 是一個 Node 庫,它提供了一個高級 API 來通過 DevTools 協議控制 Chromium 或 Chrome。這里具體就不介紹了,我們只使用它的截圖功能。

這個就是真正的截圖能力了,官網有demo。

考慮到業務層的頁面都需要用戶訪問權限,所以正確的步驟應該是:

  1. 啟動一個node服務,利用puppeter實現截圖能力
  2. 客戶端發起一個請求,攜帶cookie
  3. 第一步啟動的服務處理此請求,生成圖片,地址返回給客戶端
  4. 客戶端拿到圖片資源,進行下載即可

對比

html2canvas

優點

簡單頁面截圖效果還可以,兼容性還好

缺點

  • 部分樣式無法支持
  • 復雜頁面,慘不忍睹。
  • cors可以解決跨域,但是實際應用還是問題百出
  • 實現非常復雜,難以改動

在我們項目幾乎無法使用

dom-to-image

優點

  • 實現簡單,可下載后自行改動源碼
  • 還原度良好,尤其chrome支持非常好

缺點

  • safari支持不是很好,不過一些問題可以解決(canvas節點會導出空白,如果使用繪圖引擎的話,建議轉化成svg引擎繪圖)
  • ie,edge 無法使用

基本能支持業務需求

后端截圖

優點

  • 真實截圖,終極方案,無兼容問題

缺點

  • 實現流程稍微繁瑣
  • 需要考慮 用戶權限認證問題

導出實現

導出也就是下載文件到本地

a標簽

原理是通過a標簽的download屬性實現下載。

// 基本使用
<a href="/images/xxxxx.jpg" download="filename">

// 腳本觸發
const download = (filename, url) => {
    let a = document.createElement('a'); 
    a.style = 'display: none'; // 創建一個隱藏的a標簽
    a.download = filename;
    a.href = url;
    document.body.appendChild(a);
    a.click(); // 觸發a標簽的click事件
    document.body.removeChild(a);
}

blob文件流對象

這個需要服務端支持,發起請求,服務端返回數據流,然后前端觸發下載。
具體就不多說了,網上有很多文章。

這里推薦幾個封裝好的下載文件庫
downloadjs

file-saver
上一篇 flex布局下,div設置overflow無效問題
下一篇 CorePress主題模仿Mac樣式
目錄
applek

applek管理員

個人說明在個人中心里面設置

本月創作熱力圖

最新評論
小超
小超
7月9日
下個版本考慮將下載地址加密(防止采集)
Lvtu
Lvtu
7月4日
qiang厲害
評論于留言建議
chinacnd
chinacnd
6月26日
這個主題是怎么做到加載速度那么快的?
風起云涌
風起云涌
6月17日
前臺投稿現在有點太抽象了 希望可以弄成那種分區填寫的 標題,內容,圖片,目錄,標簽,這樣的
評論于留言建議
主站蜘蛛池模板: 欧美国产激情视频| 九九精品在线播放| 亚洲精品日韩av| 欧美日韩国产免费一区二区三区| 中文字幕欧美日韩一区二区三区| 久久综合久中文字幕青草| 99久久自偷自偷国产精品不卡| 欧美日韩日本网| 成人精品一区二区三区电影免费| 欧美一级电影久久| 97色在线播放视频| 91免费精品视频| 国产精品久久久久久久乖乖| 日韩精品极品视频在线观看免费| 国产精品自拍小视频| 久久久国产精品免费| 欧美精品久久久久a| 91精品国产91久久久久久不卡| 国产美女久久久| 日韩国产欧美亚洲| 日韩国产欧美亚洲| 亚洲色欲综合一区二区三区| 91免费国产视频| 国产一区亚洲二区三区| 精品国模在线视频| 国产美女视频免费| 俄罗斯精品一区二区三区| 国产精品av在线播放| 国产日韩av高清| 国产在线一区二区三区欧美| 国产福利一区二区三区在线观看| 亚洲精品一区二区毛豆| 国产精品美女免费看| 美女亚洲精品| 亚洲欧美日韩不卡| 日韩有码免费视频| 亚洲自拍中文字幕| 亚洲二区自拍| 日日噜噜噜噜夜夜爽亚洲精品| 国产精品日韩av| 国产精品九九九|