UNPKG

pdfmake

Version:

Client/server side PDF printing in pure JavaScript

118 lines (107 loc) 2.38 kB
import OutputDocument from '../OutputDocument'; import { saveAs } from 'file-saver'; /** * @returns {Window} */ const openWindow = () => { // we have to open the window immediately and store the reference // otherwise popup blockers will stop us let win = window.open('', '_blank'); if (win === null) { throw new Error('Open PDF in new window blocked by browser'); } return win; }; class OutputDocumentBrowser extends OutputDocument { /** * @returns {Promise<Blob>} */ getBlob() { return new Promise((resolve, reject) => { this.getBuffer().then(buffer => { try { let blob = new Blob([buffer], { type: 'application/pdf' }); resolve(blob); } catch (e) { reject(e); } }, result => { reject(result); }); }); } /** * @param {string} filename * @returns {Promise} */ download(filename = 'file.pdf') { return new Promise((resolve, reject) => { this.getBlob().then(blob => { try { saveAs(blob, filename); resolve(); } catch (e) { reject(e); } }, result => { reject(result); }); }); } /** * @param {Window} win * @returns {Promise} */ open(win = null) { return new Promise((resolve, reject) => { if (!win) { win = openWindow(); } this.getBlob().then(blob => { try { let urlCreator = window.URL || window.webkitURL; let pdfUrl = urlCreator.createObjectURL(blob); win.location.href = pdfUrl; // resolve(); /* temporarily disabled if (win === window) { resolve(); } else { setTimeout(() => { if (win.window === null) { // is closed by AdBlock window.location.href = pdfUrl; // open in actual window } resolve(); }, 500); } */ } catch (e) { win.close(); reject(e); } }, result => { reject(result); }); }); } /** * @param {Window} win * @returns {Promise} */ print(win = null) { return new Promise((resolve, reject) => { this.getStream().then(stream => { stream.setOpenActionAsPrint(); return this.open(win).then(() => { resolve(); }, result => { reject(result); }); }, result => { reject(result); }); }); } } export default OutputDocumentBrowser;