// ==UserScript==
// @name GB688 downloader;国标网下载
// @version 2024.12.23.01
// @license Apache-2.0
// @namespace https://github.com/yikuaibaiban/gb688_downloader
// @description 基于国标网显示规律在本地拼合成PDF并提供下载
// @author yikuaibaiban
// @icon data:image/png;base64,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
// @match http://c.gb688.cn/*
// @grant none
// @run-at document-start
// ==/UserScript==
(function initStyles() {
let style = document.createElement("style");
style.appendChild(document.createTextNode(`.downloader_container { position: fixed; height: 40px; width: 120px; top: calc(50% - 20px); right: 20px;}.downloader_container button { width: 100%; height: 40px; background-color: blueviolet; border: none; color: white; line-height: 40px; text-align: center; font-size: 20px; border-radius: 5px; transition: all 0.3s; display: flex; justify-content: center; align-items: center;}.downloader_container button:hover { background-color: dodgerblue;}@keyframes loading { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); }}.loading { width: 18px; height: 18px; margin-right: 5px; animation: loading 1s infinite;}`));
document.head.appendChild(style);
})();
let viewGbImgCache = [];
async function interceptsXHRCallback(url, response, method, readyState) {
if (readyState !== 4) return;
if (url.includes("viewGbImg?fileName=")) {
let finds = viewGbImgCache.filter(item => item.url === url);
if (!finds.length) {
let img = new Image();
img.src = await blobToBase64(response);//URL.createObjectURL(response);
viewGbImgCache.push({url, img});
}
}
}
interceptsXHR(interceptsXHRCallback);
function interceptsXHR(callback) {
const open = window.XMLHttpRequest.prototype.open;
window.XMLHttpRequest.prototype.open = function (method, url, async, user, password) {
this.addEventListener('readystatechange', function () {
callback(url, this.response, method, this.readyState);
});
open.apply(this, arguments);
}
}
function blobToBase64(blob) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(blob);
reader.onloadend = () => {
const base64String = reader.result;
resolve(base64String);
};
reader.onerror = (error) => {
reject(error);
};
});
}
function downloadPDF() {
let downloadBtn = document.querySelector('#downloadBtn');
downloadBtn.disabled = true;
let loadingIcon = new Image();
loadingIcon.src =
'data:image/png;base64,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';
loadingIcon.className = 'loading';
downloadBtn.insertBefore(loadingIcon, downloadBtn.children[0]);
let pheight = document.querySelector('div.page').clientHeight;
let pwidth = document.querySelector('div.page').clientWidth;
let qwidth = pwidth * 0.1;
let qheight = pheight * 0.1;
let canvasArray = new Array();
let progressText = document.querySelector('#progressText');
progressText.innerHTML = "正在提取图片...";
document.querySelectorAll('.page').forEach(function (elem, i) {
let canvas = document.createElement('canvas');
canvas.width = pwidth;
canvas.height = pheight;
canvas.setAttribute('complete', '0');
canvasArray.push(canvas);
if (elem.hasAttribute('bg')) {
let url = "viewGbImg?fileName=" + elem.getAttribute('bg');
let finds = viewGbImgCache.filter(item => item.url === url);
if (!finds.length) {
viewGbImgCache.push({url, img: null});
}
}
});
progressText.innerHTML = "正在下载图片...";
viewGbImgCache.forEach((item, i) => {
if (item.img !== null) {
return;
}
fetch(item.url, {headers: {'Cache-Alive': 'chunked'}})
.then((response) => {
if (response.status === 200) {
return response.blob();
}
})
.then(async (blob) => {
let img = new Image();
img.src = await blobToBase64(blob) // URL.createObjectURL(blob);
viewGbImgCache[i].img = img;
});
});
let timer1 = setInterval(() => {
for (let i = 0; i < viewGbImgCache.length; i++) {
if (viewGbImgCache[i].img === null) {
return;
}
}
clearInterval(timer1);
progressText.innerHTML = "正在拼合图像...";
document.querySelectorAll('.page').forEach((elem, i) => {
let canvas = canvasArray[i];
let ctx = canvas.getContext('2d');
ctx.fillStyle = 'white';
ctx.fillRect(0, 0, pwidth, pheight);
try {
$(elem)
.children('span')
.each(function (j, s) {
ctx.drawImage(
viewGbImgCache[i === 0 ? 0 : Math.ceil(i / 4) - 1].img,
-parseInt($(s).css('background-position-x')),
-parseInt($(s).css('background-position-y')),
qwidth,
qheight,
$(s).attr('class').split('-')[1] * qwidth,
$(s).attr('class').split('-')[2] * qheight,
qwidth + 1,
qheight
);
});
} catch (e) {
console.log(viewGbImgCache[i === 0 ? 0 : Math.ceil(i / 4) - 1].img);
}
canvas.setAttribute('complete', '1');
});
}, 500);
let timer = setInterval(() => {
for (let i = 0; i < canvasArray.length; i++) {
const element = canvasArray[i];
if (element.getAttribute('complete') != '1') {
return;
}
}
progressText.innerHTML = "正在转换PDF...";
const {jsPDF} = window.jspdf;
const pdf = new jsPDF('p', 'px', [pwidth, pheight]);
let title = $('title').text().split('|')[1].toString().trim();
canvasArray.forEach(function (e, i) {
progressText.innerHTML = `正在转换PDF(${i + 1}/${canvasArray.length})...`;
pdf.addImage(
e.toDataURL('image/jpeg'),
'jpeg',
0,
0,
pwidth,
pheight,
'',
'MEDDIUM'
);
pdf.addPage();
});
let targetPage = pdf.internal.getNumberOfPages();
pdf.deletePage(targetPage);
progressText.innerHTML = "PDF转换完成...";
pdf.save(title + '.pdf');
clearInterval(timer);
downloadBtn.disabled = false;
downloadBtn.removeChild(downloadBtn.children[0]);
}, 500);
}
function init() {
var jspdfScript = document.createElement('script');
jspdfScript.src =
'https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js';
document.querySelector('head').appendChild(jspdfScript);
var container = document.createElement('div');
document.querySelector('body').appendChild(container);
container.className = 'downloader_container';
container.style.zIndex = "999";
var downloadButton = document.createElement('button');
container.appendChild(downloadButton);
downloadButton.innerHTML = '<span>下载PDF</span>';
downloadButton.addEventListener('click', downloadPDF);
downloadButton.id = 'downloadBtn';
var progressText = document.createElement('span');
container.appendChild(progressText);
progressText.id = 'progressText';
progressText.innerHTML = '如需滚动请缓慢滚动,以免缓存图像错位';
}
(async function () {
init()
})();