javascript - 如何仅在 JavaScript 中使用 URLs Tabs 数组将 HTML 页面呈现为 PNG/JPEG 图像?
问题描述
我正在使用 Javascript 构建一个 chrome 扩展,它获取打开的选项卡的 URL 并保存 html 文件,但 html 的问题是它不能完全在网页上呈现图像。因此,我更改了代码以循环选项卡的每个 URL,然后单击 chrome 扩展程序的下载图标自动将每个 html 页面保存为图像文件。我已经研究了超过 2 天,但什么也没发生。请查看我的代码文件并指导我。我知道 nodejs 中有库,但我想仅使用 chrome 扩展名对 jpeg/png maker 执行 html。
只有我在此扩展程序中使用过的未附加图标、我拥有的所有代码以及popup.js
我尝试过的注释文本。
更新了 popup.js
文件popup.js
- 此文件具有获取浏览器窗口中打开的选项卡的所有 URL 的功能
// script for popup.html
window.onload = () => {
// var html2obj = html2canvas(document.body);
// var queue = html2obj.parse();
// var canvas = html2obj.render(queue);
// var img = canvas.toDataURL("image/png");
let btn = document.querySelector("#btnDL");
btn.innerHTML = "Download";
function display(){
// alert('Click button is pressed')
window.open("image/url");
}
btn.addEventListener('click', display);
}
chrome.windows.getAll({populate:true}, getAllOpenWindows);
function getAllOpenWindows(winData) {
var tabs = [];
for (var i in winData) {
if (winData[i].focused === true) {
var winTabs = winData[i].tabs;
var totTabs = winTabs.length;
console.log("Number of opened tabs: "+ totTabs);
for (var j=0; j<totTabs;j++) {
tabs.push(winTabs[j].url);
// Get the HTML string in the tab_html_string
tab_html_string = get_html_string(winTabs[j].url)
// get the HTML document of each tab
tab_document = get_html_document(tab_html_string)
console.log(tab_document)
let canvasref = document.querySelector("#capture");
canvasref.appendChild(tab_document.body);
html2canvas(document.querySelector("#capture")).then(canvasref => {
document.body.appendChild(canvasref)
var img = canvasref.toDataURL("image/png");
window.open(img)
});
}
}
}
console.log(tabs);
}
function get_html_document(tab_html_string){
/**
* Convert a template string into HTML DOM nodes
*/
var parser = new DOMParser();
var doc = parser.parseFromString(tab_html_string, 'text/html');
return doc;
}
function get_html_string(URL_string){
/**
* Convert a URL into HTML string
*/
let xhr = new XMLHttpRequest();
xhr.open('GET', URL_string, false);
try {
xhr.send();
if (xhr.status != 200) {
alert(`Error ${xhr.status}: ${xhr.statusText}`);
} else {
return xhr.response
}
} catch(err) {
// instead of onerror
alert("Request failed");
}
}
文件popup.html
- 此文件代表 chrome 浏览器搜索栏上的图标和点击功能
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<!-- <meta name="viewport" content="width=device-width, initial-scale=1.0"> -->
<script src= './html2canvas.min.js'></script>
<script src= './jquery.min.js'></script>
<script src='./popup.js'></script>
<title>Capture extension</title>
<!--
- JavaScript and HTML must be in separate files: see our Content Security
- Policy documentation[1] for details and explanation.
-
- [1]: http://developer.chrome.com/extensions/contentSecurityPolicy.html
-->
</head>
<body>
<button id="btnDL"></button>
</body>
</html>
File manifest.json
- 这个文件被 chrome 浏览器用来执行 chrome 扩展
{
"manifest_version": 2,
"name": "CIP screen capture",
"description": "One-click download for files from open tabs",
"version": "1.4.0.2",
"browser_action": {
"default_popup": "popup.html"
},
"permissions": [
"downloads", "tabs", "<all_urls>"
],
"options_page": "options.html"
}
解决方案
您可以使用html2canvas
呈现任何 html 元素(尤其是body
元素)的库,并从生成的画布中获取图像
<script type="text/javascript" src="https://github.com/niklasvh/html2canvas/releases/download/v1.0.0-rc.7/html2canvas.min.js"></script>
<script>
html2canvas(document.body).then(
(canvas) => {
var img = canvas.toDataURL("image/png");
}
);
</script>
您可以从任何公共 CDN 获取 html2canvas,例如这个。你不需要nodeJS。或者直接来自原始 git repo
<script type="text/javascript" src="https://github.com/niklasvh/html2canvas/releases/download/v1.0.0-rc.7/html2canvas.min.js"></script>
您还可以将画布另存为 blob
html2canvas(document.body).then(function(canvas) {
// Export canvas as a blob
canvas.toBlob(function(blob) {
// Generate file download
window.saveAs(blob, "yourwebsite_screenshot.png");
});
});
推荐阅读
- sed - 基于周围行的其他约束,压缩文件中值的唯一计数
- matlab - 自动回答 input()
- java - 带有 Math.random() 的表达式总是返回相同的值
- r - R中每列的每组总和和计数变化
- maven - Jenkins 错误 - 使用预定义工具安装中的工具 - EgsonarQube Scanner
- shell - 如果 shell 环境中存在键,如何替换键值文件中的值?
- python - 从其他表访问数据 - Django Rest Api 中的外键 - 未知列
- python-3.x - 在 ubuntu 18.04 中从源代码编译 OpenCV
- android - Android:如何仅使用链接从 google play 获取应用程序
- mysql - MySQL 错误:“NUMBER”在此位置无效,应为:BIT、BOOL、BOOLEAN、DATE、TIME、ENUM