Я создаю список PDF-файлов в HTML. В список я хотел бы включить ссылку для скачивания и кнопку / ссылку для печати. Есть ли способ напрямую открыть диалоговое окно «Печать» для PDF-файла, чтобы пользователь не видел PDF-файл или не открывал программу просмотра PDF-файлов?
Какой-то вариант загрузки PDF-файла в скрытый iframe и запуск его для печати с помощью JavaScript?
источник
Вот функция для печати PDF-файла из iframe.
Вам просто нужно передать URL-адрес PDF в функцию. Он создаст iframe и запустит печать после загрузки PDF.
Обратите внимание, что функция не уничтожает iframe. Вместо этого он повторно использует его каждый раз при вызове функции. Трудно уничтожить iframe, потому что он нужен до тех пор, пока печать не будет выполнена, а метод печати не имеет поддержки обратного вызова (насколько мне известно).
printPdf = function (url) { var iframe = this._printIframe; if (!this._printIframe) { iframe = this._printIframe = document.createElement('iframe'); document.body.appendChild(iframe); iframe.style.display = 'none'; iframe.onload = function() { setTimeout(function() { iframe.focus(); iframe.contentWindow.print(); }, 1); }; } iframe.src = url; }
источник
setTimeout
нее функция печати иногда не работает. Не знаю почему и надеюсь, что кто-то это узнает.onafterprint
. Меня немного беспокоит, что повторное использование iframe может вызвать условия гонки, когда кто-то быстро нажимает две кнопки и в конечном итоге дважды распечатывает второй PDF-файл, потому что URL-адрес iframe уже был заменен до появления первого диалогового окна печати.Загрузите Print.js с http://printjs.crabbly.com/
$http({ url: "", method: "GET", headers: { "Content-type": "application/pdf" }, responseType: "arraybuffer" }).success(function (data, status, headers, config) { var pdfFile = new Blob([data], { type: "application/pdf" }); var pdfUrl = URL.createObjectURL(pdfFile); //window.open(pdfUrl); printJS(pdfUrl); //var printwWindow = $window.open(pdfUrl); //printwWindow.print(); }).error(function (data, status, headers, config) { alert("Sorry, something went wrong") });
источник
https://github.com/mozilla/pdf.js/
для живой демонстрации http://mozilla.github.io/pdf.js/
это, вероятно, то, что вы хотите, но я не вижу в этом смысла, поскольку современные браузеры включают такую функциональность, а также он будет работать ужасно медленно на маломощных устройствах, таких как мобильные устройства, которые, кстати, имеют свои собственные оптимизированные плагины и приложения .
источник
Я использовал эту функцию для загрузки потока pdf с сервера.
function printPdf(url) { var iframe = document.createElement('iframe'); // iframe.id = 'pdfIframe' iframe.className='pdfIframe' document.body.appendChild(iframe); iframe.style.display = 'none'; iframe.onload = function () { setTimeout(function () { iframe.focus(); iframe.contentWindow.print(); URL.revokeObjectURL(url) // document.body.removeChild(iframe) }, 1); }; iframe.src = url; // URL.revokeObjectURL(url) }
источник
Кроссбраузерное решение для печати pdf из строки base64:
.
const blobPdfFromBase64String = base64String => { const byteArray = Uint8Array.from( atob(base64String) .split('') .map(char => char.charCodeAt(0)) ); return new Blob([byteArray], { type: 'application/pdf' }); }; const isIE11 = !!(window.navigator && window.navigator.msSaveOrOpenBlob); // or however you want to check it const printPDF = blob => { try { isIE11 ? window.navigator.msSaveOrOpenBlob(blob, 'documents.pdf') : printJS(URL.createObjectURL(blob)); // http://printjs.crabbly.com/ } catch (e) { throw PDFError; } }; printPDF(blobPdfFromBase64String(base64String))
БОНУС - открытие файла BLOB-объекта в новой вкладке для IE11
Если вы можете выполнить некоторую предварительную обработку строки base64 на сервере, вы можете открыть ее под каким-либо URL-адресом и использовать ссылку в
printJS
:)источник