您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
方便本地化研究学习
// ==UserScript== // @name 安庆市党史方志数字资源平台 研究学习 // @namespace lincong1987 // @match http://data.aqdsw.cn/* // @grant GM_xmlhttpRequest // @grant GM_notification // @grant GM_download // @grant GM_setClipboard // @grant GM_registerMenuCommand // @grant GM_setValue // @grant GM_getValue // @grant GM_listValues // @grant GM_addValueChangeListener // @grant GM_removeValueChangeListener // @grant GM_getResourceText // @grant GM_getResourceURL // @version 1.2 // @author lincong1987 // @require https://unpkg.com/[email protected]/dist/jquery.min.js // @require https://unpkg.com/[email protected]/dist/pdf-lib.min.js // @require https://unpkg.com/[email protected]/download.js // @require https://unpkg.com/[email protected]/dist/localforage.js // @description 方便本地化研究学习 // @license MIT // ==/UserScript== /* globals $ waitForKeyElements */ // http://www.hangzhouds.org.cn/HangzhouBook/list.aspx // http://www.hangzhouds.org.cn/cn/BookLibrary/info.aspx?itemid=177 // http://www.hangzhouds.org.cn/cn/AncientBooks/list.aspx /// asda dsas ;(function () { var rpc = { domain: 'http://localhost', port: 16800, token: '', dir: '/Users/lincong/Downloads/d3/', } var download_rpc_clicked = false var components_css = '' + '<style>' + '.message-bg{position:fixed;float:right;right:0;top:2%;z-index:10001;}' + '.message{margin-bottom:15px;padding:4px 12px;width:300px;display:flex;margin-top:-70px;opacity:0;}' + '.message-danger{background-color:#ffdddd;border-left:6px solid #FB544E;}' + '.message-success{background-color:#ddffdd;border-left:6px solid #56D100;}' + '.message-info{background-color:#e7f3fe;border-left:6px solid #0284FE;}' + '.message-warning{background-color:#ffffcc;border-left:6px solid #FFB500;}' + '.message-context{font-size:21px;word-wrap:break-word;word-break:break-all;}' + '.message_box_btn{text-align:right;}.message_box_btn button{margin:0 5px;}' + '#biz_config_rpc_form {margin: 10px 0; display:none;border:1px solid' + ' #cfc0a5;' + ' padding:12px;background:linear-gradient(0deg,#f4e4c1,#f5f1e5);border-radius:4px;box-shadow:0 0 4px 0px #ffd683;color:#473010;text-shadow:0 0 1px white;}' + '.biz_get_rpc_pdf__actions { margin: 8px auto; text-align: center; border:1px solid' + ' #cfc0a5;' + ' padding:4px;background:linear-gradient(0deg,#f4e4c1,#f5f1e5);border-radius:4px;box-shadow:0 0 4px 0px #ffd683;color:#473010;text-shadow:0 0 1px white;}' + '.biz_config_rpc_form__header{ text-align: center }' + '.biz_config_rpc_form__header span a{ text-decoration: underline; }' + '.biz_config_rpc_form__header h3{ margin: 0px 0 6px 0; font-size:' + ' 18px; font-weight: bold}' + '.biz_config_rpc_form__item{ display:flex;justify-content:center;margin: 6px 0px 6px 0px}' + '.biz_config_rpc_form__item__label{ display:inline-block;width:100px;text-align:right;margin-right:10px;}' + '.biz_config_rpc_form__item__input{width:300px;padding:4px' + ' 8px;border:1px solid #b79e75;border-radius:4px;box-shadow:0 0 4px #ebc886;}' + '' + '.download-process{ margin: 8px auto; padding: 8px; border: 1px' + ' solid #BFBFBF; border-radius: 4px;' + ' }' + '.download-process .download-process__title{ text-align: center;' + ' font-size:16px; ' + ' }' + '.download-process .download-process__title' + ' .download-process__title__ok{color: #56D100}' + '.download-process .download-process__title' + ' .download-process__title__total{color: #313C47}' + '' + '.download-process .download-process__bar{margin: 12px 12px 0px' + ' 12px; text-align: left;}' + '.download-process .download-process__bar .download-process__block' + ' {position:relative; color: #fff;padding: 4px 4px 4px' + ' 4px;min-width: 24px; border-radius:' + ' 4px;\n' + ' height: 12px; line-height: 12px;' + ' display: inline-block;\n' + ' text-align: center;\n' + ' border: 1px solid #fff;\n' + ' background: #0284FE;box-shadow: 0' + ' 0 2px #0284FE;\n' + ' margin: 0 4px 20px 0;\n' + ' font-size: 12px;\n' + '}' + '.download-process .download-process__bar' + ' .download-process__block .process__bar {' + 'display: none;\n' + ' content: "";\n' + ' position: absolute;\n' + ' height: 4px;\n' + ' width: 0%;\n' + ' left: 0;\n' + ' background: #56D100;\n' + ' border-radius: 2px;\n' + ' bottom: -8px;\n' + ' margin: 0 0px;\n' + 'box-shadow: inset 0 0 1px 0px white;' + '}' + '.download-process .download-process__bar' + ' .download-process__block.ok {background: #56D100; box-shadow: 0' + ' 0 2px #56D100;}' + '.download-process .download-process__bar' + ' .download-process__block.pedding {background: #FFB500; box-shadow:' + ' 0' + ' 0 2px #FFB500;}' + '' + '.download-process .download-process__bar' + ' .download-process__block .process__fastdown{' + ' background-image:' + ' url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNjYwODEzNDg4NTkwIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjI0NjEiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMzIiIGhlaWdodD0iMzIiPjxkZWZzPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTcwNCAzNDEuMzMzMzMzaDY0YTY0IDY0IDAgMCAxIDY0IDY0djM2Mi42NjY2NjdhNjQgNjQgMCAwIDEtNjQgNjRIMjU2YTY0IDY0IDAgMCAxLTY0LTY0VjQwNS4zMzMzMzNhNjQgNjQgMCAwIDEgNjQtNjRoNjR2NjRoLTY0djM2Mi42NjY2NjdoNTEyVjQwNS4zMzMzMzNoLTY0di02NHogbS0xNTQuNzk0NjY3LTIxMi4yNjY2NjZsMC4wNDI2NjcgMzQ3LjQ1NiA3NC4wMDUzMzMtNzQuMDI2NjY3IDQ1LjIyNjY2NyA0NS4yNDgtMTUwLjgyNjY2NyAxNTAuODQ4LTE1MC44NDgtMTUwLjgyNjY2NyA0NS4yNDgtNDUuMjY5MzMzIDczLjE3MzMzNCA3My4xNzMzMzNWMTI5LjA2NjY2N2g2NHoiIHAtaWQ9IjI0NjIiIGRhdGEtc3BtLWFuY2hvci1pZD0iYTMxM3guNzc4MTA2OS4wLmkxIiBjbGFzcz0ic2VsZWN0ZWQiIGZpbGw9IiNmZmZmZmYiPjwvcGF0aD48L3N2Zz4=");' + 'height: 12px;\n' + ' width: 12px;\n' + ' background-size: 100% 100%;\n' + ' display: inline-block;\n' + ' vertical-align: middle; margin-left: 4px;' + '' + '}' + '.download-process .download-process__bar' + ' .download-process__block.process {background: #8E9BFA; box-shadow:' + ' 0' + ' 0 2px #8E9BFA;}' + '.download-process .download-process__bar' + ' .download-process__block.error {background: #FB544E; box-shadow: 0' + ' 0 2px #FB544E;}' + '.download-process .download-process__bar' + ' .download-process__block.ok .process__bar {display: block;' + ' width: 100%}' + '.download-process .download-process__bar .download-process__block.pedding .process__bar {' + 'display: block;' + '}' + '.download-process .download-process__bar .download-process__block.process .process__bar {}' + '.download-process .download-process__bar .download-process__block.error .process__bar {}' + '' + '.download-process .download-process__bar .download-process__block' + ' .process__task{' + 'display: none;\n' + ' content: "";\n' + ' position: absolute;\n' + ' height: 0px;\n' + ' width: 0px;\n' + ' left: 50%;\n' + ' border-radius: 2px;\n' + ' top: -8px;\n' + ' margin: 0 0px;\n' + ' transform: translateX(-50%);' + ' border-top: 6px solid #FB544E;\n' + ' border-left: 6px solid #0000;\n' + ' border-right: 6px solid #0000;' + '}' + '.download-process .download-process__bar' + ' .download-process__block.task{' + 'border: 2px solid #FB544E;\n' + ' padding: 3px;' + '}' + '.download-process .download-process__bar' + ' .download-process__block.task .process__task{' + 'display: none' + '}' + '.download-process .download-process__bar .download-process__block' + ' .process__task__progress {' + 'position: absolute; transform: scale(0.8); font-size: 12px;' + 'bottom: -11px; ' + 'display: block;' + 'color: #084b10;\n' + ' width: 100%;\n' + ' left: 0;\n' + ' text-shadow: 1px 1px 1px white;\n' + ' font-weight: bold;' + '}' + '.download-process .download-process__bar' + ' .download-process__block.ok' + ' .process__task__progress {display: block}' + '.download-process .download-process__bar' + ' .download-process__block.pedding' + ' .process__task__progress {display: block}' + '.biz_range_wrapper { display: inline-block; width: 360px; margin: 0' + ' 12px' + ' \n' + ' ;vertical-align: middle;}' + '.biz_range { display: inline-block; width: 180px; }' + '#biz_start{ }' + '#biz_end{ }' + '' + '' + '</style>' var components_html = '' + '<div class="message-bg"></div>' + '<div id="message_box" style="opacity:0;display:none;position:fixed;inset:0px;top:0px;left:0px;width:100%;height:100%;background:rgba(0,0,0,0.7);animation-name:settings-bg;animation-duration:0.3s;z-index:10000;cursor:default;">' + '<div style="position:absolute;background:rgb(255,255,255);border-radius:10px;padding:20px;top:50%;left:50%;width:400px;transform:translate(-50%,-50%);cursor:default;">' + '<span style="font-size:20px"><b>提示:</b></span>' + '<div id="message_box_context" style="margin:2% 0;">...</div><br/><br/>' + '<div class="message_box_btn">' + '<button class="setting-button ant-btn ant-btn-primary" name="affirm">确定</button>' + '<button class="setting-button ant-btn" name="cancel">取消</button></div>' + '</div></div>' var id = 0 var antd_css = '<style>' + '.ant-btn{line-height:1.499;vertical-align:middle;position:relative;display:inline-block;font-weight:400;white-space:nowrap;text-align:center;background-image:none;box-shadow:0 2px 0 rgb(0 0 0 / 2%);cursor:pointer;transition:all .3s cubic-bezier(.645,.045,.355,1);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;touch-action:manipulation;height:32px;padding:0 15px;font-size:14px;border-radius:4px;color:#000000a6;background-color:#fff;border:1px solid #d9d9d9}\n' + '.ant-btn:before{position:absolute;top:-1px;right:-1px;bottom:-1px;left:-1px;z-index:1;display:none;background:#fff;border-radius:inherit;opacity:.35;transition:opacity .2s;content:"";pointer-events:none}\n' + '.ant-btn-primary{color:#fff;background-color:#0284FE;border-color:#0284FE;text-shadow:0 -1px 0 rgb(0 0 0 / 12%);box-shadow:0 2px 0 rgb(0 0 0 / 5%)}' + '.ant-btn-danger{color:#fff;background-color:#FB544E;border-color:#FB544E;text-shadow:0 -1px 0 rgb(0 0 0 / 12%);box-shadow:0 2px 0 rgb(0 0 0 / 5%)}' + '</style>' var utils = { Message: undefined, MessageBox: undefined, } // Message & MessageBox utils.Message = { success: function (html) { return message(html, 'success') }, warning: function (html) { return message(html, 'warning') }, danger: function (html) { return message(html, 'danger') }, info: function (html) { return message(html, 'info') }, } utils.MessageBox = { alert: function (html, affirm) { return messageBox({ html: html, callback: {affirm: affirm}, }, 'alert') }, confirm: function (html, affirm, cancel) { return messageBox({ html: html, callback: { affirm: affirm, cancel: cancel, }, }, 'confirm') }, } // Scroll 滚动条 utils.Scroll = { show: show_scroll, hide: hide_scroll, } function messageBox (ctx, type) { if (type === 'confirm') { $('div.message_box_btn button[name="cancel"]').show() } else if (type === 'alert') { $('div.message_box_btn button[name="cancel"]').hide() } if (ctx.html) { $('div#message_box_context'). html('<div style="font-size:18px">'.concat(ctx.html, '</div>')) } else { $('div#message_box_context'). html('<div style="font-size:18px">╰( ̄▽ ̄)╮</div>') } $('#message_box').show() hide_scroll() $('div#message_box').animate({ 'opacity': '1', }, 300) $('div.message_box_btn button[name="affirm"]')[0].onclick = function () { $('div#message_box').hide() show_scroll() if (ctx.callback && ctx.callback.affirm) { ctx.callback.affirm() } } $('div.message_box_btn button[name="cancel"]')[0].onclick = function () { $('div#message_box').hide() show_scroll() if (ctx.callback && ctx.callback.cancel) { ctx.callback.cancel() } } } function message (html, type) { id += 1 messageEnQueue( '<div id="message-'.concat(id, '" class="message message-'). concat(type, '"><div class="message-context"><p><strong>'). concat(type, '\uFF1A</strong></p><p>'). concat(html, '</p></div></div>'), id) messageDeQueue(id, 3) } function messageEnQueue (message, id) { $('div.message-bg').append(message) $('div#message-'.concat(id)).animate({ 'margin-top': '+=70px', 'opacity': '1', }, 300) } function messageDeQueue (id, time) { if (time === void 0) { time = 3 } setTimeout(function () { var e = 'div#message-'.concat(id) $(e).animate({ 'margin-top': '-=70px', 'opacity': '0', }, 300, function () { $(e).remove() }) }, time * 1000) } function show_scroll () { if ($('div#my_config').is(':hidden') && $('div#message_box').is(':hidden')) { $('body').css('overflow', 'auto') } } function hide_scroll () { $('body').css('overflow', 'hidden') } function download_rpc (url, filename, type) { function getType (file) { var filename = file var index1 = filename.lastIndexOf('.') var index2 = filename.length var type = filename.substring(index1, index2) return type } var json_rpc = { id: window.btoa( 'BParse_'.concat(Date.now(), '_').concat(Math.random())), jsonrpc: '2.0', method: 'aria2.addUri', params: [ 'token:'.concat(rpc.token), [location.origin + url], { dir: rpc.dir, out: filename + '.' + getType(url), header: [ 'User-Agent: '.concat(window.navigator.userAgent), 'Referer: '.concat(window.location.href), ], }, ], } utils.Message.info('发送RPC下载请求') let jsonrpc = JSON.stringify(json_rpc) let control = GM_xmlhttpRequest({ url: ''.concat(rpc.domain, ':').concat(rpc.port, '/jsonrpc'), method: 'post', headers: {}, responseType: 'json', data: JSON.stringify(json_rpc), onload: function (res) { if (res && res.response && res.response.id) { utils.Message.success('RPC请求成功,稍后将自动下载完成') } else { utils.Message.warning('RPC请求失败') } download_rpc_clicked = false }, onerror: function () { utils.Message.danger('RPC请求异常,请确认RPC服务配置及软件运行状态') download_rpc_clicked = false }, }) } $('body').append(components_html + components_css + antd_css) $('.menu'). after( '<div class="biz_get_rpc_pdf__actions" id="biz_get_rpc_pdf__actions">' + '<div class="biz_range_wrapper">' + '<div class="biz_range">开始页:<input type="range" list="biz_start_marks" id="biz_start"' + ' name="volume"\n' + ' min="1" max="1" step="1" />' + '' + '<datalist id="biz_start_marks">\n' + '</datalist>' + '<span' + ' id="biz_start_num">1</span></div>' + '<div class="biz_range">结束页:<input type="range"' + ' list="biz_end_marks" id="biz_end"' + ' name="volume"\n' + ' min="1" max="20" step="1" />' + '' + '<datalist id="biz_end_marks">\n' + '</datalist>' + '<span' + ' id="biz_end_num">1</span></div></div>' + '' + '' + '<span class="task_info"></span>' + '' + '' + '' + '<button' + ' id=\'biz_download_rpc_pdf\' class=\'ant-btn' + ' ant-btn-primary\' style="margin-right: 8px">点击下载学习</button> ' + '<button' + ' id=\'biz_download_stop_pdf\' class=\'ant-btn' + ' ant-btn-danger\' style="margin-right: 8px">停止</button>' + '<button' + ' id=\'biz_config_rpc_pdf\'' + ' class=\'ant-btn' + ' \' style="margin-right: 8px">配置</button> ' + ' <button' + ' id=\'biz_clear_cache_pdf\' class=\'ant-btn' + ' ant-btn-primary\'>清除缓存</button></div>' + '<div id="biz_config_rpc_form" style="">' + '<div class="biz_config_rpc_form__header"><h3>rpc配置</h3></div>' + '<div class="biz_config_rpc_form__header"><span>*' + ' 请根据你的实际情况来配置一下内容</span></div>' + '<div class="biz_config_rpc_form__header"><span>*' + ' 建议使用<a href="https://motrix.app/">motrix</a>来管理下载</span></div>' + '<div class="biz_config_rpc_form__item"><span class="biz_config_rpc_form__item__label">domain:</span>' + ' <input class="biz_config_rpc_form__item__input"' + ' id="biz_config_rpc_form__domain" /></div>' + '<div class="biz_config_rpc_form__item"><span' + ' class="biz_config_rpc_form__item__label">端口:</span>' + '<input class="biz_config_rpc_form__item__input"' + ' id="biz_config_rpc_form__port" /></div>' + '<div class="biz_config_rpc_form__item"><span class="biz_config_rpc_form__item__label">token:</span>' + '<input class="biz_config_rpc_form__item__input" id="biz_config_rpc_form__token" /></div>' + '<div class="biz_config_rpc_form__item"><span' + ' class="biz_config_rpc_form__item__label">保存目录:</span>' + '<input class="biz_config_rpc_form__item__input" id="biz_config_rpc_form__dir" /></div>' + '<div class="biz_config_rpc_form__item"><button' + ' id=\'biz_config_rpc_form__save\' class=\'ant-btn' + ' ant-btn-primary\'>保存</button></div>' + '</div>' + '' + '') var $title = $('.page-nav > dl > dt') var filename = $title.text().replace(' 在线阅读', '') if (filename) { utils.Message.info('获取文件名成功 - ' + filename) } var $links = $('li[data-url*=\'.pdf\']') var globalPdfDoc = null var taskStop = false var tempPage = 0 // pdf子册 数组 var pdfs = [] var pdfs_total_pages = 0 // pdf map {url: pdf} var pdfMap = {} // 下载任务 [pageIndex...] var taskPdfs = [] var taskPdfsMap = {} $links.each(function (i, n) { var pdf = { status: '', filename: $(n).text(), url: $(n).attr('data-url'), page: i + 1, index: i, } pdfs.push(pdf) taskPdfs.push(pdf.page) taskPdfsMap[i + 1] = pdf pdfMap[pdf.url] = pdf }) pdfs_total_pages = pdfs.length var store = localforage.createInstance({ name: location.host + location.pathname, }) $('#biz_config_rpc_form'). after( '<div id=\'downloadProcess\' class=\'download-process\'>' + '' + '<div class=\'download-process__title\'> ' + ' <span class="download-process__taskname"></span> ' + ' 进度' + ' ' + ' <span class=\'download-process__title__ok\'>--</span>/' + ' <span class=\'download-process__title__total\'>--</span>' + ' (<span class=\'download-process__title__percent\'>0%</span>)' + ' </span>' + '<div class=\'download-process__bar\'>' + (function () { return pdfs.map((pdf, i) => { var page = i + 1 return '<span id="pdf_' + page + '" index="' + i + '" page="' + page + '" title="' + pdf.filename + '" class="download-process__block task">' + (i + 1) + ' ' + pdf.filename + '<a class="process__fastdown" page="' + page + '"' + ' href="javascript:;"' + '></a>' + '<span class="process__bar"></span>' + '<span class="process__task"></span>' + '<span class="process__task__progress"></span>' + '</span>' }).join('') })() + '</div></div>') function setPercent (page) { var total = taskPdfs.length var index = taskPdfs.indexOf(page) $('.download-process__title__percent'). text(parseFloat(((index + 1) / total) * 100).toFixed(2) + '%') } function setOKPage (num) { $('.download-process__title__ok').text(num) } function setProcessStatus (page, status) { $('#pdf_' + page).removeClass('pedding process ok error'). addClass(status) } function setProcess (page, width) { $('#pdf_' + page + ' .process__bar').width(width) $('#pdf_' + page + ' .process__task__progress').text(width) } function setTasks (start, end) { $('.download-process__block').removeClass('task') $('.download-process__block').each(function (n, i) { var $this = $(this) var page = $this.attr('page') if (page >= start && page <= end) { $this.addClass('task') } }) taskPdfs = pdfs.filter(function (value, index, array) { return value.page >= start && value.page <= end }).map(function (value, index, array) { return value.page }) taskPdfsMap = {} taskPdfs.map(function (page) { taskPdfsMap[page] = getPdfByPage(page) }) //$('.task_info').text() var targetFilename = getTaskFilename() $('.download-process__taskname'). html( '《' + targetFilename + '》 ' + ' <br>任务共 ' + (end - start + 1) + '页') $('.download-process__title__total').text(taskPdfs.length) //console.log(taskPdfs, taskPdfsMap) } function getPdfByPage (page) { return pdfs.find(function (value) { return value.page === page }) } function setPdfByPage (page, key, value) { var index = pdfs.findIndex(function (value) { return value.page === page }) pdfs[index][key] = value } function checkCache (page) { var pdf = getPdfByPage(page) return new Promise((resolve, reject) => { store.getItem(pdf.url).then(function (ab) { if (ab) { resolve(ab) } else { GM_xmlhttpRequest({ url: pdf.url, responseType: 'arraybuffer', onprogress (evt) { setProcess(page, Math.round(evt.loaded / evt.total * 100) + '%') }, onloadstart () { }, onloadend () { }, onload (res) { store.setItem(pdf.url, res.response). then(function (ab) { resolve(ab) }) }, }) // fetch(pdfs[index].url).then(function (res) { // setProcessStatus(index, 'process') // res.arrayBuffer().then(function (ab) { // store.setItem(pdfs[index].url, ab). // then(function (ab) { // resolve(ab) // }) // // }) // }) } }).catch(function (err) { console.log(err) }) }) } function fetchPdf (page) { if (taskStop === true) { tempPage = page return } setProcessStatus(page, 'pedding') checkCache(page).then(function (ab) { window.PDFLib.PDFDocument.load(ab).then(function (pdfDoc) { var pages = pdfDoc.getPages() // var curr = pdfs.reduce((pre, cur) => { // return pre + cur.pages // }, 0) var indices = pdfDoc.getPageIndices() globalPdfDoc.copyPages(pdfDoc, indices). then(function (currPages) { currPages.forEach(function (page) { globalPdfDoc.addPage(page) }) var pdf = getPdfByPage(page) setPdfByPage(page, 'status', 'ok') setPdfByPage(page, 'pages', pages.length) setOKPage(page) setProcessStatus(page, 'ok') setPercent(page) setProcess(page, '100%') utils.Message.info( '文件下载成功' + pdf.filename + ' 共' + pages.length + '页') store.setItem('detail_' + pdf.url, { indices: indices, pages: pages.length, }) if (taskPdfsMap[page + 1]) { fetchPdf(page + 1) } else { startDownload() } }) }) }).catch(function () { setProcessStatus(page, 'error') if (taskPdfsMap[page + 1]) { fetchPdf(page + 1) } else { startDownload() } }) } function getTaskFilename () { var targetFilename = filename if (taskPdfs.length === 1 && pdfs.length === 1) { } if (taskPdfs.length === 1 && pdfs.length !== 1) { targetFilename = filename + ' (' + taskPdfs[0] + ')' + '' } if (taskPdfs.length !== pdfs.length && taskPdfs.length !== 1) { var start = taskPdfs[0] var end = taskPdfs[taskPdfs.length - 1] // targetFilename = filename.replace(/.pdf$/, '') targetFilename = filename + ' (' + start + '-' + end + ')' + '' } return targetFilename } function startDownload () { var targetFilename = getTaskFilename() utils.Message.info(targetFilename + ' 开始合并PDF') globalPdfDoc.save().then(function (pdfBytes) { download(pdfBytes, targetFilename+'.pdf', 'application/pdf') utils.Message.info(targetFilename + ' 下载成功!') }) } function startFetch () { var startPage = tempPage || taskPdfs[0] taskStop = false tempPage = 0 fetchPdf(startPage) } function fetchPdfAndDownload () { window.PDFLib.PDFDocument.create().then(function (inst) { globalPdfDoc = inst startFetch() }) } function stopPdfAndDownload () { taskStop = true utils.Message.info('已停止') // $('#biz_download_stop_pdf').text('继续') } $('#biz_download_rpc_pdf').on('click', function (e) { //download_rpc(url, filename, 'post') utils.Message.info('开始下载') fetchPdfAndDownload() }) $('#biz_download_stop_pdf').on('click', function (e) { //download_rpc(url, filename, 'post') stopPdfAndDownload() }) $('#biz_config_rpc_pdf').on('click', function (e) { $('#biz_config_rpc_form').toggle() }) $('#biz_config_rpc_form__save').on('click', function (e) { setConfig() }) $('#biz_clear_cache_pdf').on('click', function (e) { store.clear(function () { utils.Message.info('缓存已清除!') }) }) var $biz_start = $('#biz_start') var $biz_start_num = $('#biz_start_num') var $biz_end = $('#biz_end') var $biz_end_num = $('#biz_end_num') var $biz_start_marks = $('#biz_start_marks') var $biz_end_marks = $('#biz_end_marks') $biz_start.attr('max', pdfs.length).on('mousemove', function (e) { var min = parseInt($(this).val(), 10) $biz_start_num.text(min) $biz_end.attr('min', min) $biz_end.attr('max', pdfs.length) var options = [] for (var i = 0; i <= (pdfs.length - min); i++) { options.push('<option value="' + (i + 1 + min) + '"></option>') } $biz_end_marks.empty().append(options.join('')) setTasks(min, parseInt($biz_end.val(), 10)) }) $biz_start_marks.append(pdfs.map(function (n, i) { return '<option value="' + (i + 1) + '"></option>' })) $biz_end_num.text(pdfs.length) $biz_end.attr('max', pdfs.length). val(pdfs.length). // on('mousemove', function (e) { // console.log($(this).val()) // }). on('mousemove', function (e) { var max = parseInt($(this).val(), 10) $biz_end_num.text(max) $biz_start.attr('max', max) var options = [] for (var i = 0; i <= max; i++) { options.push('<option value="' + (i + 1) + '"></option>') } $biz_start_marks.empty().append(options.join('')) setTasks(parseInt($biz_start.val(), 10), max) }) $biz_end_marks.append(pdfs.map(function (n, i) { return '<option value="' + (i + 1) + '"></option>' })) $('.download-process__bar').on('click', '.process__fastdown', function (e) { var page = $(this).attr('page') checkCache(parseInt(page, 10)).then(function (ab) { var targetFilename = filename + '(' + page + ')' download(ab, targetFilename+'.pdf', 'application/pdf') utils.Message.info(targetFilename + ' 下载成功!') }) }) function getConfig () { let config = {} let biz_config_rpc_form__config = localStorage.getItem( 'biz_config_rpc_form__config') if (!biz_config_rpc_form__config) { localStorage.setItem('biz_config_rpc_form__config', JSON.stringify(rpc)) biz_config_rpc_form__config = rpc config = biz_config_rpc_form__config } else { rpc = JSON.parse(biz_config_rpc_form__config) config = rpc } $('#biz_config_rpc_form__domain').val(config.domain) $('#biz_config_rpc_form__port').val(config.port) $('#biz_config_rpc_form__token').val(config.token) $('#biz_config_rpc_form__dir').val(config.dir) } setTimeout(function () { getConfig() }, 500) function setConfig () { let rpc_config = { domain: $('#biz_config_rpc_form__domain').val(), port: $('#biz_config_rpc_form__port').val(), token: $('#biz_config_rpc_form__token').val(), dir: $('#biz_config_rpc_form__dir').val(), } rpc = rpc_config localStorage.setItem('biz_config_rpc_form__config', JSON.stringify(rpc)) utils.Message.info('保存成功!') } // (() => { // setTimeout(() => { // let blobOrDataUrl = GM_xmlhttpRequest({ // url: pdfs[3].url, // responseType: 'arraybuffer', // onprogress(evt){ // Math.round(evt.loaded / evt.total * 100) + "%"; // }, // onloadstart(){}, // onloadend(){}, // onload(){}, // }) // debugger // // }, 2000) // // })() })()