您当前的位置:主页 > 技术探讨 >

    打印功能开发攻略

    时间:2021-07-02 10:37 日记人:arlen.zhou

     
    本次项目遇到巨坑,此次项目因为涉及硬件一体,类似银行大厅的机器,需要你刷身份证读取,开发者需要留意的是 object调取三方注册控件时候所产生的坑。。
     
     <object id="LODOP_OB" classid="clsid:2105C259-1E0C-4534-8141-A753534CB4CA" width=0 height=0>
        <embed id="LODOP_EM" type="application/x-print-lodop" width=0 height=0></embed>
      </object>
      <object id="CMTSiCardCtrl" width="0" height="0" classid="clsid:83B8BF6B-47E8-4EA6-8469-FACE69C09708" align="center"
        codebase="MTIDCard.cab#version=1,0,0,1" hspace="0" vspace="0">
      </object>
     
    涉及知识技术:Lodop、C-Lodop  js  print  ie11 vue
     
    pdf转img   方法代码,主要用了pdf.js   pdf.worker.min.js  这个坑主要用于ie浏览器,不兼容pdf问题。不过最后出于性能考虑 ,还是后端用转成图片使用。。前后端 都可以将pdf转图片。。。

     
    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.2.228/pdf.min.js" type="text/javascript"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.2.228/pdf.worker.min.js" type="text/javascript"></script> 
       //url参数是pdf地址,imgUrl是最后的base64格式图片
          showPdf = function () {
            var url = '3477706119731759459.pdf';
            let _this = this;
            let imgArr = [];
            pdfjsLib.workerSrc = 'pdf.worker.js';
            let loadingTask = pdfjsLib.getDocument(url);
     
            loadingTask.promise.then(function (pdf) {
              console.log('PDF loaded');
              let pageNum = pdf.numPages;
              // console.log(pageNum);
              for (let i = 1; i <= pageNum; i++) {
                pdf.getPage(i).then(function (page) {
                  console.log('Page loaded');
     
                  let scale = 2;
                  let viewport = page.getViewport(scale);
                  var CSS_UNITS = 96.0 / 72.0;
     
                  // let canvas = document.getElementById('the-canvas');
                  let canvas = document.createElement("canvas");
                  let context = canvas.getContext('2d');
                  // canvas.height = viewport.height;
                  // canvas.width = viewport.width;
     
                  canvas.height = Math.floor(viewport.height * CSS_UNITS);
                  canvas.width = Math.floor(viewport.width * CSS_UNITS);
     
                  let renderContext = {
                    transform: [CSS_UNITS, 0, 0, CSS_UNITS, 0, 0],
                    canvasContext: context,
                    viewport: viewport
                  };
                  let renderTask = page.render(renderContext);
                  renderTask.then(function () {
                    console.log('Page rendered');
                    let imgUrl = canvas.toDataURL('image/jpeg'); //转换为base64
                    if (imgUrl) {
                      imgArr[i - 1] = imgUrl;
                    }
                    console.log(imgUrl);
                    document.getElementById("img-url").src = imgUrl;
     
                  });
                });
              }
            }, function (reason) {
              console.error(reason);
            });
     
            function isEmpty(arr) {
              for (let i = 0; i < arr.length; i++) {
                if (!arr[i])
                  return true;
              }
              return false;
            }
          }

    感悟:各位看官,以后如果项目涉及到打印功能,我推荐使用三方控件打印,浏览器的打印,除非是使用谷歌,否则还是用 c-lodop吧! (c-lodop或者其他的三方控件,虽然是要给几百块钱的,但是可以方便很多,整体来说还是比较值)
    这个项目太难了搞不动了???不可能的~~~哈哈哈。。。。