欧美激情中文字幕在线_国产区精品视频_免费久久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日
前臺投稿現在有點太抽象了 希望可以弄成那種分區填寫的 標題,內容,圖片,目錄,標簽,這樣的
評論于留言建議
主站蜘蛛池模板: 日本免费高清一区| 99精品视频在线看| 综合久久国产| 久久九九免费视频| 一区二区在线观看网站| 国产一区二区在线免费| 伊人婷婷久久| 国产精品久久97| 国产在线精品播放| 久久国产精品亚洲va麻豆| 欧美国产激情视频| 青青青国产在线观看| 日韩一区av在线| 国产成人精品日本亚洲11| 精品少妇人妻av一区二区| 久久久久久香蕉| 欧美大片va欧美在线播放| 日本在线高清视频一区| 日韩欧美视频一区二区三区四区| 一区二区三区视频| 中文字幕日韩精品一区二区| 91久久久久久久一区二区| 国产福利久久精品| 国产精品久久亚洲| 国产精品老女人精品视频| 国产精品久久久一区| 国产精品视频网站在线观看| 国产精品久久久久久久久久ktv| 激情伊人五月天| 国内揄拍国内精品少妇国语| 久久99久久久久久| 国产欧美日韩视频| 国产精品丝袜一区二区三区| 欧美亚洲视频一区| 日韩免费中文字幕| 一区二区三区四区视频在线观看 | 91国产丝袜在线放| 欧美高清中文字幕| 99久久综合狠狠综合久久止| 国产精品一区在线播放| 国产日韩在线视频|