我有一个网页,我用它通过我的笔记本电脑上的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()在这种情况下实际返回错误,我可以重新运行命令......
答案 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在我的系统上允许的非工作和吐出页面之间的最佳位置。