Greasy Fork

Greasy Fork is available in English.

博客转PDF(网页局部区域打印)-适用于知乎、CSDN、掘金、博客园、开源中国、简书、思否

把知乎、CSDN、简书、博客园、开源中国、掘金、思否七大主流博客网站的文章部分另存为PDF,便于本地进行编辑。兼容chrome,firefox,edge浏览器,其余未测试

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         博客转PDF(网页局部区域打印)-适用于知乎、CSDN、掘金、博客园、开源中国、简书、思否
// @namespace    http://greasyfork.icu/zh-CN/scripts/428697
// @homepageURL  http://greasyfork.icu/zh-CN/scripts/428697
// @home-url1    https://github.com/dossweet/sweet-WebJS
// @version      10.13
// @description  把知乎、CSDN、简书、博客园、开源中国、掘金、思否七大主流博客网站的文章部分另存为PDF,便于本地进行编辑。兼容chrome,firefox,edge浏览器,其余未测试
// @author       dossweet
// @include       https://zhuanlan.zhihu.com/p/*
// @include       https://www.zhihu.com/question/*/answer/*
// @include      https://www.zhihu.com/question/*
// @include      https://blog.csdn.net/*/article/details/*
// @include      https://*.blog.csdn.net/article/details/*
// @match        https://www.jianshu.com/p/*
// @include      https://www.cnblogs.com/*
// @include      https://juejin.cn/post/*
// @include      https://my.oschina.net/*/blog/*
// @include      https://my.oschina.net/*/*/blog/*
// @include      https://www.oschina.net/question/*
// @include      https://segmentfault.com/a/*
// @run-at      document-idle
// @icon        https://cdn.jsdelivr.net/gh/dossweet/sweet-WebJS@master/image/sweet.jpg
// @require     https://cdn.staticfile.org/jquery/1.9.1/jquery.min.js
// @require     https://cdn.jsdelivr.net/npm/[email protected]/jQuery.print.min.js
// @require     https://code.jquery.com/jquery-migrate-1.2.1.min.js
// @note        v10.13 优化知乎中公式重复出现问题逻辑
// @note        v10.12 修复知乎中公式重复出现的问题
// @note        v10.11 代码升级,采用更规范的写法 & 修复知乎公式打印失败的问题(较复杂) 1024程序员节快乐呀
// @note        v10.10 修复博客园长图片打印失败的问题
// @note        v10.9 修复掘金和思否图标添加失败的问题
// @note        v10.8 修复知乎平台公式图片加载失败问题
// @note        v10.7 修复由于知乎平台的代码优化导致的公式打印失败问题
// @note        v10.6 修复由于掘金改版导致的打印失效的问题&&修复知乎讨论页打印失败的问题&&恢复保留所有平台的作者信息
// @note        v10.5 修改脚本名称
// @note        v10.4 修复由于知乎改版带来的新bug以及question推荐页面强制跳转的bug
// @note        v10.3 删除许可证
// @note        v10.2 修复csdn页面打印不全的bug
// @note        v10.1 修复csdn个别页面失效问题
// @note        v10.0 整合了思否
// @note        v9.0 整合了开源中国
// @note        v8.0 整合了掘金
// @note        v7.0 整合了博客园
// @note        v6.0 整合了简书
// @note        v5.0 整合了csdn
// @note        v4.0 整合了知乎
// @note        v1.0 实现知乎网页打印功能
// ==/UserScript==
(function () {
    'use strict';
    let page2pdfClick = false;
    let listItemNumber = 0;
    let buttonClickCount = 0;
    let opeArray = [];
    let hasAddStyle = false;

    let pageConfigure = {
        parentDiv: "",
        firstChild: "",
        lastChild: "",
        index: 0,
        pageHref: "",
        ifNeedPageRedirect: false,
        currentPage: 0
    }
    let pageHref = window.location.href;//获取网址
    if (pageHref.indexOf("www.zhihu.com/question/") != -1 && pageHref.indexOf("/answer/") != -1) {//表示是讨论回答,推荐回答页面
        pageConfigure.pageHref = pageHref;
        pageConfigure.parentDiv = "QuestionButtonGroup";
        pageConfigure.firstChild = "FollowButton";
        $(document).ready(function () {
            let readMoreBtn = document.querySelectorAll('.ContentItem-expandButton');
            // 自动点击页面上所有回答的阅读全文
            for (let i = 0; i < readMoreBtn.length; i++) {
                readMoreBtn[i].click();
            }
        });

        let readAllAnswer = $('.ViewAll-QuestionMainAction');
        for (let i = 0; i < readAllAnswer.length; i++) {
            readAllAnswer[i].setAttribute('href', 'javascript:void(0)');
            readAllAnswer[i].addEventListener('click', () => {
                toAllAnswerPage();
            })
        }
        pageConfigure.currentPage = 0;//表示是知乎的讨论页
    } else if (pageHref.indexOf("zhuanlan.zhihu.com/p") != -1) {//表示是文章页
        pageConfigure.pageHref = pageHref;
        pageConfigure.parentDiv = "ColumnPageHeader-Button";
        pageConfigure.firstChild = "ColumnPageHeader-WriteButton";
        pageConfigure.currentPage = 0;//表示是知乎
    } else if (pageHref.indexOf("www.zhihu.com/question/") != -1) {//知乎讨论回答,包含所有回答
        pageConfigure.pageHref = pageHref;
        pageConfigure.parentDiv = "QuestionButtonGroup";
        pageConfigure.firstChild = "FollowButton";
        //给所有讨论的父节点添加className,便于后续监听页面懒加载
        let listParentDiv = $(".List-item")[0].parentElement;
        listParentDiv.className = "listParent";
        pageConfigure.currentPage = 0;//表示是知乎
    } else if (pageHref.indexOf("csdn") != -1) {//表示是csdn文章页
        pageConfigure.pageHref = pageHref;
        pageConfigure.parentDiv = "onlyUser";
        pageConfigure.lastChild = "toolbar-btn-write";
        pageConfigure.firstChild = "toolbar-btn-vip";
        pageConfigure.currentPage = 1;//表示是csdn
    } else if (pageHref.indexOf("jianshu") != -1) {//表示是简书文章页
        pageConfigure.pageHref = pageHref;
        pageConfigure.parentDiv = "_26qd_C";
        pageConfigure.currentPage = 2;//表示是简书
    } else if (pageHref.indexOf("cnblogs") != -1) {//表示是博客园
        pageConfigure.pageHref = pageHref;
        pageConfigure.parentDiv = "navList";
        pageConfigure.currentPage = 3;//表示是博客园
    } else if (pageHref.indexOf("juejin") != -1) {//表示是掘金文章页
        pageConfigure.pageHref = pageHref;
        pageConfigure.currentPage = 4;//表示是掘金
    } else if (pageHref.indexOf("oschina") != -1) {//表示是开源中国
        pageConfigure.pageHref = pageHref;
        if (pageHref.indexOf("blog") != -1) {
            pageConfigure.parentDiv = "action-box";
        }
        pageConfigure.currentPage = 5;//表示是开源中国
    } else if (pageHref.indexOf("segmentfault") != -1) {//表示是思否
        pageConfigure.pageHref = pageHref;
        pageConfigure.currentPage = 6;//表示是思否
    }

    if (pageConfigure.ifNeedPageRedirect == true) {
        window.location.replace(pageConfigure.pageHref);
    }

    function toAllAnswerPage() {
        let index = pageConfigure.pageHref.indexOf("answer");
        let pageHref = pageConfigure.pageHref.substring(0, index - 1);
        window.location.replace(pageHref);
    }

    // 关闭登录框
    function closeLogin() {
        if (pageConfigure.currentPage == 0) {
            let removeLoginModal = e => {
                if (e.target.innerHTML && e.target.getElementsByClassName('Modal-wrapper').length > 0) {
                    if (e.target.getElementsByClassName('Modal-wrapper')[0].querySelector('.signFlowModal')) {
                        let button = e.target.getElementsByClassName('Button Modal-closeButton Button--plain')[0];
                        if (button) button.click();
                    }
                }
            }
            document.addEventListener('DOMNodeInserted', removeLoginModal);
        }
    }

    closeLogin();

    let parentDiv = "";
    let firstChild = "";
    // 1代表csdn,4代表掘金,5代表开源中国,6代表思否
    // 在本脚本中,0-知乎,1-csdn,2-简书,3-博客园,4-掘金,5-开源中国,6-思否
    let div = "";
    let div1 = "";
    let div4 = "";
    let div5 = "";
    let div6 = "";

    switch (pageConfigure.currentPage) {
        case 0:
        case 1:
            if (pageConfigure.currentPage == 0) {
                firstChild = document.querySelector('.' + pageConfigure.firstChild);
            }
            parentDiv = document.querySelector('.' + pageConfigure.parentDiv);
            div = document.createElement("div");
            div.innerHTML = '<button type="button" class="printButton">\n' +
                '        <img id="printLogo" src="https://cdn.jsdelivr.net/gh/doublesweet01/BS_script@master/image/printLogo.png">\n' +
                '        <p>文章转PDF</p>\n' +
                '    </button>';
            div.className = "pagePrint";
            break;
        case 2:
            parentDiv = document.querySelector('.' + pageConfigure.parentDiv);
            div = document.createElement("button");
            div.innerHTML = '文章转PDF';
            div.className = "_1OyPqC _3Mi9q9 _1YbC5u printButton";
            div.type = "button";
            break;
        case 3:
            parentDiv = document.querySelector('#' + pageConfigure.parentDiv);
            if (!parentDiv) {//博客园特殊的一个网页模板
                parentDiv = document.getElementById("leftmenu").children[1];
            }
            div = document.createElement("li");
            div.innerHTML = '<a id="printButton" class="menu" href="javascript:void(0);">\n' +
                '        文章转PDF' +
                '    </a>';
            div.id = "pagePrint";
            break;
        case 4:
            div = document.createElement("div");
            div.innerHTML =
                '        <div class="pagePrint panel-btn">\n' +
                '        <div class="tooltip">\n' +
                '        <img id="printLogo" src="https://cdn.jsdelivr.net/gh/doublesweet01/BS_script@master/image/printLogo-jj.png">\n' +
                '        </div>\n' +
                '        </div>\n';
            div.className = "printButton";
            div4 = document.createElement("div");
            div4.innerHTML = '<div class="tooltip-one"></div>\n' +
                '    <div class="tooltip-two">文章转PDF</div>';
            div4.className = "tooltips";
            break;
        case 5:
            if (pageConfigure.parentDiv.length > 0) {
                parentDiv = document.querySelectorAll('.' + pageConfigure.parentDiv)[1];
                div = document.createElement("div");
                div.innerHTML =
                    '        <div class="action-item__button">\n' +
                    '        <img id="printLogo" src="https://cdn.jsdelivr.net/gh/doublesweet01/BS_script@master/image/printLogo04.png">\n' +
                    '        </div>\n' +
                    '        <div class="action-item__text">\n' +
                    '        <p>转PDF</p>' +
                    '        </div>\n';
                div.className = "action-item printButton";
            } else {
                div1 = document.createElement("div");
                div1.innerHTML =
                    '        <img id="printLogo" src="https://cdn.jsdelivr.net/gh/doublesweet01/BS_script@master/image/printLogo04.png">\n';
                div1.className = "printButton";
                div5 = document.createElement("div");
                div5.innerHTML = '<div class="tooltip-one"></div>\n' +
                    '    <div class="tooltip-two">文章转PDF</div>';
                div5.className = "tooltips";
            }
            break;
        case 6:
            div = document.createElement("div");
            div.innerHTML =
                '        <div class="pagePrint panel-btn">\n' +
                '        <div>\n' +
                '        <img id="printLogo" src="https://cdn.jsdelivr.net/gh/doublesweet01/BS_script@master/image/printLogo05.png">\n' +
                '        </div>\n' +
                '        </div>\n';
            div.className = "printButton";
            div6 = document.createElement("div");
            div6.innerHTML = '<div class="tooltip-one"></div>\n' +
                '    <div class="tooltip-two">文章转PDF</div>';
            div6.className = "tooltips";
            break;
        default:
            break;
    }

    let cssStyle = "";
    let object = "";
    let objectIcon = "";
    let pos = "";
    let btnTop = "";
    let tipTop = "";
    let btnWidth = "";
    let btnLeft = "";
    let tipLeft = "";
    let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
    let scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;

    switch (pageConfigure.currentPage) {
        case 0:
            parentDiv.insertBefore(div, firstChild);
            cssStyle = ".printButton {\n" +
                "        background-color: #056de8;\n" +
                "        color: white;\n" +
                "        padding: 0 12px;\n" +
                "        border-radius: 3px;\n" +
                "        margin-right: 5px;\n" +
                "        font-size: 14px;\n" +
                "        line-height: 34.5px;\n" +
                "        border: none;\n" +
                "        text-align: center;\n" +
                "        display: inline-flex;\n" +
                "    }\n" +
                "    #printLogo{\n" +
                "        width: 24px;\n" +
                "        height: 24px;\n" +
                "        margin-top: 5.25px;\n" +
                "    }\n" +
                "    .QuestionButtonGroup{\n" +
                "        display: -webkit-inline-box;\n" +
                "    }";
            break;
        case 1:
            parentDiv.appendChild(div);
            cssStyle = ".printButton {\n" +
                "        background-color: #ff4d4d;\n" +
                "        color: white;\n" +
                "        border-radius: 3px;\n" +
                "        padding-right: 5px !important;\n" +
                "        margin-top: 8px !important;\n" +
                "        margin-left: 5px !important;\n" +
                "        font-size: 14px;\n" +
                "        line-height: 32px;\n" +
                "        border: none;\n" +
                "        text-align: center;\n" +
                "        display: inline-flex;\n" +
                "    }\n" +
                "    #printLogo{\n" +
                "        width: 24px;\n" +
                "        height: 24px;\n" +
                "        margin-top: 5.25px;\n" +
                "    }\n" +
                "    .pagePrint{\n" +
                "        display: -webkit-inline-box;\n" +
                "    }";
            break;
        case 2:
            parentDiv.appendChild(div);
            cssStyle = "";
            break;
        case 3:
            parentDiv.appendChild(div);
            cssStyle = ".printButton {\n" +
                "        background-color: #ff4d4d;\n" +
                "        color: white;\n" +
                "        border-radius: 3px;\n" +
                "        padding-right: 5px !important;\n" +
                "        margin-top: 8px !important;\n" +
                "        margin-left: 5px !important;\n" +
                "        font-size: 14px;\n" +
                "        line-height: 32px;\n" +
                "        border: none;\n" +
                "        text-align: center;\n" +
                "        display: inline-flex;\n" +
                "    }\n" +
                "    #printLogo{\n" +
                "        width: 24px;\n" +
                "        height: 24px;\n" +
                "        margin-top: 5.25px;\n" +
                "    }\n" +
                "    .pagePrint{\n" +
                "        display: -webkit-inline-box;\n" +
                "    }";
            break;
        case 4:
            document.body.appendChild(div);
            document.body.appendChild(div4);
            object = document.getElementsByClassName("panel-btn")[0];
            if (object) {
                pos = object.getBoundingClientRect();//参考坐标
                btnLeft = pos.left;
                btnTop = pos.top + pos.height * 9;
                tipTop = btnTop + pos.height;
                tipLeft = btnLeft - 5;
            } else {
                //当前浏览器不支持该方法
                let actualLeft = getElementLeft(object);
                let actualTop = getElementTop(object);
                btnLeft = actualLeft - scrollLeft;
                btnTop = actualTop - scrollTop + object.offsetWidth * 1.25;
                tipTop = btnTop + object.offsetHeight;
                tipLeft = btnLeft - 5;
            }

            cssStyle =
                ".pagePrint{\n" +
                "        background-color: white;\n" +
                "        border-radius: 50%;\n" +
                "        text-align: center;\n" +
                "        height: 4rem;\n" +
                "        width: 4rem;\n" +
                "        position: fixed;\n" +
                "        top: " + btnTop + "px;\n" +
                "        left: " + btnLeft + "px;\n" +
                "        z-index: 1000;\n" +
                "    }\n" +
                "    #printLogo{\n" +
                "        width:2rem;\n" +
                "        height:2rem;\n" +
                "        margin-top:1rem;\n" +
                "    }\n" +
                "    .tooltips{\n" +
                "        display: none;\n" +
                "        align-items: center;\n" +
                "        position: fixed;\n" +
                "        top: " + tipTop + "px;\n" +
                "        left: " + tipLeft + "px;\n" +
                "    }\n" +
                "    .tooltip-one {\n" +
                "        width: 0;\n" +
                "        height: 0;\n" +
                "        border-left: 6px solid transparent;\n" +
                "        border-right: 6px solid transparent;\n" +
                "        border-bottom: 12px solid black;\n" +
                "        margin-left: 20px;\n" +
                "    }\n" +
                "    .tooltip-two{\n" +
                "        background-color: black;\n" +
                "        color: white;\n" +
                "        font-size: 12px;\n" +
                "        width: 75px;\n" +
                "        height: 25px;\n" +
                "        text-align: center;\n" +
                "        border-radius: 5px;\n" +
                "        padding-top: 6px;\n" +
                "        margin-top: -5px;\n" +
                "    }";
            break;
        case 5:
            if (pageConfigure.pageHref.indexOf("question") != -1) {
                document.body.appendChild(div1);
                document.body.appendChild(div5);
                object = document.getElementsByClassName("codeBlock")[0];
                objectIcon = document.getElementsByClassName("codeIcon")[0];
                if (object) {
                    pos = object.getBoundingClientRect();//参考坐标
                    btnLeft = pos.left;
                    btnTop = pos.top - pos.height - 3;
                    btnWidth = pos.width * 0.935;
                    tipTop = btnTop;
                    tipLeft = btnLeft - btnWidth;
                } else {
                    //当前浏览器不支持该方法
                    let actualLeft = getElementLeft(object);
                    let actualTop = getElementTop(object);
                    btnLeft = actualLeft - scrollLeft;
                    btnTop = actualTop - scrollTop + object.offsetWidth * 1.25;
                    btnWidth = object.offsetWidth * 0.93;
                    tipTop = btnTop;
                    tipLeft = btnLeft - btnWidth;
                }
                let margin = (btnWidth - objectIcon.offsetWidth) / 2;
                cssStyle =
                    "    .printButton{\n" +
                    "        position:fixed;\n" +
                    "        top:" + btnTop + "px;\n" +
                    "        left:" + btnLeft + "px;\n" +
                    "        width:" + btnWidth + "px;\n" +
                    "        height:" + btnWidth + "px;\n" +
                    "        z-index:2;\n" +
                    "        border: 1px solid #ddd;\n" +
                    "        background: #f5f5f5;\n" +
                    "        box-sizing: content-box;\n" +
                    "    }\n" +
                    "    #printLogo{\n" +
                    "        width:" + objectIcon.offsetWidth + "px;\n" +
                    "        height:" + objectIcon.offsetWidth + "px;\n" +
                    "        margin:" + margin + "px;\n" +
                    "    }\n" +
                    "    .tooltips{\n" +
                    "        display: none;\n" +
                    "        align-items: center;\n" +
                    "        position: fixed;\n" +
                    "        z-index: 3;\n" +
                    "        top: " + tipTop + "px;\n" +
                    "        left: " + tipLeft + "px;\n" +
                    "    }\n" +
                    "    .tooltip-one {\n" +
                    "        width: 0;\n" +
                    "        height: 0;\n" +
                    "        border-top: 5px solid transparent;\n" +
                    "        border-left: 10px solid black;\n" +
                    "        border-bottom: 5px solid transparent;\n" +
                    "        margin-left: 25px;\n" +
                    "        margin-top: 5px;\n" +
                    "    }\n" +
                    "    .tooltip-two{\n" +
                    "        background-color: black;\n" +
                    "        color: white;\n" +
                    "        font-size: 13px;\n" +
                    "        width: 30px;\n" +
                    "        height: 90px;\n" +
                    "        text-align: center;\n" +
                    "        border-radius: 5px;\n" +
                    "        padding: 6px;\n" +
                    "        margin-top: -15px;\n" +
                    "    }";
            } else {
                parentDiv.appendChild(div);
                cssStyle =
                    "    #printLogo{\n" +
                    "        width:1.1em;\n" +
                    "        height:1.1em;\n" +
                    "    }\n";
            }
            break;
        case 6:
            document.body.appendChild(div);
            document.body.appendChild(div6);
            object = document.getElementsByClassName("dropdown")[2];
            if (object) {
                pos = object.getBoundingClientRect();//参考坐标
                btnLeft = pos.left;
                btnTop = pos.top + pos.height * 1;
                tipTop = btnTop + pos.height;
                tipLeft = btnLeft - 5;
            } else {
                object = document.getElementsByClassName("dropdown")[1];
                //当前浏览器不支持该方法
                let actualLeft = getElementLeft(object);
                let actualTop = getElementTop(object);
                btnLeft = actualLeft - scrollLeft;
                btnTop = actualTop - scrollTop + object.offsetWidth * 1.25;
                tipTop = btnTop + object.offsetHeight;
                tipLeft = btnLeft - 5;
            }

            cssStyle =
                ".pagePrint{\n" +
                "        background-color: white;\n" +
                "        border-radius: 50%;\n" +
                "        text-align: center;\n" +
                "        height: 2em;\n" +
                "        width: 2em;\n" +
                "        position: fixed;\n" +
                "        top: " + btnTop + "px;\n" +
                "        left: " + btnLeft + "px;\n" +
                "        z-index: 1000;\n" +
                "    }\n" +
                "#printLogo{\n" +
                "        width:1.2em;\n" +
                "        height:1.2em;\n" +
                "        margin-top:0.4em;\n" +
                "    }\n" +
                "    .tooltips{\n" +
                "        display: none;\n" +
                "        align-items: center;\n" +
                "        position: fixed;\n" +
                "        top: " + tipTop + "px;\n" +
                "        left: " + tipLeft + "px;\n" +
                "    }\n" +
                "    .tooltip-one {\n" +
                "        width: 0;\n" +
                "        height: 0;\n" +
                "        border-left: 6px solid transparent;\n" +
                "        border-right: 6px solid transparent;\n" +
                "        border-bottom: 12px solid black;\n" +
                "        margin-left: 20px;\n" +
                "    }\n" +
                "    .tooltip-two{\n" +
                "        background-color: black;\n" +
                "        color: white;\n" +
                "        font-size: 12px;\n" +
                "        width: 75px;\n" +
                "        height: 25px;\n" +
                "        text-align: center;\n" +
                "        border-radius: 5px;\n" +
                "        padding-top: 6px;\n" +
                "        margin-top: -5px;\n" +
                "    }";
            break;
    }

    let cssNode = document.createElement("style");
    cssNode.id = "THT_Style";
    cssNode.setAttribute("type", "text/css");
    cssNode.innerHTML = cssStyle;
    document.body.appendChild(cssNode);

    switch (pageConfigure.currentPage) {
        case 3:
            $("#printButton").click(function () {
                Promise.all([updateStyle()]).then(transformPDF);
            });
            setTimeout(() => {
                removeImgLazyLoading('#mainContent', 0);
            }, 1000);
            break;
        default:
            $(".printButton").click(function () {
                if (pageConfigure.currentPage == 0) {
                    if (pageConfigure.pageHref.indexOf("/p") != -1) {
                        let isFirefoxEnv = getBrowserUserAgent();
                        switch (isFirefoxEnv){
                            case true:
                                //先隐藏部分元素,然后打印。在打印完毕后再展示
                                Promise.all([removeImgLazyLoading('.Post-Main', 0), updateStyle()]).then(transformPDF);
                                break;
                            case false:
                                let el = document.getElementsByTagName('article')[0];
                                specialPrint(el, 'article');
                                break;
                        }
                    } else {
                        //表示是知乎讨论,知乎的讨论是采用懒加载的形式,每次增加五个
                        if (page2pdfClick == false) {//第一次点击时所有讨论都加上文章转PDF的文字
                            if (buttonClickCount > 0) {
                                removeStyle();
                                buttonClickCount--;
                            }
                            page2pdfClick = true;
                            addPrintText();
                            $(".printButton").text('取消转换');
                        } else {
                            let cssStyle =
                                "    .pageButtons{\n" +
                                "        display:none;\n" +
                                "    }";
                            addStyle(cssStyle);
                            page2pdfClick = false;
                            if (pageConfigure.pageHref.indexOf("/question") != -1) {
                                $(".printButton").text('文章转PDF');
                            }
                            buttonClickCount++;
                        }
                    }
                } else if (pageConfigure.currentPage == 1 || pageConfigure.currentPage == 4 || pageConfigure.currentPage == 5 || pageConfigure.currentPage == 6) {
                    Promise.all([updateStyle()]).then(transformPDF);
                } else if (pageConfigure.currentPage == 2) {
                    createParentEle(".ouvJEz", 0);
                    Promise.all([updateStyle()]).then(transformPDF);
                }
            });
            break;
    }

    function updateStyle() {
        switch (pageConfigure.currentPage) {
            case 0:
                let parentDiv = $(".is-bottom")[0].parentElement;
                parentDiv.className = "articleComment";
                addStyle(".Post-Author{width:100%;}");
                addStyle(".FollowButton,.Reward,.Post-topicsAndReviewer,.RichContent-action,.articleComment,.RichContent-actions,.ContentItem-actions,.LabelContainer-wrapper,.css-d5ulu0-CatalogContainer{display:none !important;}");
                break;
            case 1:
                addStyle(".article-type-img,.blog-tags-box,.slide-content-box,.operating,#blog_detail_zk_collection,.article-heard-img,.read-count,#csdn-shop-window-top,#blogColumnPayAdvert{display:none !important;}\n");
                addStyle(".article-header-box,.baidu_pl{width:90% !important;}");
                break;
            case 2:
                addStyle("._3tCVn5,._1kCBjS,._19DgIp,._13lIbp,.d0hShY{display:none !important;}");
                addStyle(".rEsl9f{margin-bottom:5px;}");
                break;
            case 3:
                addStyle(".postDesc,#blog_post_info_block,#comment_form{display:none !important;}");
                break;
            case 4:
                addStyle(".tag-list-box,.extension-banner,.follow-button{display:none !important;}");
                addStyle(".author-info-block{margin-bottom:0rem !important;}");
                break;
            case 5:
                if (pageConfigure.pageHref.indexOf("blog") != -1) {
                    addStyle(".article-box__group,.tags-box,.copyright-box,.action-box,.recommend-box,.comment-box{display:none !important;}");
                    addStyle(".article-box__meta,.item-list{display:inline-flex;}");
                    addStyle(".item{margin-right:1rem;}");
                } else if (pageConfigure.pageHref.indexOf("question") != -1) {
                    addStyle(".tags,.poll-wrap,.additional-remarks,.segment{display:none !important;}");
                }
                break;
            case 6:
                addStyle(".functional-area-bottom,.flex-sm-row,.pt-4 align-items-center row{display:none !important;}");
                break;
            default:
                break;
        }
    }

    function removeImgLazyLoading(parentDom, index) {
        let parentDiv = document.querySelectorAll(parentDom)[index];
        let img = parentDiv.getElementsByTagName('img');
        for (let i = 0; i < img.length; i++) {
            img[i].removeAttribute('loading');
            img[i].removeAttribute('data-lazy-status');
        }
    }

    // 文章转pdf
    function transformPDF() {
        switch (pageConfigure.currentPage) {
            case 0:
                $(".Post-Main").print({
                    debug: false,
                    importCSS: true,
                    printContainer: true,
                    operaSupport: true
                });
                break;
            case 1:
                $(".blog-content-box").print({
                    debug: false,
                    importCSS: true,
                    printContainer: true,
                    operaSupport: true
                });
                break;
            case 2:
                $("#jsPrint").print({
                    debug: false,
                    importCSS: true,
                    printContainer: true,
                    operaSupport: true
                });
                break;
            case 3:
                $("#post_detail").print({
                    debug: false,
                    importCSS: true,
                    printContainer: true,
                    operaSupport: true
                });
                break;
            case 4:
                $(".article").print({
                    debug: false,
                    importCSS: true,
                    printContainer: true,
                    operaSupport: true
                });
                break;
            case 5:
                if (pageConfigure.pageHref.indexOf("blog") != -1) {
                    $(".article-box").print({
                        debug: false,
                        importCSS: true,
                        printContainer: true,
                        operaSupport: true
                    });
                } else if (pageConfigure.pageHref.indexOf("question") != -1) {
                    $(".article-detail").print({
                        debug: false,
                        importCSS: true,
                        printContainer: true,
                        operaSupport: true
                    });
                }
                break;
            case 6:
                $(".card-body").print({
                    debug: false,
                    importCSS: true,
                    printContainer: true,
                    operaSupport: true
                });
                break;
        }

        if (pageConfigure.currentPage == 0 || pageConfigure.currentPage == 1 || pageConfigure.currentPage == 2 || pageConfigure.currentPage == 4) {//csdn特殊处理,需要两次removeStyle
            removeStyle();
            removeStyle();
        } else if (pageConfigure.currentPage == 5 && pageConfigure.pageHref.indexOf("blog") != -1) {
            removeStyle();
            removeStyle();
            removeStyle();
        } else if (hasAddStyle == true) {
            removeStyle();
        }
        safeWaitFunctionTT();
    }

    // 新增样式,去除局部打印区域中不要的元素
    function addStyle(style) {
        let newStyle = document.getElementById("THT_Style");
        newStyle.appendChild(document.createTextNode(style));
        hasAddStyle = true;
    }

    // 恢复样式
    function removeStyle() {
        let newStyle = document.getElementById("THT_Style");
        newStyle.removeChild(newStyle.lastChild);
        hasAddStyle = false;
    }

    //为现有节点添加新的父元素,便于操作当前节点
    function createParentEle(currentNode, newParentIndex) {
        let printDiv = $(currentNode)[newParentIndex];
        let parentNew = document.createElement("div");
        let parentID = "";
        if (pageConfigure.currentPage == 0) {
            parentID = 'newParentIndex' + newParentIndex;
        } else if (pageConfigure.currentPage == 2) {
            parentID = 'jsPrint';
        }
        parentNew.id = parentID;
        printDiv.parentNode.replaceChild(parentNew, printDiv);
        parentNew.appendChild(printDiv);
    }

    //需要使用offsetLeft,offsetTop方法。需要明确的是这两个方法都是当前元素相对于其父元素的位置,所以要得到相对于页面的距离需要循环计算。
    function getElementLeft(ele) {
        let actualLeft = ele.offsetLeft;
        let current = ele.offsetParent;
        while (current !== null) {
            actualLeft += current.offsetLeft;
            current = current.offsetParent;
        }
        return actualLeft;
    }

    function getElementTop(ele) {
        let actualTop = ele.offsetTop;
        let current = ele.offsetParent;
        while (current !== null) {
            actualTop += current.offsetTop;
            current = current.offsetParent;
        }
        return actualTop;
    }

    function hoverEvent() {
        if (pageConfigure.currentPage == 4 || pageConfigure.currentPage == 6) {
            $(".printButton").hover(function () {
                $(".tooltips").show(100);
            }, function () {
                $(".tooltips").hide(100);
            });
        } else if (pageConfigure.pageHref.indexOf("question") != -1) {
            $(".printButton").hover(function () {
                $(".tooltips").show(100);
            }, function () {
                $(".tooltips").hide(100);
            });
        }
    }

    function eventListener() {//归纳所有的事件监听到一个函数
        switch (pageConfigure.currentPage) {
            case 0:
                document.addEventListener('DOMNodeInserted', function () {//添加监听事件,检测是否发生懒加载
                    let listItemLength = document.getElementsByClassName('List-item').length;
                    if (opeArray.length == 0 || opeArray.includes(listItemLength) == false) {
                        opeArray.push(listItemLength);
                        if (page2pdfClick == true) {
                            addPrintText();
                        }
                    }
                });
                break;
        }
    }

    function addPrintText() {
        //给每个讨论都加上打印的按钮,然后再打印
        let parentDiv = document.querySelectorAll('.AnswerItem-authorInfo');
        let temp = listItemNumber;
        for (let newIndex = temp; newIndex < parentDiv.length; newIndex++) {
            let div = document.createElement("div");
            let divId = "printButton" + newIndex;
            let behindDom = document.getElementsByClassName('AnswerItem-authorInfo')[newIndex].getElementsByTagName('button')[0];
            div.innerHTML = '<p id="' + divId + '"color:#4e6ef2;font-size: 14px;">\n' +
                '        转\n' +
                '    </p>';
            div.className = "pageButtons";
            div.setAttribute("style", "width: 34px; line-height:34px;text-align: center; border-radius: 50%; border: 1px solid #e6f0fd; margin-left: 10px; margin-right: 10px;cursor:pointer;");
            parentDiv[newIndex].insertBefore(div, behindDom);
            let className = "printButton" + newIndex;

            $(document).on("click", "#" + className, function () {
                let newParentId = "newParentIndex" + newIndex;
                createParentEle(".AnswerItem", newIndex);
                let cssStyle2 = "\n" + "#" + newParentId + ",.ModalExp-content,.LabelContainer-wrapper,.css-1k5dpte,.ContentItem-actions,.Reward{display:none;}" + "\n";
                addStyle(cssStyle2);
                // let buttonIndex = document.getElementById(className1).parentElement.parentElement.parentElement.parentElement.getAttribute('data-za-index');
                let buttonIndex = className.substring(11);
                transformAnswerPDF(buttonIndex);
            });
        }
        listItemNumber = parentDiv.length;
    }

    // 文章转pdf--讨论--知乎专用
    function transformAnswerPDF(buttonIndex) {
        let printDiv = $(".AnswerItem")[buttonIndex];
        let parentNew = document.createElement("div");
        let parentID = 'printDiv' + buttonIndex;
        parentNew.id = parentID;
        printDiv.parentNode.replaceChild(parentNew, printDiv);
        parentNew.appendChild(printDiv);
        removeImgLazyLoading(".AnswerItem", buttonIndex);
        let isFirefoxEnv = getBrowserUserAgent();
        switch (isFirefoxEnv) {
            case true:
                $("#" + parentID).print({
                    debug: false,
                    importCSS: true,
                    printContainer: true,
                    operaSupport: true
                });
                break;
            case false:
                // 等待DOM节点挂载成功后,再执行打印操作
                Promise.resolve().then(() => {
                    let el = document.getElementById(parentID);
                    specialPrint(el, 'answer');
                });
                break;
        }
        removeStyle();
    }

    // 特殊打印,针对知乎文章里公式打印失败的问题
    function specialPrint(el, pageType) {
        // 创建iframe
        let iframe = document.createElement("iframe");
        // 设置iframe样式
        iframe.setAttribute("id", "print-box");
        iframe.setAttribute(
            "style",
            "position:absolute;width:800px;height:500px;left:-500px;top:-500px;"
        );
        document.body.appendChild(iframe);
        // 获取iframe内的html
        let doc = iframe.contentWindow.document;
        // load iframe page resource
        loadIframePageHead(doc);
        // 将需要打印的DOM插入iframe
        let printMain = document.createElement("div");
        printMain.setAttribute("id", "print-box");
        printMain.innerHTML = el.innerHTML;
        doc.body.appendChild(printMain);
        // remove MathJax
        removeMathJax(doc, "span[id^='MathJax-']");
        // load iframe page resource
        loadIframePageScript(doc);
        let allImg = doc.getElementsByTagName("img");
        // add iframe style
        addIframeStyle(doc, pageType);
        loadImgWithoutLazyLoading(doc, allImg);
        allImg[allImg.length - 1].onload = function () {
            setTimeout(() => {
                // remove same dom
                removeSameDom(doc, "span[id^='MathJax-']");
                // 关闭iframe
                doc.close();
                // 使iframe失去焦点
                iframe.contentWindow.focus();
                // 调用iframe的打印方法
                iframe.contentWindow.print();
                // 移除iframe
                document.body.removeChild(iframe);
            }, 3000);
        }
    }

    function loadIframePageHead(doc) {
        // 当前页面样式
        let headDom = document.getElementsByTagName("head");

        // 设置iframe内的header,添加样式文件
        for (let i = 0; i < headDom.length; i++) {
            doc.getElementsByTagName("head")[i].innerHTML = headDom[i].innerHTML;
        }

        let mathJax_Message = document.getElementById("MathJax_Message");
        if (mathJax_Message) {
            mathJax_Message.setAttribute("style", "display:none;");
        }
    }

    function loadIframePageScript(doc) {
        let scriptDom = document.getElementsByTagName("script");

        // 添加内联script
        let js_clientConfig_script = document.getElementById('js-clientConfig');
        let js_initialData_script = document.getElementById('js-initialData');
        if (js_clientConfig_script) {
            js_clientConfig_script.setAttribute("nonce", "");
            doc.body.append(js_clientConfig_script);
        }
        if (js_initialData_script) {
            js_initialData_script.setAttribute("nonce", "");
            doc.body.append(js_initialData_script);
        }

        // 在iframe中插入script
        for (let i = 0; i < scriptDom.length; i++) {
            if (!scriptDom[i].src && !scriptDom[i].type) continue;
            let mathJax = document.createElement("script");
            if (scriptDom[i].id) {
                mathJax.id = scriptDom[i].id;
            }

            if (scriptDom[i].src) {
                mathJax.setAttribute("crossorigin", "");
                mathJax.src = scriptDom[i].src;
            }

            if (scriptDom[i].type) {
                mathJax.type = scriptDom[i].type;
            }
            doc.body.appendChild(mathJax);
        }
    }

    function addIframeStyle(doc, pageType) {
        let domStyle = document.createElement('style');
        domStyle.type = 'text/css';
        switch (pageType) {
            case 'answer':
                domStyle.innerHTML = '.css-1vse7nz{display:flex;}\n .ContentItem-actions,.RichText-ADLinkCardContainer,.RichText-MCNLinkCardContainer,.Reward{display: none;}';
                break;
            case 'article':
                domStyle.innerHTML = 'h1{font-size: 25px; font-weight: bold;}\n .Post-Author{width:100%;}\n .FollowButton,.Reward,.Post-topicsAndReviewer,.RichContent-action,.articleComment,.RichContent-actions,.ContentItem-actions,.LabelContainer-wrapper,.css-d5ulu0-CatalogContainer{display:none !important;}';
                break;
        }
        doc.getElementsByTagName('head')[0].appendChild(domStyle);
    }

    function loadImgWithoutLazyLoading(iframeDocument, allImg) {
        for (let i = 0; i < allImg.length; i++) {
            allImg[i].removeAttribute('loading');
            allImg[i].removeAttribute('data-lazy-status');
            let dataSrc = allImg[i].getAttribute('data-actualsrc');
            if (dataSrc) {
                allImg[i].src = dataSrc;
            }
        }
    }

    function removeMathJax(document, dom){
        let mathJaxs = document.querySelectorAll(dom);
        for(let i = 0; i < mathJaxs.length; i++){
            mathJaxs[i].parentNode.removeChild(mathJaxs[i]);
        }
    }

    function removeSameDom(document, dom){
        let mathJaxs = document.querySelectorAll(dom);
        for(let i = 1; i < mathJaxs.length; i++){
            if(mathJaxs[i].id === mathJaxs[i - 1].id){
                mathJaxs[i].parentNode.removeChild(mathJaxs[i]);
            }
        }
    }

    //修改博客园导航栏的宽度
    function updateNavWidth() {
        if (pageConfigure.currentPage == 3) {
            let a = document.getElementById("pagePrint");
            let width = getComputedStyle(a).width.replace("px", "");
            let fontSize = getComputedStyle(a).fontSize.replace("px", "");
            if (fontSize >= 14 && fontSize * 6 > width) {
                let newCss = "\n#pagePrint{width:" + fontSize * 7.5 + "px !important;}\n"
                addStyle(newCss);
            }
        }
    }

    // 判断浏览器的环境
    function getBrowserUserAgent(){
        let userAgent = navigator.userAgent;
        // 代表是火狐
        if(/firefox/i.test(userAgent)){
            return true;
        }
        return false;
    }

    //写一个周期函数,检测文章转pdf的按钮有没有加上
    function safeWaitFunctionTT() {
        setInterval(function () {
            let a = document.getElementsByClassName("printButton");
            if (a.length == 0) {
                switch (pageConfigure.currentPage) {
                    case 0:
                        parentDiv.insertBefore(div, firstChild);
                        break;
                    case 1:
                    case 2:
                    case 3:
                        parentDiv.appendChild(div);
                        break;
                    case 4:
                        document.body.appendChild(div4);
                        break;
                    case 5:
                        if (pageConfigure.pageHref.indexOf("blog") != -1) {
                            document.body.appendChild(div);
                        } else if (pageConfigure.pageHref.indexOf("question") != -1) {
                            document.body.appendChild(div1);
                            document.body.appendChild(div5);
                        }
                        break;
                    case 6:
                        document.body.appendChild(div6);
                        break;
                }
                clearInterval();
            }
        }, 500);
    }

    eventListener();
    updateNavWidth();
    safeWaitFunctionTT();
    hoverEvent();
})
();