【代码】jdbc数据源 pdf预览 前端打印预览

const p = {};
p.Printer = function (options) {
    // 默认配置
    var defaults = {
        tenantCode: config.printTenantCode, // 租户
        userCode: config.printUserCode, // 用户
        baseUrl: `${config.printUrl}/T-LPAAS/logistics-paas-printer`, // 网关
        printerJsonKey: '__printerJson',
        printUrl: 'http://129.0.0.1:19999/report/' // 打印客户端中转服务
    };
    this.opts = Object.assign(defaults, options);
    var split = ';'; // 数组参数 分隔符

    // 生成 token*/
    this.genToken = function (printCode, params, time) {
        /*
        * 打印模板编号值+ 时间戳+租户编码+用户编码+非空动态业务参数拼接  utf-8编码取md5的hash值
        * 也可直接调api获取token https://apisit.midea.com/T-LPAAS/logistics-paas-printer/pdf/token/distribution_order/T881914257/MC225206943?etdoNo=T2009186745920&etdoNo=T2009186745921&userId=150
        */
        var tenantCode = this.opts.tenantCode;
        var userCode = this.opts.userCode;

        // 打印模板编号值+ 时间戳+租户编码+用户编码+非空动态业务参数拼接  utf-8编码取md5的hash值
        var token = md5(
            printCode +
            time +
            tenantCode +
            userCode +
            getParamsStr(params, true)
        );

        return token;
    };

    // 获取pdf url
    this.pdf = function (printCode, params) {
        var time = this.getTime();
        var tenantCode = this.opts.tenantCode;
        var userCode = this.opts.userCode;
        var baseUrl = this.opts.baseUrl;

        var token = this.genToken(printCode, params, time);

        // 构建url
        return (
            baseUrl +
            stringFormat(
                '/pdf/{0}/{1}/{2}/{3}/{4}?{5}',
                printCode,
                time,
                tenantCode,
                userCode,
                token,
                getParamsStr(params, false)
            )
        );
    };
//该函数用于打开报表的跨域预览。
//打开一个空的窗口。
//构造一个HTML表单,并将表单的内容写入到打开的窗口中,获取表单元素并提交表单。
    this.corsPreview = function (printCode, params, postData) {
        var printerJsonKey = this.opts.printerJsonKey;
        var url = this.pdf(printCode, null);
        if (this.endWiths(url, '?')) {
            url = url.substr(0, url.length - 1);
        }
        var printerIframe = window.open('', '');
        var html =
        "<form id='__printerForm' method='post' action='" +
        url +
        "'><textarea style='visibility: hidden;'  name='" +
        printerJsonKey +
        '>' +
        postData +
        '</textarea></from>';
        printerIframe.document.write(html);
        var printerForm = printerIframe.document.getElementById(
            '__printerForm'
        );
        printerForm.submit();
    };
    this.endWiths = function (str, target) {
        var start = str.length - target.length;
        var arr = str.substr(start, target.length);
        if (arr === target) {
            return true;
        }
        return false;
    };
    /打开报表预览*/
//该函数调用pdf方法生成一个URL,用于打开报表的预览

    this.preview = function (printCode, params, postData) {
        var url = this.pdf(printCode, params);
        if (this.endWiths(url, '?')) {
        //检查URL是否以'?'结尾,若是则截取掉最后一个字符
            url = url.substr(0, url.length - 1);

        }

        if (postData === null || postData === undefined) {
            genLink(url);
        } else {
//使用axios发送POST请求,并在请求成功后下载响应的数据
            axios({
                url: url,
                method: 'POST',
                headers: { 'Content-Type': 'application/json;charset=UTF-8' },
                data: postData,
                responseType: 'blob'
            }).then((res) => {
                const downloadElement = document.createElement('a');
                try {
                    downloadElement.href = window.URL.createObjectURL(res.data);
                } catch (error) {
                    downloadElement.href = res.config.url;
                }
                downloadElement.target = '_blank';
                document.body.appendChild(downloadElement);
                downloadElement.click();
            });
        }
    };
    this.silentPrint =function(printCode, params, postData) {
        const that = this;
        return new Promise(function(resolve, reject) {
            if (postData === null || postData === undefined) {
                postData = '{}';
            }
            var url = that.pdf(printCode, params);
            var printData = {
                url: url,
                postData: postData,
                _report: printCode
            };
            var printUrl = that.opts.printUrl;
            axios({
                url: printUrl,
                method: "POST",
                data: printData,
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
                },
                transformRequest: [
                    function (data) {
                        let ret = ''
                        for (let it in data) {
                            if (data.hasOwnProperty(it)) {
                                ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
                            }
                        }
                        ret = ret.substring(0, ret.lastIndexOf('&'));
                        return ret
                    }
                ]
            }).then(res => {
                let response = {};
                response = res;
                // if (Object.prototype.toString.call(res) === '[Object Object]') {
                //     response = res;
                // } else {
                //     response = JSON.parse(res);
                // }
                // alert(response.msg);
                resolve(response);
            }).catch(err => {
                reject(err)
            });
        })
    }
    // 获取到秒的时间戳,精确到秒*/
    this.getTime = function () {
        var time = Date.parse(new Date()).toString();
        return time.substr(0, 10);
    };

    function genLink(href) {
        var a = document.createElement('a');
        a.setAttribute('href', href);
        a.setAttribute('target', '_blank');
        document.body.appendChild(a);
        a.click();
    }
