/** * @license * * MIT License * * Copyright (c) 2017 Erik Koopmans * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /** * Generate a PDF from an HTML element or string using html2canvas and jsPDF. * * @param {Element|string} source The source element or HTML string. * @param {Object=} opt An object of optional settings: 'margin', 'filename', * 'image' ('type' and 'quality'), and 'html2canvas' / 'jspdf', which are * sent as settings to their corresponding functions. */ var html2pdf = (function(html2canvas, jsPDF) { /* ---------- MAIN FUNCTION ---------- */ var html2pdf = function(source, opt) { // Handle input. opt = objType(opt) === 'object' ? opt : {}; var source = html2pdf.parseInput(source, opt); // Determine the PDF page size. var pageSize = jsPDF.getPageSize(opt.jsPDF); pageSize.inner = { width: pageSize.width - opt.margin[1] - opt.margin[3], height: pageSize.height - opt.margin[0] - opt.margin[2] }; pageSize.inner.ratio = pageSize.inner.height / pageSize.inner.width; // Copy the source element into a PDF-styled container div. var container = html2pdf.makeContainer(source, pageSize); var overlay = container.parentElement; // Get the locations of all hyperlinks. if (opt.enableLinks) { // Find all anchor tags and get the container's bounds for reference. opt.links = []; var links = container.querySelectorAll('a'); var containerRect = unitConvert(container.getBoundingClientRect(), pageSize.k); // Treat each client rect as a separate link (for text-wrapping). Array.prototype.forEach.call(links, function(link) { var clientRects = link.getClientRects(); for (var i=0; i