Closed survtur closed 7 years ago
You can use progressListener to 'know' when print is done. But in fact this is not fully enough, the is need to add little more wait after this event. Here is sample code which print same content multiple times, which you can adapt with content modification.
// define progress listener object
var progressListener = {
stateIsRequest: false,
printing: false,
QueryInterface : function(aIID) {
if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
aIID.equals(Components.interfaces.nsISupports))
return this;
throw Components.results.NS_NOINTERFACE;
},
onStateChange : function(aWebProgress, aRequest, aStateFlags, aStatus) {
// alert('State Change -> State Flags:'+aStateFlags+' Status:'+aStatus);
if (aStateFlags == 131088) // 0x20010 = STATE_IS_DOCUMENT | STATE_STOP
this.printing = false;
return 0;
},
onLocationChange : function(aWebProgress, aRequest, aLocation) {
return 0;
},
onProgressChange : function(aWebProgress, aRequest,
aCurSelfProgress, aMaxSelfProgress,
aCurTotalProgress, aMaxTotalProgress){
// alert('Self Current:'+aCurSelfProgress+' Self Max:'+aMaxSelfProgress
// +' Total Current:'+aCurTotalProgress+' Total Max:'+aMaxTotalProgress);
// if (!this.printStarted)
// alert('started:'+this.copies);
this.printing = true;
},
onStatusChange : function(aWebProgress, aRequest, aStateFlags, aStatus) {
// alert('Status Change -> State Flags:'+aStateFlags+' Status:'+aStatus);
return 0;
},
onSecurityChange : function(aWebProgress, aRequest, aState){
return 0;
},
//onLinkIconAvailable : function(a){},
};
var mPrint = {
copies: 0,
print : function(copies) {
try {
jsPrintSetup.setGlobalOption('DEBUG', true);
jsPrintSetup.setPrinter('PDFCreator');
jsPrintSetup.clearSilentPrint();
jsPrintSetup.setPrintProgressListener(progressListener);
// jsPrintSetup.setOption('printSilent', 1);
this.copies = copies;
this.printNext();
// jsPrintSetup.setOption('printSilent', 0);
} catch (err) {
alert(err);
}
},
checkPrintNext: function() {
// check to printing on every 500ms
if (progressListener.printing) {
setTimeout('mPrint.checkPrintNext()', 500);
} else
mPrint.printNext();
},
printNext : function() {
if (this.copies > 0) {
jsPrintSetup.setOption('printSilent', 1);
jsPrintSetup.print();
jsPrintSetup.setOption('printSilent', 0);
this.copies--;
if (this.copies > 0) {
// give a time to browser to start printing and continue JS execution
setTimeout('mPrint.checkPrintNext()', 1000);
}
}
},
};
You can read more about progress listener at: https://github.com/edabg/jsprintsetup/wiki#setprintprogresslistener https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIWebProgressListener
Thank you very very much. I wonder why didn't I notice it in the docs. I have to donate this extension.
All methods I found run some code after printer settings dialog closed (or almost immediately in case of silent printing).
I need it to print page, change page content via JS and print again.