Blob URL 打印预览---后端返回pdf文件地址不在浏览器直接打开预览,进行下载,则可以通过设置请求头来实现

<script>
import lc from '@/utils/printDialog.js';
import { saveOrUpdateBatch, postPrintInfo } from '@/api/base/exWarehouse/baseWaveNumber.js';
export default defineComponent({
    setup(props) {
        const handleCommand = () => {
            const printParmas = {
                waveNo,
                printer: userName,
            };
            const printer = new lc.Printer();
            const pdfUrl = printer.pdf(printCode.value, printParmas);
            closeDialog();
            printer
                .silentPrint(printCode.value, printParmas)
                .then(() => {
                    ElMessage.success('打印成功!');
                })
                .catch(() => {
                    window.open(pdfUrl);
                });
        };
        return {
            handleCommand,
        };
    },
});
/* eslint-disable */
import axios from 'axios';
import md5 from 'js-md5';
import config from '../config/user.env';
import store from '@/store';
const whCode = store.getters.currentWarehouse.whCode;

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

    // 生成 token
    this.genToken = function (printCode, params, time) {
        //也可直接调api获取token
        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);
        return (
            baseUrl +
            stringFormat(
                '/pdf/{0}/{1}/{2}/{3}/{4}?{5}',
                printCode,
                time,
                tenantCode,
                userCode,
                token,
                getParamsStr(params, false)
            )
        );
    };

    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;
    };
    // 打开报表预览
    this.preview = function (printCode, params, postData) {
        var url = this.pdf(printCode, params);
        if (this.endWiths(url, '?')) {
            url = url.substr(0, url.length - 1);
        }

        if (postData === null || postData === undefined) {
            genLink(url);
        } else {
            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.defaults.withCredentials = false;
            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;
                resolve(response);
            }).catch(err => {
                reject(err)
                // alert('启动本地打印中转服务客户端')
            });
        })
    }
    // 获取到秒的时间戳,精确到秒*/
    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();
    }
    
    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;
    }

    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 lc;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小可爱的小飞云

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

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

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

打赏作者

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

抵扣说明:

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

余额充值