maandag 9 januari 2017

Print directly from Chrome

Als je een PDF direct wilt printen vanuit Chrome, dan kun je de PDF laden in een hidden iframe en vervolgens "print()" te roepen tegen het contentWindow van de iframe.

Helaas!

Chrome heeft een bug waardoor de readyState niet veranderd als je een binary laadt in een iframe! Je weet dus niet wanneer de PDF geheel is ingeladen.
Hoe kom je uit deze situatie?
Door de PDF te laden in een Javascript Blob en vervolgens een interne URL te maken naar deze Blob. Via deze route werkt het onload event wel.

Zie hieronder de code:


function print() {
var printData = _base64ToArrayBuffer(base64PdfBytesFromServer);
var printBlob = new Blob([printData], { type: "application/pdf" });
window.printPdfLoaded = function() {
$("#thePDF")[0].contentWindow.print();
URL.revokeObjectURL(internalUrl);
}
var internalUrl = URL.createObjectURL(printBlob);
var ifr=$('<iframe/>', {
id: 'thePDF',
src: internalUrl,
style: 'display:none',
onload: 'window.printPdfLoaded()'
});
$(document.body).append(ifr);
}

function _base64ToArrayBuffer(base64) {
var binary_string = window.atob(base64);
var len = binary_string.length;
var bytes = new Uint8Array( len );
for (var i = 0; i < len; i++)        {
bytes[i] = binary_string.charCodeAt(i);
}
return bytes.buffer;
}

Geen opmerkingen:

Een reactie posten