printDocument() { const divs = document.getElementsByClassName('example'); const newList = [].slice.call(inputs); var contentArray = [] var docDefinition = { pageSize: {width: 800, height: 1173}, content: [ { text: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Confectum ponit legam, perferendis nomine miserum, animi. Moveat nesciunt triari naturam.' } ] } Promise.map(newList, async (element, index) => { let canvas = await html2canvas(element); const imgData = await canvas.toDataURL('image/png'); // console.log("imgData URL => ", imgData) // margin horizontal -40 = removing white spaces return contentArray[`${index}`] = [{ image: imgData, width: canvas.width, height: canvas.height, margin: [-40, 0] }, { text: ` ${index} - Lorem ipsum dolor sit amet, consectetur adipisicing elit. Confectum ponit legam, perferendis nomine miserum, animi.` }]; }).then( () => ( docDefinition.content.push(contentArray)) ).then( () => { console.log("... starting download ...") pdfMake.createPdf(docDefinition).download('examplePdf.pdf') } ) } // In your react's component constructor ... constructor(props) { super(props); this.printDocument = this.printDocument.bind(this) } // the imports below ... import Promise from 'bluebird'; import html2canvas from 'html2canvas'; import pdfMake from 'pdfmake/build/pdfmake.js'; import pdfFonts from "pdfmake/build/vfs_fonts.js"; pdfMake.vfs = pdfFonts.pdfMake.vfs; // i'm using these middlewares import promise from 'redux-promise' import multi from 'redux-multi' import thunk from 'redux-thunk'
<div> The approach here is: a div it's not a page. Because if the image generated by the canvas element it's bigger than the page vertical size, we'll need to control the pagination by ourselves. So, we broke our content in small elements to the pdf generator handle the pagination to us. This way we garantee that the pagination will occurs without cuts. <div className="example" style={{ backgroundColor: '#ffffff', maxWidth: '800px', maxHeight: '1173px', borderStyle: 'groove', borderColor: 'red', margin: '0px' }} > // any content or component here, we need maxHeight to be sure that the div's height size it's not bigger than the your PDF doc's height dimension, else your div may never be rendered inside it. </div> <div className="example" style={{ backgroundColor: '#ffffff', maxWidth: '800px', maxHeight: '1173px', borderStyle: 'groove', borderColor: 'red', margin: '0px' }} > // any content or component here, we need maxHeight to be sure that the div's height size it's not bigger than the your PDF doc's height dimension, else your div may never be rendered inside it. </div> <div className="example" style={{ backgroundColor: '#ffffff', maxWidth: '800px', maxHeight: '1173px', borderStyle: 'groove', borderColor: 'red', margin: '0px' }} > // any content or component here, we need maxHeight to be sure that the div's height size it's not bigger than the your PDF doc's height dimension, else your div may never be rendered inside it. </div> </div> <div> <button onClick={this.printDocument}> print using PDFMake </button> </div>