//遍历params对象的每个属性,属性值是数组:
//type为true,函数将直接连接数组的每个元素。
//type为false,函数将对每个数组元素使用encodeURIComponent编码,并以&连接符拼接字符串。

//非数组类型的参数值:
//type为true,函数直接连接参数值。
//type为false,函数将参数名和使用encodeURIComponent编码后的参数值以&连接符拼接字符串。type为false且生成的查询字符串不为空,将去除第一个&连接符
    function getParamsStr(params, type) {
        var paramsStr = '';
        if (params === null) {
            return paramsStr;
        }
        for (var param in params) {
            if (params.hasOwnProperty(param)) {
                var value = params[param].toString();
                if (value.indexOf(split) !== -1) {
                    var arr = value.split(split);
                    for (var index in arr) {
                        if (type) {
                            paramsStr += arr[index];
                        } else {
                            paramsStr +=
                            '&' + param + '=' + encodeURIComponent(arr[index]);
                        }
                    }
                } else {
                    if (type) {
                        if(Array.isArray(params[param])){
                            params[param].forEach((item)=>{
                                paramsStr += item
                            })
                        }else{
                        paramsStr += params[param];
                        }
                    } else if(Array.isArray(params[param])){
                        params[param].forEach((item)=>{
                            paramsStr +=
                        '&' + param + '=' + encodeURIComponent(item);
                        })
                    } else {
                        paramsStr +=
                        '&' + param + '=' + encodeURIComponent(params[param]);
                    }
                }
            }
        }

        if (type === false && paramsStr.length > 0) {
            paramsStr = paramsStr.substr(1);
        }
        return paramsStr;
    }
//该函数用于将字符串中的占位符{}替换为传入的参数值
//遍历从第二个参数开始的剩余参数,依次替换占位符。
//使用正则表达式和replace方法,全局且不区分大小写的替换。

    function stringFormat() {
        if (arguments.length === 0) return null;
        var str = arguments[0];
        for (var i = 1; i < arguments.length; i++) {
            var re = new RegExp('\\{' + (i - 1) + '\\}', 'gm');
            str = str.replace(re, arguments[i]);
        }
        return str;
    }
};

export default p;
import p from '@/utils/print.js';          
const printer = new p.Printer();
const pdfUrl = printer.pdf(printCode.value, printParmas);
closeDialog();
printer
      .silentPrint(printCode.value, printParmas)
      .then(() => {
              ElMessage.success('打印成功!');
           })
           .catch(() => {
               window.open(pdfUrl);
           });

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小可爱的小飞云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值