window.print react+antd 分页打印 去掉页眉页脚

框架:react+antd

查看demo->A4打印
查看demo->A4表格分页打印
代码仓库:https://gitee.com/chenxiaoyi27/rc-comp
代码路径:/src/views/components/printA4

一、代码:

window.print();

二、分页打印+谷歌打印的css样式

我这里是表格的打印,表格数据很多,打印时需要分页。浏览器打印工具自动分页,Table的表头会自动显示在第2页上,但是顶着第2页的顶部,没有上边距,且上一页页尾也没有下边距,还有表格行拆开的样式。

为了解决这些样式丑的问题,决定手动分页。未打印状态显示完整的1个表格,打印状态时,将1个表格拆成多个表格,代码如下:(适合表格每行只显示1行

打印样式须知:A4打印,css页面宽高为:210mm*297mm,适中的边距为:上下25.4mm,左右19.1mm。)

this.state={
	tableData: [],//表格数据
	printSize: 25//分页后每页数据条数
};
//js
	splitTable() {//打印时表格分离
        let { tableData, printSize } = this.state, tables = [], i = 0;
        for (i = 0; i < parseInt(tableData.length / printSize); i++) {
            let tmp = [];
            for (let j = i * printSize; j < (i + 1) * printSize; j++) {
                tmp.push(tableData[j]);
            }
            tables.push(tmp);
        }
        if (tableData.length % printSize !== 0) {
            let tmp = [];
            for (let j = i * printSize; j < tableData.length; j++) {
                tmp.push(tableData[j]);
            }
            tables.push(tmp);
        }
        return tables.map((item, index) => {
            return <div key={index} className="printTable">
                {index !== 0 && <p style={{ height: '25.4mm' }} />}{/*25.4mm是上下边距*/}
                <Table columns={this.columns} dataSource={item} pagination={false}
                    size="small" bordered rowKey={record => record.id}
                />
                <div style={{ pageBreakAfter: 'always' }} />{/*分页符*/}
            </div>
        });
    }

//html
render () {
let {printState, tableData, printSize} = this.state;
return <div className="print-wrap">
	<div className="print-content">
	{!printState || tableData.length < printSize ?  //不是打印状态或表格数据只有1页时
		<div className="printOneTable">
			<Table columns={this.columns} dataSource={tableData} pagination={false}
				size="small" rowKey={record => record.id}
			 />
		</div> :
		this.splitTable()
	}
	</div>
</div>
}
//css
.print-wrap{
	width: 210mm;
}
.print-content{
	@page {
      margin: 0;
    }
}
.printTable {
	height: 271.6mm;
	padding: 0 19.1mm;
	@page {
        margin: 0;
	}
}
.printOneTable {
	height: 271.6mm;
	padding: 0 19.1mm;
}

说明:
1)拆成多个Table后,每个Table前加一个高度为上边距的p元素,直接用margin-top会有塌陷问题。
2)设置每个Table页的高度为(297mm-上边距)。
3)每次循环最后加一个分页符<div style={{ pageBreakAfter: 'always' }} />,不加的话会出现多页打印,最后一页有页脚(网址和页码)的问题。单页打印可不加。
4)splitTable()分离表格数据的方法通用。
5)谷歌打印去除页眉页脚用css即可。

三、ie浏览器去除页眉页脚

分页同上述 二 。
ie的打印去除页眉页脚需要用到注册表,以下代码通用:

// 打印去掉页眉页脚
    printPage(callback) {//除ie外,其余浏览器需要给最外层容器添加css:@page{margin:0}
        function pagesetup_null() {
            var HKEY_Path = 'HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\PageSetup\\'; // 定义注册表位置
            // name的值可为header(页眉),footer(页脚),margin_bottom(下边距),margin_left(左边距),margin_right(右边距),margin_top(上边距)。
            function PageSetup(name, value, onSuccess, onFail) {
                try {
                    var Wsh = new window.ActiveXObject('WScript.Shell');
                    Wsh.RegWrite(HKEY_Path + name, value); // 修改注册表值
                    onSuccess && onSuccess();
                } catch (e) {
                    onFail & onFail();
                }
            }
            PageSetup(
                'footer',
                '',
                () => PageSetup('header', '', () => window.print(), () => Message.modalError('需要运行ActiveX对象后,才能进行打印设置。')),
                () => Message.modalError('需要运行ActiveX对象后,才能进行打印设置。')
            );
        }
        if (Util.isIE()) {
            pagesetup_null();
        } else {
            window.print();
        }
        callback && callback();
    },

使用此方法,若提示‘需要运行ActiveX对象后,才能进行打印设置。’则需要进行如下操作:
internet选项-安全-自定义级别-ActiveX控件和插件-对未标记为可安全执行脚本的ActiveX控件初始化并执行脚本(不安全)-启用(不安全)

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值