Greasy Fork

Greasy Fork is available in English.

北师硕博论文下载器

本程序仅因北师大在线pdf文档无法在线标记而制作,严格禁止下载文件外传,请务必配合

当前为 2024-01-05 提交的版本,查看 最新版本

// ==UserScript==
// @name              北师硕博论文下载器
// @version           1.0.0
// @namespace         https://bnu.edu.cn
// @description       本程序仅因北师大在线pdf文档无法在线标记而制作,严格禁止下载文件外传,请务必配合
// @author            None 佚名
// @antifeature       需要登录图书馆论文版权系统才能导出PDF
// @require           https://cdn.bootcss.com/jquery/3.5.1/jquery.min.js
// @require           https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.debug.js
// @require           https://cdn.staticfile.org/html2canvas/1.4.1/html2canvas.min.js
// @match             *://etdlib.bnu.edu.cn/read/*
// @license           Apache-2.0
// @grant             unsafeWindow
// ==/UserScript==

(function () {
    console.log('Thesis helper loaded');
'use strict';
$(function () {
    console.log('Thesis helper loaded');
    function addbutton() {
        // 页面增加下载按钮
        var topElement = document.querySelector('.pdf-top-con');
        // 添加toolif
        var newGroup = document.createElement('div');
        newGroup.setAttribute('class', 'toolbar-lf');
        // 添加分隔符
        var fgElement = document.createElement('div');
        fgElement.setAttribute('class', 'toolbar-separator');
        // 添加下载button
        var newAnchorElement = document.createElement('a');
        newAnchorElement.setAttribute('class', 'downloadbutton');
        newAnchorElement.setAttribute('onclick', 'download();');
        var newParagraphElement = document.createElement('p');
        newParagraphElement.innerHTML = '📩 下载PDF';
        newAnchorElement.appendChild(newParagraphElement);
        topElement.appendChild(newGroup);
        newGroup.appendChild(fgElement);
        newGroup.appendChild(newAnchorElement);
        topElement.appendChild(newGroup);
    }

    function add_img_url() {
        return new Promise((resolve) => {
            document.getElementById('btnfirst').click(); // 返回首页
            let checkImages = () => {
                let img_database = document.querySelectorAll('img');
                var TotalPage = parseInt((document.getElementById('totalPages').innerText).match(/\d+/)[0]);
                console.log('Number of images:', img_database.length);
                if (img_database.length !== TotalPage) {
                    TotalPage = parseInt((document.getElementById('totalPages').innerText).match(/\d+/)[0]);
                    setTimeout(() => {
                        document.getElementById('btnnext').click();
                        checkImages();
                    }, 1000);
                } else {
                    console.log('准备制作PDF的IMG储备完毕');
                    resolve('图片链接加载成功');
                }
            };

            checkImages();
        });
    }


    function loadImage(url) {
        // 图片加载
        return new Promise((resolve, reject) => {
            var img = new Image();
            var data;
            img.setAttribute("crossOrigin", "Anonymous");
            img.src = url;
            img.onError = function () {
                throw new Error('Cannot load image: "' + url + '"');
            };
            img.onload = function () {
                var canvas = document.createElement("canvas");
                document.body.appendChild(canvas);
                canvas.width = img.width;
                canvas.height = img.height;
                var ctx = canvas.getContext("2d");
                ctx.drawImage(img, 0, 0);
                // Grab the image as a jpeg encoded in base64, but only the data
                data = canvas
                    .toDataURL("image/jpeg")
                    .slice("data:image/jpeg;base64,".length);
                // Convert the data to binary form
                data = atob(data);
                document.body.removeChild(canvas);
                resolve(data);

            };
        });
    }

    async function download() {
        // 加载img_url
        await add_img_url();
        alert('页面信息已获取完毕,正在合并为PDF,稍后将弹出PDF下载界面')
        // pdf 图片下载
        var imgList = Array();
        var img_database = document.querySelectorAll('img');
        for (let i = 0; i < img_database.length; i++) {
            imgList[i] = img_database[i].currentSrc;
        }
        // console.log(imgList)
        var imgData = new Array();
        for (var i = 0; i < imgList.length; i++) {
            var link = imgList[i];
            console.log("获取第" + i + "张图片");
            await loadImage(link).then((data) => {
                imgData.push(data);
            });
        }
        // pdf 图片合并为pdf
        console.log("正在合并图片为PDF");
        var contentWidth = parseFloat(document.getElementById('PageContainer_0').style.width.replace('px', ''))
        var contentHeight = parseFloat(document.getElementById('PageContainer_0').style.height.replace('px', ''))
        const orientation = contentWidth > contentHeight ? 'l' : 'p';
        var doc = new jsPDF({
            orientation: orientation,
            unit: "px",
            format: [contentWidth, contentHeight],
        });
        const namepdf = document.getElementById('infoname').value
        const output = namepdf + ".pdf";
        let idx = 0;
        imgData.forEach((e) => {
            idx++;
            doc.addImage(e, "JPG", 0, 0, contentWidth, contentHeight);
            if (idx < imgData.length) {
                doc.addPage();
            }
        });
        doc.save(output);
    }

    // 绑定下载按钮
    $(document).ready(function() {
        $(".downloadbutton").on("click", function() {
            download();
        });
    });

addbutton();

})
})()