'use strict' import Browser from './browser' import Modal from './modal' import Pdf from './pdf' import Html from './html' import RawHtml from './raw-html' import Image from './image' import Json from './json' const printTypes = ['pdf', 'html', 'image', 'json', 'raw-html'] export default { init () { const params = { printable: null, fallbackPrintable: null, type: 'pdf', header: null, headerStyle: 'font-weight: 300;', maxWidth: 800, properties: null, gridHeaderStyle: 'font-weight: bold; padding: 5px; border: 1px solid #dddddd;', gridStyle: 'border: 1px solid lightgray; margin-bottom: -1px;', showModal: false, onError: (error) => { throw error }, onLoadingStart: null, onLoadingEnd: null, onPrintDialogClose: () => {}, onIncompatibleBrowser: () => {}, modalMessage: 'Retrieving Document...', frameId: 'printJS', printableElement: null, documentTitle: 'Document', targetStyle: ['clear', 'display', 'width', 'min-width', 'height', 'min-height', 'max-height'], targetStyles: ['border', 'box', 'break', 'text-decoration'], ignoreElements: [], repeatTableHeader: true, css: null, style: null, scanStyles: true, base64: false, // Deprecated onPdfOpen: null, font: 'TimesNewRoman', font_size: '12pt', honorMarginPadding: true, honorColor: false, imageStyle: 'max-width: 100%;' } // Check if a printable document or object was supplied const args = arguments[0] if (args === undefined) { throw new Error('printJS expects at least 1 attribute.') } // Process parameters switch (typeof args) { case 'string': params.printable = encodeURI(args) params.fallbackPrintable = params.printable params.type = arguments[1] || params.type break case 'object': params.printable = args.printable params.fallbackPrintable = typeof args.fallbackPrintable !== 'undefined' ? args.fallbackPrintable : params.printable params.fallbackPrintable = params.base64 ? `data:application/pdf;base64,${params.fallbackPrintable}` : params.fallbackPrintable for (var k in params) { if (k === 'printable' || k === 'fallbackPrintable') continue params[k] = typeof args[k] !== 'undefined' ? args[k] : params[k] } break default: throw new Error('Unexpected argument type! Expected "string" or "object", got ' + typeof args) } // Validate printable if (!params.printable) throw new Error('Missing printable information.') // Validate type if (!params.type || typeof params.type !== 'string' || printTypes.indexOf(params.type.toLowerCase()) === -1) { throw new Error('Invalid print type. Available types are: pdf, html, image and json.') } // Check if we are showing a feedback message to the user (useful for large files) if (params.showModal) Modal.show(params) // Check for a print start hook function if (params.onLoadingStart) params.onLoadingStart() // To prevent duplication and issues, remove any used printFrame from the DOM const usedFrame = document.getElementById(params.frameId) if (usedFrame) usedFrame.parentNode.removeChild(usedFrame) // Create a new iframe for the print job const printFrame = document.createElement('iframe') if (Browser.isFirefox()) { // Set the iframe to be is visible on the page (guaranteed by fixed position) but hidden using opacity 0, because // this works in Firefox. The height needs to be sufficient for some part of the document other than the PDF // viewer's toolbar to be visible in the page printFrame.setAttribute('style', 'width: 1px; height: 100px; position: fixed; left: 0; top: 0; opacity: 0; border-width: 0; margin: 0; padding: 0') } else { // Hide the iframe in other browsers printFrame.setAttribute('style', 'visibility: hidden; height: 0; width: 0; position: absolute; border: 0') } // Set iframe element id printFrame.setAttribute('id', params.frameId) // For non pdf printing, pass an html document string to srcdoc (force onload callback) if (params.type !== 'pdf') { printFrame.srcdoc = '