国产精在线-国产精欧美一区二区三区-国产精视频-国产精品 日韩-一级黄色片在线看-一级黄色片在线播放

JavaScript實現網頁截圖導出方案

前言

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

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

截圖實現

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

前端方案1 canvas

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

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

前端方案2 svg

實現原理:

核心要素是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和資源,但是后續的繪制渲染工作交給了瀏覽器,所以減輕了很多工作量和代碼量。

服務端方案

 

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
THE END
主站蜘蛛池模板: 日韩欧美亚洲中字幕在线播放 | 最新国产午夜精品视频不卡 | 一级网站在线观看 | 欧美xxxx成人免费网站 | 国产色手机在线观看播放 | 国产欧美久久久另类精品 | 女人扒开双腿让男人捅 | 新体操真| 国产一级做a爰片久久毛片99 | 波少野结衣在线播放 | 91人成亚洲高清在线观看 | 加勒比色综合久久久久久久久 | 国产成人毛片毛片久久网 | 美女很黄很黄是免费的·无遮挡网站 | 欧美熟videos肥婆 | 欧美三级黄色大片 | 在线观看中文字幕国产 | 玖玖在线免费视频 | 毛片三级 | 久久亚洲精品无码观看不卡 | 看毛片的网址 | 99久久免费精品国产免费高清 | 久久精品视频一区二区三区 | 国产在线精品成人一区二区三区 | 韩国一级毛片 | 成人免费xxx色视频 成人免费大片a毛片 | 男人干女人的视频 | 可以免费看黄色的网站 | 韩国美女毛片 | 国产精品久久国产三级国电话系列 | 欧美成年视频 | 国产主播大尺度精品福利 | 日本午夜vr影院新入口 | 亚洲成人在线视频播放 | 亚洲综合在线另类色区奇米 | 人人操美女| 国产一区二区三区国产精品 | 亚洲欧美日韩高清综合678 | 欧美真人毛片动作视频 | 91福利国产在线观一区二区 | 伊人久久国产免费观看视频 |