头两天客户提了一个需求,原来某个业务流程doc文档预览网页弹窗上,要添加一一键打印按钮时间没做限制,但是要求尽量打印出来的效果预览弹窗上的尽可能的一致。

        由于文档预览窗口效果,是用JS和CSS模拟doc文本显示效果做的,本质还是HTML那套。一开始想的直接将HTML元素print打印出来,但是一看打印窗口的效果,简直不忍直视,要是一点点的改,麻烦不说,后期要是还有别的文档打印,那岂不是个自己挖了个坑。。。

        于是这条路子就给否了。

        接下来想的是,通过打印插件来搞,比如lodop啥的,忙活了一两个小时,发现,这东西确实是好东西,但是以事业单位客户电脑系统版本的混乱程度以及对电脑的使用程度,让他们配合安装一个插件,还得确保插件功能不出问题,想想都不太实际。

        于是插件这条路,也挂了。

        一遍苦思冥想,一遍查资料,既要不用插件,又要保证打印出来,效果尽可能与预览窗口一样。想来想去,还有一条可以试试,就是将预览窗口的DOM元素,转成高清图片,然后img标签显示这个高清图片,最后这个高清图片给打印出来。

        试了一下,确实可行,666~~~

        1、安装  html2canvas 

        将DOM元素转成图片,我用的是 html2canvas在线安装方式有这么几种

        方式1:npm installsave html2canvas
        方式2:yarn add html2canvas

        不过有的开发环境是不能连接互联网的,比如一些事业单位、政府单位啥的,可以自行下载html2canvas.js或者压缩版本html2canvas.min.js然后直接script方式引入需要使用这个js库的html文件中。

        这里我提供一个安装包,直接放到前端项目工程node_modules文件夹里,使用html2canvas时,引用一下………/node_modules/html2canvas/dist/html2canvas即可

传送门 >>  html2canvas,无需命令安装,直接拷贝引用即可

        2、相应的DOM元素转图片,并打印

        先上菜鸡代码。。。我给弄成组件了,比较关键的代码片段如下

let boxObj=document.getElementById(nextProps.data.targetAreaID)//targetAreaID,预览DOC文档DIV容器的ID
          if(boxObj){
            const that=this
            html2canvas(boxObj,{scale:3}).then(function(canvas){//将目标DOM区域targetAreaID)转为高清图片,并将高清图片显示printerID里用于打印
              const imgURL=canvas.toDataURL()
              // console.log('imgURL=',imgURL)
              that.setState({printImgURL:imgURL},()=>{
                setTimeout(() => {
                  //将显示出来的高清图片,进行打印
                  let docPreviewObj=document.getElementById(nextProps.data.printerID)
                  if(docPreviewObj){
                    let printWinTmp=window.open("","_blank","height=700,width=1300,top=200,left=300")
                    printWinTmp.document.write(docPreviewObj.innerHTML)
                    printWinTmp.document.close()
                    printWinTmp.print()
                    printWinTmp.close()
                  }
                }, 500);
                setTimeout(() => {
                  that.setState({printImgURL:''})
                  nextProps.data.setIsReadToPrint(false)
                }, 2000);
              })
            })
          }

        targetAreaID,是预览DOC文档DIV容器的ID。

        printerID,是盛放转出来的高清图片IMG标签的DIV的ID。

        canvas.toDataURL()拿到的图片是base64的,所以可以用img来显示

        另外,html2canvas(boxObj,{scale:3})里的scale数值设置的越大,图片就越清晰,但是生成的时间就会越长,具体设置多少,根据自己需求效果定。

        最后,成功调出了浏览器的打印服务,完结撒花~~~       

原文地址:https://blog.csdn.net/weixin_38343072/article/details/129952557

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_30504.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注