Javascript在循环对象时打印页面

时间:2016-01-05 05:13:46

标签: javascript firefox printing

我有一个网页,我用它通过我的笔记本电脑上的firefox'打印到文件'打印机将数据的“页面”打印为PDF文件。我正在调用的代码如下:

   document.body.controls.cmdPrint.click = function ()                              // Create a function that will be called when this object is clicked upon
   {if (parseInt(document.body.controls.page.innerHTML) !== 0)                      //  If we are not on the Front Cover
    {return false;}                                                                 //   Function complete: Abnormal Termination
    document.body.controls.style.pointerEvents = 'none';                            //  Lock down the controls so they cannot be interfered with
    do                                                                              //  Do...
    {window.print();                                                                //   Print this page
//   document.body.sleep(); // Removed as this does not work as expected (see below...)
    } while (document.body.controls.cmdNext.click())                                //   ...while we are able to advance.
    document.body.controls.style.pointerEvents = '';                                //  Release the controls lockout
    this.blur();                                                                    //  Blur the focus
    return true;};                                                                  // Function complete: Normal Termination

执行时,页面按预期方式翻转(因为cmdNext.click()函数在成功时返回true,在最后一页上尝试前进时返回false),但运行速度太快。即每个奇怪的页面都被捕获,因为“打印机”不可用....在打印机准备好下一页之前,window.print()正在被释放。

我尝试通过在循环中添加对辅助函数的引用来减慢执行速度(现在已注释掉),但这只会锁定CPU并使打印机不能在另一个线程中处理....所以它不是有效的解。这个功能(我写的但没有提供允许奇数页打印的预期缓冲)如下。

   document.body.sleep = function (delay)                                           // Create a new function
   {delay = delay || 1;                                                             //  Default to a delay of 1 second
    var timestamp = new Date();                                                     //  Get current time
    timestamp = new Date(timestamp.getTime() + (delay * 1000));                     //  Add in the delay (in seconds)
    while (new Date() < timestamp) {}                                               //  While we are waiting for the delay, do nothing
    return true;};                                                                  // Function complete: Normal Termination

基本上我需要的是一种保持循环执行足够长的方法,让'Print to File'在调用下一个window.print()之前完成。使用上面的sleep函数也会阻止window.print()运行(当我试图将它用作修复时)我在window.print()命令之后立即调用了这个函数。

所以我问,这里的任何人都可以为这个项目提供修复,所以我不必手动循环浏览每个页面(页面数量超过10时,这可能会在时间上非常昂贵)?

就目前而言,当第二页尝试打印时,我从弹出窗口看到来自firefox的错误:“打印机错误 - 某些打印功能当前不可用。”跟踪此向下导致PERR_NOT_AVAILABLE ....可能是因为打印机(打印到文件)正忙于打印前一页....所以我只需要等待它解决才能进行下一次打印。一个错误处理程序来捕获这个PERR_NOT_AVAILABLE而不是让它反弹给用户(我)作为一个必须被点击的弹出窗口会很好,虽然这是一种垃圾邮件方式,可以像打印一样快速地打印页面到文件系统可以处理它们。

如果window.print()在这种情况下实际返回错误,我可以重新运行命令......

1 个答案:

答案 0 :(得分:0)

在我的实验中,我发现了这种解决方法......它被认为是一种很好的解决方案,但在没有更优雅的解决方案的情况下,它可以正常运行。

document.body.controls.cmdPrint.click = function ()                              // Create a function that will be called when this object is clicked upon
{if (parseInt(document.body.controls.page.innerHTML) !== 0)                      //  If we are not on the Front Cover
 {return false;}                                                                 //   Function complete: Abnormal Termination
 document.body.controls.style.pointerEvents = 'none';                            //  Lock down the controls so they cannot be interfered with
 window.onafterprint = function ()                                               //  Set up a handler for after a print operation
 {setTimeout(function ()                                                         //   Run a delayed operation
  {if (document.body.controls.cmdNext.click())                                   //    Move to next page and if this is successful
   {window.print();                                                              //    Continue printing
    return false;}                                                               //    Function complete: Still Printing
   do                                                                            //   Do nothing...
   {} while (document.body.controls.cmdPrevious.click())                         //    ...while we cycle back to the start
   document.body.controls.style.pointerEvents = '';                              //   Release the controls lockout
   this.blur();                                                                  //   Blur the focus
   window.onafterprint = function () {};                                         //   Remove this handler
   return true;}, 2000);};                                                       //   Function complete: Normal Termination
 window.print();                                                                 //  Begin printing the page
 return true;};                                                                  // Function complete: Normal Termination

如果页面太复杂而无法在2秒内打印到PDF,那么必须增加setTimeout()中的2000数字才能解决这个问题。对于我的测试用例(当前的7页文档),2000似乎是Firefox在我的系统上允许的非工作和吐出页面之间的最佳位置。