【JavaScript】豆丁文档保存本地

news/2024/11/29 4:03:04/

前言

        最近犀牛书看了将近一半,对JavaScript算是有了个大概的了解,于是考虑写一些简单的脚本做个练习

思路

        在豆丁网随便找篇文档(测试文档),通过F12查看网页结构,可以看到文档的每一页实际位于id = page_i的canvas元素内,此外,不难发现对于某一页来说,如果该页没有出现在浏览器中,则其内的canvas元素不会加载。因此具体思路如下:

        1、通过底部工具栏的<span class='page_num'>确定文档页数

        2、手动加载全部文档,考虑这一步比较麻烦,把底部工具栏的下一页重写为将文档缓慢滚动到底部

        3、通过引入jsPDF将各canvas元素转为图片拼接

        4、重写文档顶部“文档下载”按钮进行下载

代码

// 加载jsPDF
var script_jsPDF = document.createElement('script');
script_jsPDF.type = 'text/javascript'; 
script_jsPDF.src = 'https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.0.272/jspdf.debug.js';
document.body.appendChild(script_jsPDF);// 重写下一页按钮为缓慢滚动文档
var nextPage = document.getElementById('nextPage');nextPage.onclick = function() {window.scrollTo(0, 0);                              // 滚动到文档顶部setInterval(function() { scrollBy(0, 300) }, 300);  // 缓慢滚动使文档加载
}// 定位到页面顶部"下载文档"按钮
var button = document.getElementsByClassName('doc_down_btn')[0];// 重写button的onclick
button.onclick = function() {/** 文档通过id = 'page_{i}'进行定位(page_1, page_2, page_3...),这里考虑通过while循环实现* 这里需要先加载所有页面*/var pageNum = parseInt(document.getElementsByClassName('page_num')[0].textContent.slice(1));// 通过jsPDF将所有图片保存到一个pdf文件中var pdf = new jsPDF('', 'pt', 'a4', true);var imgWidth = 595.28;for (var index = 1; index <= pageNum; index++ ) {var page = document.getElementById('page_' + index.toString());             // 定位page元素var pageCanvas = page.getElementsByTagName('canvas')[0];                    // 获取canvas元素var pageData = pageCanvas.toDataURL('image/jpeg', 1.0);                       // 将其转为jpeg图片var imageHeight = imgWidth / pageCanvas.width * pageCanvas.height;if (index != 1) { pdf.addPage('a4'); }pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imageHeight, index, 'FAST'); // 添加到pdf中}// 文档名称var title = document.title;// 保存pdfpdf.save(title + '.pdf');
}

操作

        1、F12打开浏览器开发工具,切换到控制台(console),把上面代码粘贴进去

        2、单击下一页,待网页到底部后单击顶部工具栏的“下载文档”即可完成下载


http://www.ppmy.cn/news/831008.html

相关文章

windows系统下载大白菜制作iso镜像文件

背景 1. ventory制作了U盘启动盘&#xff0c;ventory只能加载iso文件&#xff0c; 我们有些操作需要进入到winpe系统进行操作&#xff0c;故需要制作大白菜pe的iso文件 操作步骤 下载大白菜 大白菜u盘启动盘制作工具_大白菜u盘装系统_大白菜pe_大白菜官网-首页 (windowsrw.…

MATLAB 点云旋转、平移的刚性变换 (22)

MATLAB 点云旋转、平移的刚性变换 (22) 一、算法介绍二、刚性变换1.初始点云2.变换点云一、算法介绍 点云的变换一般是使用刚性变换,不改变点云整体的形状与尺寸,通常需要通过旋转平移、等来变换点云的位置,如点云配准等。这里介绍一些关于点云变换的基本操作方法。 二、…

前端校验统一社会信用代码

统一社会信用代码规则 由18位的阿拉伯数字或大写英文字母&#xff08;不使用I、O、Z、S、V&#xff09;组成&#xff1b; 第1位~第2位、第9位~第18位 [0-9A-HJ-NP-RT-UW-Y] 第3位~第8位&#xff0c;由阿拉伯数字表示&#xff1b; [0-9]{6} 第18位校验码&#xff0c;按照公…

低代码能够为企业带来什么?

目录 1、为企业快速开发应用赋能 2、低成本使用数字化工具 3、满足企业定制化需求 大数据时代的快速发展下&#xff0c;传统的应用开发技术手段渐渐地无法满足企业的高需求。并且&#xff0c;企业想在应用开发的基础上同时实现个性化定制&#xff0c;而传统的技术条件所需要…

java测试生成中征码(数字)

public class Main {public static void main(String[] args) {//企业中征码为 16位 后2位位验证码String checkZZM checkZZM( String.valueOf((int)(Math.random()*101)) String.valueOf(System.currentTimeMillis()) );System.out.println("企业中征码为&#xff1a;…

java测试生成中征码(包含字母、数字)

public static void main(String[] args) {String val genSixToSixteenPsw();System.out.println("企业中征码为&#xff1a;" val);}/*** 随机14位中证码* return*/public static String genSixToSixteenPsw() {String val "";Random random new Rando…

获取服务购买列表

目录 1 获取服务购买列表 2 新增拼团活动 3 商品是否可以参加拼团活动 /// <summary> 获取服务购买列表 /// </summary>

低代码、零代码、免编码平台—对企业有什么优势?

随着社会的发展&#xff0c;支持数字化转型的新软件面临着越来越大的压力。进而会出现开发人员供不应求&#xff0c;众多公司缺乏开发应用程序所需技术人才的现象。这时开发公司就会逐渐倾向低代码或零代码工具平台。这些平台的特点是允许无编程经验的技术人员来构建应用程序&a…