libs/html2pdf.js

/**
 * html2pdf.js
 * Copyright (c) 2014 Steven Spungin (TwelveTone LLC)  steven@twelvetone.tv
 *
 * Licensed under the MIT License.
 * http://opensource.org/licenses/mit-license
 */

function html2pdf (html,pdf,callback) {
	var canvas = pdf.canvas;
	if (!canvas) {
		alert('jsPDF canvas plugin not installed');
		return;
	}
	canvas.pdf = pdf;
	pdf.annotations = {

		_nameMap : [],

		createAnnotation : function(href,bounds) {
			var x = pdf.context2d._wrapX(bounds.left);
			var y = pdf.context2d._wrapY(bounds.top);
			var page = pdf.context2d._page(bounds.top);
			var options;
			var index = href.indexOf('#');
			if (index >= 0) {
				options = {
					name : href.substring(index + 1)
				};
			} else {
				options = {
					url : href
				};
			}
			pdf.link(x, y, bounds.right - bounds.left, bounds.bottom - bounds.top, options);
		},

		setName : function(name,bounds) {
			var x = pdf.context2d._wrapX(bounds.left);
			var y = pdf.context2d._wrapY(bounds.top);
			var page = pdf.context2d._page(bounds.top);
			this._nameMap[name] = {
				page : page,
				x : x,
				y : y
			};
		}

	};
	canvas.annotations = pdf.annotations;
	
	pdf.context2d._pageBreakAt = function(y) {
		this.pageBreaks.push(y);
	};

	pdf.context2d._gotoPage = function(pageOneBased) {
		while (pdf.internal.getNumberOfPages() < pageOneBased) {
			pdf.addPage();
		}
		pdf.setPage(pageOneBased);
	}

	if (typeof html === 'string') {
		// remove all scripts
		html = html.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '');

		var iframe = document.createElement('iframe');
		//iframe.style.width = canvas.width;
		//iframe.src = "";
		//iframe.document.domain =
		document.body.appendChild(iframe);
		var doc;
		doc = iframe.contentDocument;
		if (doc == undefined || doc == null) {
			doc = iframe.contentWindow.document;
		}
		//iframe.setAttribute('style', 'position:absolute;right:0; top:0; bottom:0; height:100%; width:500px');

		doc.open();
		doc.write(html);
		doc.close();

		var promise = html2canvas(doc.body, {
			canvas : canvas,
			onrendered : function(canvas) {
				if (callback) {
					if (iframe) {
						iframe.parentElement.removeChild(iframe);
					}
					callback(pdf);
				}
			}
		});

	} else {
		var body = html;
		var promise = html2canvas(body, {
			canvas : canvas,
			onrendered : function(canvas) {
				if (callback) {
					if (iframe) {
						iframe.parentElement.removeChild(iframe);
					}
					callback(pdf);
				}
			}
		});
	}

}