UNPKG

jspdf-html2canvas

Version:

A combine usage with jsPDF and html2canvas, which translating html content to PDF file.

320 lines (243 loc) 7.45 kB
<p align="center"> <a href="https://npmcharts.com/compare/jspdf-html2canvas?minimal=true"><img src="https://img.shields.io/npm/dm/jspdf-html2canvas.svg?sanitize=true" alt="Downloads"></a> <a href="https://www.npmjs.com/package/jspdf-html2canvas"><img src="https://img.shields.io/npm/v/jspdf-html2canvas.svg?sanitize=true" alt="Version"></a> <a href="https://www.jsdelivr.com/package/npm/jspdf-html2canvas"><img src="https://data.jsdelivr.com/v1/package/npm/jspdf-html2canvas/badge" /></a> <a href="https://www.npmjs.com/package/jspdf-html2canvas"><img src="https://img.shields.io/npm/l/jspdf-html2canvas.svg?sanitize=true" alt="License"></a> </p> # jsPDF-html2canvas A combine usage with jsPDF &amp; html2canvas, which translating html content to PDF file. Written in Typescript. > html2PDF function will auto fit the target dom width into PDF size. So no need to worry about the overflow part. And if the content height is over 1 pdf, it'll auto seperate it into another pdf page. ## Install ``` npm i jspdf-html2canvas ``` ```js import html2PDF from 'jspdf-html2canvas'; html2PDF(node, options); ``` since this plugin is an umd module, you can also use by cdn with `/dist/jspdf-html2canvas.min.js`, just remember to include both `jspdf` & `html2canvas` cdn before this plugin. ```js <script src="https://unpkg.com/jspdf@latest/dist/jspdf.umd.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/jspdf-html2canvas@latest/dist/jspdf-html2canvas.min.js"></script> ``` ## html2PDF([Node, NodeList], options) convert specific DOM target to print it into PDF file. Automatically, it'll save the file, or you can define the `success` callback to do with the jsPDF instance. ```html <!-- default a4's width is 595.28px --> <div id="page" style="width: 595.28px;color: black;background: white;"> <h3>PDF for Test</h3> <p>Here is some content for testing!!</p> </div> <button id="btn">Generate</button> ``` ```js let btn = document.getElementById('btn'); let page = document.getElementById('page'); btn.addEventListener('click', function(){ html2PDF(page, { jsPDF: { format: 'a4', }, imageType: 'image/jpeg', output: './pdf/generate.pdf' }); }); ``` you can easily `await` the method to wait for pdf generated. ```js async function printPdf() { const pdf = await html2PDF(page, { // ... }); // do something with pdf(jsPdf instance) } ``` > If there's some white space on top of the outputed PDF file, it might caused by the scroll problem, just add some settings for `html2canvas` plugin as following. [see the reference](https://stackoverflow.com/questions/57936607/why-there-is-a-white-space-on-the-top-on-html2canvas) ```js html2PDF(page, { // ... other settings html2canvas: { scrollX: 0, scrollY: -window.scrollY, }, }); ``` ## Custom multiple page supported There might be some situation you want to print DOM seperately, just easily give the nodeList with `length` in it, will adjust every nodes inside seperately into a new page in the same PDF output. for example: ```html <div id="page" style="width: 595.28px;color: black;background: white;"> <div class="page page-1"> <h3>Test page 1</h3> <p>This is an page for testing 1</p> </div> <div class="page page-2"> <h3>Test page 2</h3> <p>This is an page for testing 1</p> </div> <div class="page page-3"> <h3>Test page 3</h3> <p>This is an page for testing 1</p> </div> </div> ``` ```js const pages = document.getElementsByClassName('page'); btn.addEventListener('click', function(){ html2PDF(pages, { jsPDF: { format: 'a4', }, imageType: 'image/jpeg', output: './pdf/generate.pdf' }); }); ``` ## Options ### - jsPDF - type: `Object` - default: ```js { unit: 'pt', format: 'a4' } ``` setting for creating jsPDF's instance, please ref to [JSPDF Documentation](http://raw.githack.com/MrRio/jsPDF/master/docs/) ### - html2canvas - type: `Object` - default: ```js { imageTimeout: 15000, logging: true, useCORS: false } ``` setting for `html2canvas` configs, please ref to [html2canvas Documentation](https://html2canvas.hertzen.com/documentation) ### - watermark - type: `String` | `Function` | `Object` - optional setting for watermark in pdf, will add watermark into each pages of your outputed pdf file. each data type has different usage as following: #### datatype: `String` => image url create image watermark in the center of each page with default image scale size `1`, please use `.png` file for watermark. ```js html2PDF(page, { watermark: './test.png', }); ``` #### datatype: `Function` => custom handler define custom handler to do things for each page of pdf file. ```js html2PDF(page, { watermark({ pdf, pageNumber, totalPageNumber }) { // pdf: jsPDF instance pdf.setTextColor('#ddd'); pdf.text(50, pdf.internal.pageSize.height - 30, `Watermark, page: ${pageNumber}/${totalPageNumber}`); }, }); ``` #### datatype: `Object` => custom handler or resize image watermark define image watermark with change `ratio`, or use custom `handler` to do with the image position. ```js html2PDF(page, { watermark: { src: './test.png', scale: 0.5 }, }); // or html2PDF(page, { watermark: { src: './test.png', handler({ pdf, imgNode, pageNumber, totalPageNumber }) { const props = pdf.getImageProperties(imgNode); // do something... pdf.addImage(imgNode, 'PNG', 0, 0, 40, 40); }, }, }); ``` ### - imageType - type: `String` - allowed: `image/jpeg`, `image/png`, `image/webp` - default: `image/jpeg` define the target imageType, now only support for jpeg, png, webp ```js // will be used like let pageData = canvas.toDataURL(opts.imageType, opts.imageQuality); ``` ### - imageQuality - type: `Number` - allowed: `0 - 1` - default: `1` define the image quality transfered from canvas ### - margin - type: `Object{key => number}` - allowed key: `top`, `right`, `bottom`, `left` - default: `0` define the margin of each page ### - autoResize - type: `Boolean` - default: `true` define whether to auto resize the snapshot image to fit PDF layout size ### - output - type: `String` - default: `jspdf-generate.pdf` define name of the output PDF file ```js pdf.save(opts.output); ``` ### - init - type: `Function` ```js function init(pdf) { pdf.setFont('Myfont'); pdf.setFontSize(10); } ``` define some init for jspdf initiating before printing ### - success - type: `Function` - default: ```js function success(pdf) { pdf.save(this.output); } ``` callback function to do after all code, default will save the file with the output name setting. ## Defaults options ```js const defaultOptions = { jsPDF: { unit: 'pt', format: 'a4', }, html2canvas: { imageTimeout: 15000, logging: true, useCORS: false, }, imageType: 'image/jpeg', imageQuality: 1, margin: { top: 0, right: 0, bottom: 0, left: 0, }, watermark: undefined, autoResize: true, output: 'jspdf-generate.pdf', init: function() {}, success: function(pdf) { pdf.save(this.output); } } ``` ## Recommend if you want more custom & widing solutions, you can use this npm package html2pdf: https://www.npmjs.com/package/html2pdf.js