Buduję listę plików PDF w HTML. Na liście chciałbym zamieścić link do pobrania i przycisk / łącze drukowania. Czy istnieje sposób na bezpośrednie otwarcie okna dialogowego Drukuj dla pliku PDF, bez oglądania pliku PDF przez użytkownika lub otwierania przeglądarki PDF?
Jakieś warianty pobierania pliku PDF do ukrytego elementu iframe i uruchamiania go do drukowania za pomocą JavaScript?
źródło
Oto funkcja drukowania pliku PDF z elementu iframe.
Musisz tylko przekazać adres URL pliku PDF do funkcji. Utworzy ramkę iframe i uruchomi drukowanie po załadowaniu pliku PDF.
Zwróć uwagę, że funkcja nie niszczy elementu iframe. Zamiast tego używa go ponownie za każdym razem, gdy funkcja jest wywoływana. Trudno jest zniszczyć element iframe, ponieważ jest potrzebny do zakończenia drukowania, a metoda drukowania nie obsługuje wywołań zwrotnych (o ile wiem).
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; }
źródło
setTimeout
funkcji drukowania czasami zawodzi. Nie mam pojęcia, dlaczego i mam nadzieję, że ktoś się o tym dowie.onafterprint
. Trochę obawiam się, że ponowne użycie elementu iframe może wprowadzić warunki wyścigu, w których ktoś szybko klika dwa przyciski i kończy się dwukrotnym wydrukowaniem drugiego pliku PDF, ponieważ adres URL elementu iframe został już zamieniony przed pojawieniem się pierwszego okna dialogowego drukowania.Pobierz Print.js ze strony 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") });
źródło
https://github.com/mozilla/pdf.js/
do demonstracji na żywo http://mozilla.github.io/pdf.js/
prawdopodobnie tego chcesz, ale nie widzę sensu, ponieważ nowoczesne przeglądarki zawierają taką funkcjonalność, a także będzie działać strasznie wolno na urządzeniach o niskim poborze mocy, takich jak urządzenia mobilne, które, nawiasem mówiąc, mają własne zoptymalizowane wtyczki i aplikacje .
źródło
Użyłem tej funkcji do pobrania strumienia pdf z serwera.
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) }
źródło
Rozwiązanie dla różnych przeglądarek do drukowania plików PDF z ciągu 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))
BONUS - Otwieranie pliku blob w nowej karcie dla IE11
Jeśli jesteś w stanie wykonać wstępne przetwarzanie ciągu base64 na serwerze, możesz go ujawnić pod jakimś adresem URL i użyć linku w
printJS
:)źródło