百度文库(wenku)| 免费下载BX修复版

(暂时失效,欢迎fix)//部分问题解决方法在安装脚本页面下方,请仔细阅读//基于《百度文库(wenku)在线下载PDF格式文件》修改部分代码,修复了打印页面空白问题。可将大部分文档打印成pdf/脚本仅供学习交流,请勿用于商业用途。

// ==UserScript==
// @name         百度文库(wenku)| 免费下载BX修复版
// @version       1.45
// @description    (暂时失效,欢迎fix)//部分问题解决方法在安装脚本页面下方,请仔细阅读//基于《百度文库(wenku)在线下载PDF格式文件》修改部分代码,修复了打印页面空白问题。可将大部分文档打印成pdf/脚本仅供学习交流,请勿用于商业用途。
// @author       ChaorenLong
// @namespace    https://gitee.com/Bgz666/bdwenku-download-tampermonkey-script
// @require      https://cdn.staticfile.org/jquery/2.2.4/jquery.min.js
// @match        *://wenku.baidu.com/view/*
// @match        *://wenku.baidu.com/share/*
// @match        *://wenku.baidu.com/tfview*
// @match        *://wenku.baidu.com/share/*
// @grant        unsafeWindow
// @grant       GM_registerMenuCommand
// @grant        GM_setValue
// @grant        GM_getValue
// @license      GPL-2.0
// @icon         https://wkstatic.bdimg.com/static/wkview/widget/common_toc_reader/common/doc_bottom/compAsync/btns/image/icon-svip.svg
// ==/UserScript==
//感谢原作者 eko.zhan, HelloCodeMing 的脚本支持;脚本仅供学习交流使用,请勿用于商业用途。
; (function () {
    'use strict'
    //tfview-->view
    if(window.location.href.indexOf('tfview')!=-1){window.location.href = window.location.href.replace('tfview','view')}
    window.onload = function(){
        if(document.getElementsByClassName("goBtn")[0]){
            const moreBtn = document.getElementsByClassName("goBtn")[0];
            if(moreBtn){
                moreBtn.click();
            }
        }
        insert();
    };

    //insert print btn
    var d = true;
    var e = true;
    var pp = true;
    var yyy = true;
    //获得每页高度后再赋值给sh2,下面判断要用全局变量,而直接这里获取页面高度数值不对
    var sh2 = 0;
    //display标志符
    var ds = true;
    //是否无边距
    var wbj = false

    function insert() {
        /*         //自动打开50页后标志
        GM_setValue('asign',false) */
        //添加菜单
        if(window.location.pathname.indexOf('share')!= -1){
            //非ppt,暂不支持ppt自定义,请期待后续版本更新
            if($('[data-render]').length!=1){

                GM_registerMenuCommand('自定义文库文档每页高度',function(){
                    $('#hein')[0].style.display = 'block';
                })
                //无边距打印
                GM_registerMenuCommand('(测试)无边距打印,建议调整好高度再使用,点击后点下载',function(){
                    wbj = true;
                })

                GM_registerMenuCommand('取消<文档高度大于1/2打印时,每页必在不同页>',function(){
                    pp = false
                    alert('OK')
                })

                GM_registerMenuCommand('恢复/取消标题',function(){
                    if(d){
                        if($('.reader_ab_test')){
                            d = false;
                            $('.reader_ab_test')[0].style.cssText+='display:block'
                        }
                        if($('.page')[0]){
                            $('.page')[0].setAttribute('style','padding-top: 0px;')
                        }
                    }
                    else{
                        if($('.reader_ab_test')){
                            d = true;
                            $('.reader_ab_test')[0].style.display = 'none';
                        }
                    }
                }
                                      )

                GM_registerMenuCommand('恢复/取消边框',function(){
                    if(e){
                        if($('.reader-page')){
                            e = false;
                            for(var i=0;i<$('.reader-page').length;i++){
                                $('.reader-page')[i].style.cssText+='border:0'
                            }
                        }
                    }
                    else{
                        if($('.reader-page')){
                            e = true;
                            for(i=0;i<$('.reader-page').length;i++){
                                $('.reader-page')[i].style.cssText+='border:1px solid #D3D3D3'
                            }
                        }
                    }
                })


            }
            else{

                GM_registerMenuCommand('暂不支持ppt自定义高度,请期待后续版本更新',function(){})
                GM_registerMenuCommand('恢复/取消标题',function(){
                    if(d){
                        if($('.reader_ab_test')){
                            d = false;
                            $('.reader_ab_test')[0].style.cssText+='display:block'
                        }
                        if($('.page')[0]){
                            $('.page')[0].setAttribute('style','padding-top: 0px;')
                        }
                    }
                    else{
                        if($('.reader_ab_test')){
                            d = true;
                            $('.reader_ab_test')[0].style.display = 'none';
                        }
                    }
                })
                GM_registerMenuCommand('恢复/取消边框',function(){
                    if(e){
                        if($('.ppt-page-item')){
                            e = false;
                            for(i=0;i<$('.ppt-page-item').length;i++){
                                $('.ppt-page-item')[i].style.cssText+='border:1px solid #D3D3D3'
                            }

                            //console.log($('.ppt-page-item')[i].style.cssText)
                            /*                                 //如果无style
                                if(!$('.ppt-page-item')[i].style){
                                    $('.ppt-page-item')[i].setAttribute('style','border:0');
                                }else{
                                    $('.ppt-page-item')[i].style.cssText += 'border:0'
                                } */


                        }
                    }
                    else{
                        for(var i=0;i<$('.ppt-page-item').length;i++){
                            if($('.ppt-page-item')){
                                e = true;
                                if(!$('.ppt-page-item')[i].style){
                                    $('.ppt-page-item')[i].setAttribute('style','border:0');
                                }else{
                                    $('.ppt-page-item')[i].style.cssText += 'border:0'
                                }
                            }}
                        /*                         if($('.ppt-page-item')){
                            e = true;
                            for(i=0;i<$('.ppt-page-item').length;i++){
                                $('.ppt-page-item')[i].style.cssText+='border:1px solid #D3D3D3'
                            }
                        } */
                    }
                })
                //无边距打印
                GM_registerMenuCommand('PPT暂不支持无边距打印,点击查看替代方法',function(){window.open('https://greasyfork.org/zh-CN/scripts/439850/discussions/120120')})
            }
        }



        if ($('#btnPrintStyle').length == 0) {
            $('head').append(
                [
                    '<style id="btnPrintStyle">',
                    '.ez-btn{background-color: rgb(68,178,158);border-radius: 6px;color: #fff;border: 0;height: 30px;line-height: 30px;width: 92px;margin-top: 2px;display: block;position: relative;left: 9px;float: left;font-size: 16px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;text-align: left;padding-left: 15px;transition: opacity .3s;}',
                    '.ez-btn:hover{background-color:#ff4e26;}',
                    '.ez-btn[title]:hover:after {content: attr(_title);position: absolute;top: -4px;left: 105%;min-width: 100px;max-width: 300px; padding: 4px 10px;background: #000000;color: #ffffff;border-radius: 4px;text-align:left;z-index:2021;}',
                    '.ez-panel{z-index:2021;display:none;position: absolute;width: 300px;font-size:14px;background: #ffffff;color: blue;  border-radius: 4px;  border: 1px solid #ff4e26;  padding: 6px;  margin: 2px;}',
                    '#doc-header-test .doc-value{margin-right: 10px !important;padding-right: 10px;}',
                    '@media print {body {display: block !important;}}',
                    '#hein{display:none; border:1px solid black;font-size:15px;padding:0 0 10px 10px;position: fixed; right: 0%; top: 30%; width:240px;height:145px;opacity: 1; z-index: 9999;}',
                    '.heightInput{display:block; width:240px;height:30px;opacity: 1; z-index: 9999;}',
                    '.currentH{width:40px;}',
                    '</style>'
                ].join(' ')
            )
        }
        $('body').append(
            [
                '<div class="ez-panel">',
                '<i><h3 style = "font-weight:600;color:black;font-size: 15px;">若点击后无反应,请允许弹出窗口</h3></i>',
                '<h3 style = "font-weight:600;color:black;font-size: 15px;"><i>跳转到新页面请耐心等待页面加载完成</i></h3>',
                '<h2 style = "font-weight:600;color:black;font-size: 15px;"><i>反馈请到  <a href ="https://gitee.com/Bgz666/bdwenku-download-tampermonkey-script" target="_blank" style ="color:orange">NameSpace</a>或  </i><a href ="https://greasyfork.org/zh-CN/scripts/439850/feedback" target="_blank" style = "color:rgb(58,158,178)">这里</a></h3>',
                '<hr/>常见问题:<br/>',
                '1、<a href="https://gitee.com/Bgz666/bdwenku-download-tampermonkey-script#%E4%B8%89%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95" target="_blank">点击免费下载后,如何打印成pdf文件?</a>',
                '<br/>2、<a href="https://gitee.com/Bgz666/bdwenku-download-tampermonkey-script/issues/I4V4ZO" target="_blank">文字重叠重影该如何解决?</a>',
                '<br/>3、<a href="https://gitee.com/Bgz666/bdwenku-download-tampermonkey-script#issue" target="_blank">图片空白,或者图片只有一半的情况如何处理?</a>',
                '<br/>4、页面超过50页的文档可以点击菜单<a href="https://gitee.com/Bgz666/bdwenku-download-tampermonkey-script/issues/I4TW6G"> 菜单在哪打开?</a>,一键展开其余页面,分别下载',
                '<br/>5、<a href="https://gitee.com/Bgz666/bdwenku-download-tampermonkey-script#issue" target="_blank">打印出来的pdf文件里文字断裂,或者图片表格上下页分开如何处理?</a>',
                '</div>',
                '<div id = "hein">','<button id="closep" style="opacity: 0.5;font-size:10px;display:block;width: 226px;margin-bottom: 10px;">关闭</button>','<span>','当前每页高度:','</span>',
                '<input class = currentH>','<span>',' px','</span>','<button id="cbtn" style="font-size:13px;margin-left: 10px;">重置</button>',
                '<input type="range" class = "heightInput" max="1536" value="100" step="1">',
                '<span style="font-size:13px;font-weight:600"><i>拖动范围条或输入值后回车调整,调整会默认关闭《打印时文档每页必在不同页》建议每页空白太多时调整</i></span>',
                '</div>'
            ].join('')
        )

        if(window.location.pathname.indexOf('share')!= -1){
            //取消标题
            if($('.reader_ab_test')){
                $('.reader_ab_test')[0].style.cssText+='display:none'
            }
            if($('.page')[0]){
                $('.page')[0].setAttribute('style','padding-top: 0px;')
            }
            //取消边框
            //非ppt
            if($('.reader-page')){
                for(var i=0;i<$('.reader-page').length;i++){
                    $('.reader-page')[i].style.cssText+='border:0'
                }
            }
            //ppt
            for(i=0;i<$('.ppt-page-item').length;i++){
                if($('.ppt-page-item')){
                    e = true;
                    if(!$('.ppt-page-item')[i].style){
                        $('.ppt-page-item')[i].setAttribute('style','border:0');
                    }else{
                        $('.ppt-page-item')[i].style.cssText += 'border:0'
                    }
                }}

            //22.3.10 文档大于50页自动打开其余页面
            //非ppt
            if($('[data-render]').length!=1){

                var inputPage = Number($('.page-input')[0].value)
                var pageCount = Number($('.page-count')[0].innerHTML.slice('1'))
                var numm = Math.floor(pageCount/50)
                var Remain = pageCount%50
                var link = window.location.href
                //只在第一个页面执行
                if(inputPage<50){
                    //if(GM_getValue('asign')==false){
                    //提示当前文档页数>50
                    if(pageCount>50){
                        GM_registerMenuCommand('文档超过50页,一键打开剩余页面',function(){
                            alert(`
                    文档页数大于50,将打开多个页面。
                    请每个页面都点击下载。
                    `)
                            if(numm){
                                //整除
                                if(!Remain){
                                    for(var nn = 1;nn<numm;nn++){window.open(link+'?pn='+(nn+1)*50,'_blank')}
                                }else{
                                    for(var nn = 1;nn<numm+1;nn++){window.open(link+'?pn='+(nn+1)*50,'_blank')}
                                }

                            }

                        })
                    }
                    //链接有pn去掉
                    if(link.indexOf('pn')!=-1){link = link.slice('',link.indexOf('?pn'))}
                    //不为0,不小于50页

                }
                //}
            }

            $('h3').remove();
            //非ppt才显示
            if($('[data-page-no]')[0]){
                $('#hein')[0].style.display = 'block';
            }
            if($('.center')){
                $('.center').append('<button class="ez-btn">免费下载</button>')//链接为share按钮位置,此处修改
            }}else if(window.location.pathname.indexOf('share')== -1){if($('.topbar-container')){
                $('.topbar-container').append('<button class="ez-btn">免费下载</button>')//链接为view按钮位置,此处修改
            }}

        //调整高度
        if($('[data-page-no]')[0]){
            if($('.heightInput')[0]){
                var sh = $('[data-page-no]')[0].style.height;
                //赋值给全局变量sh2
                sh2 = sh;
                //获取当前页面高度
                $('.heightInput')[0].value = sh.substr(0,sh.indexOf('p'));
                $('.currentH')[0].value = $('.heightInput')[0].value;

                $('.heightInput')[0].oninput = function(){
                    //高度被调整
                    pp=false;
                    yyy=false;
                    for(var f = 0;f<$('[data-page-no]').length;f++){
                        $('[data-page-no]')[f].style.height = $('.heightInput')[0].value + 'px'
                        $('.currentH')[0].value = $('.heightInput')[0].value;
                        //取消必分页
                        $('[data-page-no]')[f].style.cssText+='page-break-after: auto;'
                    }
                }
                $('#cbtn').click(function(){
                    //重置后恢复标志
                    yyy=true;
                    //触发oninput事件
                    $('.heightInput').val(sh.substr(0,sh.indexOf('p'))).trigger('oninput');

                })
                //回车执行
                $('.currentH').keydown(function(event){
                    if (event.keyCode == 13){
                        //设置值也触发oninput事件
                        $('.heightInput').val($('.currentH')[0].value).trigger('oninput');
                    }
                })
            }
        }
        //删除多余元素,或者使其隐藏

        if($('.top-right-fullScreen')[0]){
            $('.top-right-fullScreen')[0].remove();
        }
        if($('#doc_bottom_wrap')[0]){
            $('#doc_bottom_wrap')[0].remove();
        }
        if($('#html-reader-go-more')[0]){
            $('#html-reader-go-more')[0].setAttribute('style','display:none');
        }
        if($('.owner-desc-wrap')[0]){
            $('.owner-desc-wrap')[0].setAttribute('style','display:none');
        }
        if($('.header-wrap')[0]){
            $('.header-wrap')[0].setAttribute('style','display:none');
        }
        if($('.aside')[0]){
            $('.aside')[0].setAttribute('style','display:none');
        }
        if($('.tag-tips')[0]){
            $('.tag-tips')[0].setAttribute('style','display:none');
        }
        if($('.fix-searchbar-wrap')[0]){
            $('.fix-searchbar-wrap')[0].remove();
        }
        if($('.top-ads-banner-wrap')[0]){
            $('.top-ads-banner-wrap')[0].remove();
        }
        if($('#activity-tg')[0]){
            $('#activity-tg')[0].remove();
        }
        if($('.crubms-wrap')[0]){
            $('.crubms-wrap')[0].setAttribute('style','display:none');
        }
        if($('.doc-tag-wrap')[0]){
            $('.doc-tag-wrap')[0].setAttribute('style','display:none');
        }
        if($('.doc-value')[0]){
            $('.doc-value')[0].setAttribute('style','display:none');
        }
        if($('.doc-bottom-wrap')[0]){
            $('.doc-bottom-wrap')[0].setAttribute('style','display:none');
        }
        if($('#next_doc_box')[0]){
            $('#next_doc_box')[0].setAttribute('style','display:none');
        }
        if($('.left')[0]){
            $('.left')[0].setAttribute('style','display:none');
        }
        if($('.centerRight')[0]){
            $('.centerRight')[0].setAttribute('style','display:none');
        }
        if($('.ft')[0]){
            $('.ft')[0].setAttribute('style','display:none');
        }
        if($('#ft')[0]){
            $('#ft')[0].setAttribute('style','display:none');
        }
        //使主要内容居中
        if($('.page')[0]){
            $('.page')[0].setAttribute('style','padding-top: 10px;')
        }
        if($('.reader_ab_test')[0]){
            $('.reader_ab_test')[0].style.cssText +='text-align: center; margin-right: 0px;width:966px;margin-bottom:10px'
        }
        if($('#doc-main')[0]){
            if($('[data-render]')[0]){
                $('#doc-main')[0].setAttribute('style','margin-left:116px');
            }
        }
        if($('.reader-tools-bar-center')[0]){
            $('.reader-tools-bar-center')[0].setAttribute('style','margin-right:0px');
        }


        //去除边框
        /*
        if($('.reader-page')){
            for(var i=0;i<$('.reader-page').length;i++){
                $('.reader-page')[i].style.cssText+='border:0'
            }
        }

*/

        var t = null

        $('.ez-btn').hover(
            function () {
                $('.ez-panel')
                    .css({
                    top: $('.ez-btn').offset().top - 160 + 'px',
                    left: $('.ez-btn').offset().left + 70 + 'px'
                })
                    .show()
            },
            function () {
                //链接上经过,保持5秒
                $('a').mouseover(
                    function(){
                        if (t) window.clearTimeout(t)
                        t = window.setTimeout(function () {
                            $('.ez-panel').hide()
                        },5*1000)
                    }
                )
                //移出panel
                $('.ez-panel').mouseout(function(){
                    if (t) window.clearTimeout(t)
                    t = window.setTimeout(function () {
                        $('.ez-panel').hide()
                    },500)
                })
                //其余情况
                if (t) window.clearTimeout(t)
                t = window.setTimeout(function () {
                    $('.ez-panel').hide()
                },1000)

            }
        )
        $('#closep').click(function(){
            $('#hein')[0].setAttribute('style','display:none')
        })
        $('.ez-btn').click(function () {
            //?pn=50每次从view等页面打开share都是在前50页
            //没有share
            if(window.location.pathname.indexOf('share')== -1){
                //link链接
                if(window.location.href.indexOf('link')!= -1){
                    if(document.querySelector("body > script:nth-child(4)")){
                        var scriptHtml = document.querySelector("body > script:nth-child(4)").innerHTML
                        var start = scriptHtml.indexOf('showDocId')+12
                        var end = scriptHtml.indexOf('showStoreId')-3
                        var docId = scriptHtml.slice(start,end)
                        window.open('/share/' + docId+'?pn=50','_blank');
                    }
                }
                else{
                    window.open('/share/' + window.location.pathname.slice(6)+'?pn=50','_blank');
                }
            }
            //有share
            else{

                if($('.tools-bar-small')[0]){
                    $('.tools-bar-small')[0].setAttribute('style','display:none');
                }
                prePrint()
                if($('#hein')[0].style.display=='block'){
                    ds = false;
                    $('#hein')[0].style.display = 'none';
                }
            }})
        $('body').mousedown(function (e) {
            if (e.button == 2) {
                //imgHandle()
            }
            return true
        })
    }
    var old = '';
    var a = [];
    //滤网b
    var b = [];
    var kong = [];
    var c = [];
    function saveRecover(){
        if($('.prev-pageList')[0]){
            $('.prev-pageList')[0].remove();
        }
        if($('.next-pageList')[0]){

            $('.next-pageList')[0].setAttribute('style','display:none');
        }

        b = $('[data-render="1"]');
        if($('#next_doc_box')[0]){$('#next_doc_box')[0].remove()}


        for(var i = 0;i<b.length;i++){
            if (a.indexOf(b[i].innerHTML) == -1){
                a.push(b[i].innerHTML);
                /*                 if(b[i].style.cssText.indexOf('height') != -1){
                    ////页面小于打印时页面1/2,就调整为1/2
                    if (parseFloat(b[i].style.height) < 750) {
                        //第一第二页减去标题
                        //有标题
                        //没有手动调整过页面高度
                        if(yyy){
                            if(d){
                                if(i<2){
                                    b[i].style.height = '750px';

                                }
                                else{
                                    b[i].style.height = '777px';
                                }
                            }
                            //无标题
                            else{
                                b[i].style.height = '777px';
                            }
                        }

                    }
                    //添加style,打印时不在同一页
                    //菜单没取消设置
                    //没手动修改过高度
                    else if(pp&&yyy){
                        b[i].style.cssText+='page-break-after: always;'
                    }
                } */
                //console.log(a.length);
            }

            if (c.indexOf(b[i]) == -1){
                c.push(b[i]);
                //console.log(c);
            }

        }

    }
    //2022.3.1调整小于一半页面高度函数
    function halfTake(){
        console.log(c)
        for(var i = 0;i<c.length;i++){
            if(c[i].style.cssText.indexOf('height') != -1){
                ////页面小于打印时页面1/2,就调整为1/2
                if (parseFloat(c[i].style.height) < 750) {
                    //第一第二页减去标题
                    //有标题
                    //没有手动调整过页面高度
                    if(yyy){
                        if(d){
                            if(i<2){
                                c[i].style.height = '750px';

                            }
                            else{
                                c[i].style.height = '777px';
                            }
                        }
                        //无标题
                        else{
                            c[i].style.height = '777px';
                        }
                    }

                }
                //添加style,打印时不在同一页
                //菜单没取消设置
                //没手动修改过高度
                else if(pp&&yyy){
                    c[i].style.cssText+='page-break-after: always;'
                }
            }
            console.log(c[i].style.height)
        }
    }
    //main function
    function prePrint() {

        $('.ez-panel').remove()
        $('#bottom-download').remove();
        // add by eko.zhan at 2019-12-14 17:35
        //遍历css文件,将main的样式取消
        $('head')
            .find('link')
            .each((index, item) => {
            if (
                $(item)
                .attr('href')
                .indexOf('/common_toc/common/style/main') != -1
            ) {
                $(item).remove()
            }
        })


        $('.read-all').click()
        $('.header-wrapper').remove()
        $('.no-full-screen').remove()
        $('.lazy-load').remove()
        $('.reader-topbar').remove()
        //使打印出来页面居中
        //非ppt
        if($('[data-render]')[0]){
            $('.main')[0].setAttribute('style','margin-left:-70px')
        }
        //重新定义remove方法
        jQuery.fn.extend({
            remove: function () {
                return false
            }
        })
        $(window).scrollTop(10);
        window.setTimeout(function () {
            saveRecover();
        }, 1000)

        var _h = document.body.scrollHeight,
            _tmp = 1000
        var _t = window.setInterval(function () {
            $(window).scrollTop(_tmp)
            saveRecover();
            _tmp = _tmp + 1000
            _h = document.body.scrollHeight
            if (_tmp > _h) {
                window.clearInterval(_t)
                window.setTimeout(function () {
                    saveRecover();
                    kong = $("[data-render='']");
                    for (var i = 0; i < kong.length; i++) {
                        kong[i].innerHTML = a[i];
                        //console.log(kong[i])
                    }
                    doPrint();
                }, 1000)
            }
        }, 300)
        }
    /**
   * 调用浏览器打印
   */
    function doPrint() {
        window.setTimeout(function () {
            halfTake()
            //2022.2.28无边距打印,有bug
            if(wbj){
                var newl = document.querySelector("#doc-main > div").innerHTML
                document.body.innerHTML = newl
                window.print()
                alert('目前《无边距打印功能》尚有BUG,如需《调整页面高度》请刷新后进行高度调整或下一次打印/下载')
            }
            else{
                window.print()
            }
            //打印完后
            /*             if(!pp){
                debugger
                for(var i = 0;i<$('[data-page-no]').length;i++){
                    $('[data-page-no]')[i].style.cssText+='page-break-after: auto;'
                }
            } */
            if(ds==false){
                $('#hein')[0].style.display = 'block';
            }
            a=[];
            if($('.tools-bar-small')[0]){
                if(!$('.next-pageList')[0]){
                    $('.tools-bar-small')[0].setAttribute('style','display:block');//显示下边栏
                }else{
                    $('.next-pageList')[0].setAttribute('style','display:block');
                }
            }
            if($('.main')[0]){
                $('.main')[0].setAttribute('style','margin-left:120px')//页面居中
            }
        }, 2000)
    }
})()