页面打印,lodop使用笔记

需求通过编写前端页面实现多次打印。记下要点。

1. 分页

  css自带分页样式: page-break-after: always;page-break-before:always。

  在某些打印工具下可能会出现空白页。我遇到的情况是,每个页面的包裹div和页面差不多大,加上分页符就多了一页。我把页面包裹div高度减少,这样每页内容不变高度减少都加上分页也没问题。可以试试控制最后一页不加分页样式,我记得我没成功。

2.打印插件 vue-print-nb

   我使用vue写的页面,最开始使用 vue-print-nb 打印插件,用起来很方便,把需要打印的内容放id在 一个用v-print触发就好。<button v-print="'#printMe'">Print local range</button>

  但是除了新版chrome外,使用系统打印工具的浏览器都不能设定好打印样式,不能缩放等,所以放弃了。

  后来改用lodop,这是付费插件,好在公司买过了。

 

3.lodop

   lodop可以使用自带指令编写打印内容,但是我建议使用html的方式,毕竟最为前端,使用起来方便灵活点。

  (1)官网下载软件包和文档。软件包有三个安装包一个初始化js和一堆示例。

    

    chrome和火狐吧用需要安装第一个,IE区分32和64位,引入第四个文件 LodopFuncs.js后页面会提示。

  (2)官方推荐使用 LodopFuncs.js,但是在使用之前需要对这个js进行改造。

      首先,需要把外部需要使用的 getLodop() 暴露出去,只需要在最后 export default getLodop,然后在vue里import一下就可以使用了: import getLodop from './LodopFuncs'。

      其次,最好修改一下提示的文件地址,或者按需删除地址修改提示。

      我的这个项目引用element,由于提示采取js拼接dom的方式,出现提示页面就会卡死,我引用MessageBox : import { MessageBox } from 'element-ui'; 通过MessageBox 进行提示,解决问题。

      最后,在js最后添加注册号,官方就是个坑,官方红字地方的代码复制下来不能用,下图标示的地方下划线应该是 _ 一个,而那地方是 __ 两个,删一个~~~~

      

  (3) 使用lodop,代码如下。

 lodop() {
      LODOP = getLodop();
      if (LODOP) {
        //获取css字符串 采用js传入
        var strBodyStyle = `<style>${strStyle}</style>`
        //拼接超文本
        var strFormHtml = strBodyStyle + "<body>" + document.getElementById("printTest").innerHTML + "</body>";
        LODOP.PRINT_INIT("打印综合二维码面单");
        //添加打印
        LODOP.ADD_PRINT_HTM(0, '1mm', '120mm', '200mm', strFormHtml);
        //设置预览界面预览显示模式和大小 0为适高
        LODOP.SET_PREVIEW_WINDOW(0, '', '', '600', '800', '');
        //设置打印 缩放比例
        LODOP.SET_PRINT_MODE("PRINT_PAGE_PERCENT", '50%');
        //设置打印请求结束后自动关闭预览
        LODOP.SET_PRINT_MODE("AUTO_CLOSE_PREWINDOW", true);
        // 预览  LODOP.PRINT();为直接打印
        LODOP.PREVIEW();
      }
    }

    ###  遇到一个问题是,css不能加载。没有样式,这就很酸爽了, vue-print-nb就不存在这个问题。官方提供方法:

//获取<style id="style1">的内容拼接
var strBodyStyle="<style>"+document.getElementById("style1").innerHTML+"</style>";
var strFormHtml=strBodyStyle+"<body>"+document.getElementById("form1").innerHTML+"</body>";

//直接写样式内容 拼接
var strBodyStyle="<style>table,td { border: 1 solid #000000;border-collapse:collapse }</style>";
var strFormHtml=strBodyStyle+"<body>"+document.getElementById("form1").innerHTML+"</body>";

//获取外部样式拼接
var strStyleCSS="<link href='PrintSample10.css' type='text/css' rel='stylesheet'>";
var strFormHtml="<head>"+strStyleCSS+"</head><body>"+document.getElementById("form1").innerHTML+"</body>";

    第一三的方法很好,但不知什么原因我没成功~~~~~~~~~~~

    然后只好使用第二种方法,但是直接在逻辑代码里写css字符串显得有点怪怪的,所以我复制所有css内容放在另一个js文件里然后用``包裹成字符串,然后 export 出去,在打印逻辑引用就好了。用``包裹嗨可以保留css结构。

     

    ###  其他问题比如需要设置缩放什么的,前面的代码都有,也写了注释。

4. 另外打印二维码使用 jrQrcode,条形码使用 JsBarcode,使用都很简单。

  JsBarcode是生成Base64,纯数据,可以在获取打印数据的地方直接使用,而jrQrcode需要获取dom,需要dom渲染完成才能使用。vue使用this.$nextTick(() => { fun() })。

  lodop打印也是需要获取dom,也需要使用this.$nextTick(() => { fun() })。

 

posted @ 2019-07-29 13:52  高崇乐  阅读(2018)  评论(0编辑  收藏  举报