123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- /**
- * jsPDF addHTML PlugIn
- * Copyright (c) 2014 Diego Casorran
- *
- * Licensed under the MIT License.
- * http://opensource.org/licenses/mit-license
- */
- (function (jsPDFAPI) {
- 'use strict';
- /**
- * Renders an HTML element to canvas object which added as an image to the PDF
- *
- * This PlugIn requires html2canvas: https://github.com/niklasvh/html2canvas
- * OR rasterizeHTML: https://github.com/cburgmer/rasterizeHTML.js
- *
- * @public
- * @function
- * @param element {Mixed} HTML Element, or anything supported by html2canvas.
- * @param x {Number} starting X coordinate in jsPDF instance's declared units.
- * @param y {Number} starting Y coordinate in jsPDF instance's declared units.
- * @param options {Object} Additional options, check the code below.
- * @param callback {Function} to call when the rendering has finished.
- *
- * NOTE: Every parameter is optional except 'element' and 'callback', in such
- * case the image is positioned at 0x0 covering the whole PDF document
- * size. Ie, to easily take screenshoots of webpages saving them to PDF.
- */
- jsPDFAPI.addHTML = function (element, x, y, options, callback) {
- 'use strict';
- if(typeof html2canvas === 'undefined' && typeof rasterizeHTML === 'undefined')
- throw new Error('You need either '
- +'https://github.com/niklasvh/html2canvas'
- +' or https://github.com/cburgmer/rasterizeHTML.js');
- if(typeof x !== 'number') {
- options = x;
- callback = y;
- }
- if(typeof options === 'function') {
- callback = options;
- options = null;
- }
- var I = this.internal, K = I.scaleFactor, W = I.pageSize.width, H = I.pageSize.height;
- options = options || {};
- options.onrendered = function(obj) {
- x = parseInt(x) || 0;
- y = parseInt(y) || 0;
- var dim = options.dim || {};
- var h = dim.h || 0;
- var w = dim.w || Math.min(W,obj.width/K) - x;
- var format = 'JPEG';
- if(options.format)
- format = options.format;
- if(obj.height > H && options.pagesplit) {
- var crop = function() {
- var cy = 0;
- while(1) {
- var canvas = document.createElement('canvas');
- canvas.width = Math.min(W*K,obj.width);
- canvas.height = Math.min(H*K,obj.height-cy);
- var ctx = canvas.getContext('2d');
- ctx.drawImage(obj,0,cy,obj.width,canvas.height,0,0,canvas.width,canvas.height);
- var args = [canvas, x,cy?0:y,canvas.width/K,canvas.height/K, format,null,'SLOW'];
- this.addImage.apply(this, args);
- cy += canvas.height;
- if(cy >= obj.height) break;
- this.addPage();
- }
- callback(w,cy,null,args);
- }.bind(this);
- if(obj.nodeName === 'CANVAS') {
- var img = new Image();
- img.onload = crop;
- img.src = obj.toDataURL("image/png");
- obj = img;
- } else {
- crop();
- }
- } else {
- var alias = Math.random().toString(35);
- var args = [obj, x,y,w,h, format,alias,'SLOW'];
- this.addImage.apply(this, args);
- callback(w,h,alias,args);
- }
- }.bind(this);
- if(typeof html2canvas !== 'undefined' && !options.rstz) {
- return html2canvas(element, options);
- }
- if(typeof rasterizeHTML !== 'undefined') {
- var meth = 'drawDocument';
- if(typeof element === 'string') {
- meth = /^http/.test(element) ? 'drawURL' : 'drawHTML';
- }
- options.width = options.width || (W*K);
- return rasterizeHTML[meth](element, void 0, options).then(function(r) {
- options.onrendered(r.image);
- }, function(e) {
- callback(null,e);
- });
- }
- return null;
- };
- })(jsPDF.API);
|