UNPKG

pdfkit-construct

Version:

PdfKit class that helps creating and styling tables

208 lines (165 loc) 6.81 kB
# Pdfkit-Construct _PdfkitConstruct_ is a [pdfkit](https://www.npmjs.com/package/pdfkit) helper for simplifying the creation of tables. ## Getting Started #### Prerequisites _pdfkit-construct depends on [pdfkit](https://www.npmjs.com/package/pdfkit)_ package, make sure its installed. ```bash npm install pdfkit ``` ## Installing Installation uses the npm package manager. Just type the following command after installing npm. ```bash npm install pdfkit-construct ``` ## Usage ``` javascript const PdfkitConstruct = require('pdfkit-construct'); const app = require('express')(); app.get("/", (req, res) => { getDbData() .then(products => { for (let i = 0; i < products.length; i++) { products[i].amount = (products[i].price * products[i].quantity).toFixed(2); products[i].price = products[i].price.toFixed(2); } // Create a document const doc = new PdfkitConstruct({ size: 'A4', margins: {top: 20, left: 10, right: 10, bottom: 20}, bufferPages: true, }); // set the header to render in every page doc.setDocumentHeader({}, () => { doc.lineJoin('miter') .rect(0, 0, doc.page.width, doc.header.options.heightNumber).fill("#ededed"); doc.fill("#115dc8") .fontSize(20) .text("Hello world header", doc.header.x, doc.header.y); }); // set the footer to render in every page doc.setDocumentFooter({}, () => { doc.lineJoin('miter') .rect(0, doc.footer.y, doc.page.width, doc.footer.options.heightNumber).fill("#c2edbe"); doc.fill("#7416c8") .fontSize(8) .text("Hello world footer", doc.footer.x, doc.footer.y + 10); }); // add a table (you can add multiple tables with different columns) // make sure every column has a key. keys should be unique doc.addTable( [ {key: 'name', label: 'Product', align: 'left'}, {key: 'brand', label: 'Brand', align: 'left'}, {key: 'price', label: 'Price', align: 'right'}, {key: 'quantity', label: 'Quantity'}, {key: 'amount', label: 'Amount', align: 'right'} ], products, { border: null, width: "fill_body", striped: true, stripedColors: ["#f6f6f6", "#d6c4dd"], cellsPadding: 10, marginLeft: 45, marginRight: 45, headAlign: 'center' }); // render tables doc.render(); // this should be the last // for this to work you need to set bufferPages to true in constructor options doc.setPageNumbers((p, c) => `Page ${p} of ${c}`, "bottom right"); doc.pipe(res); doc.end(); }) .catch(error => { res.status(200).send(error.stack); }) }); function getDbData() { return new Promise((resolve, reject) => { resolve([ { "id": 7631, "SKU": "HEH-9133", "name": "On Cloud Nine Pillow On Cloud Nine Pillow On Cloud Nine Pillow On Cloud Nine Pillow", "price": 24.99, "brand": "FabDecor", "quantity": 1, "created_at": "2018-03-03 17:41:13" }, { "id": 7615, "SKU": "HEH-2245", "name": "Simply Sweet Blouse", "price": 42, "brand": "Entity Apparel", "quantity": 2, "created_at": "2018-03-20 22:24:21" }, { "id": 8100, "SKU": "WKS-6016", "name": "Uptown Girl Blouse", "price": 58, "brand": "Entity Apparel", "quantity": 3, "created_at": "2018-03-16 21:55:28" }]); }) } let port = process.env.PORT || 3330; app.listen(port, () => console.log(`Server listening on port ${port}...`)); ``` ## Api If you are not familiar with [PDFKIT](https://www.npmjs.com/package/pdfkit) package please consider checking this [website](http://pdfkit.org/). - #### addTable - `columns` : array of column object - **key** (string & unique & not null) - **label** (string) - **align** 'left' | 'right' | 'center'. [default : 'left'] - `rows` : array of objects with properties name matching the value set in columns key - `options` : table general options - **width** : "auto", // auto | fill_body - **marginLeft** : 0, - **marginRight** : 0, - **marginTop** : 0, - **marginBottom** : 5, - **border** : {size: 0.1, color: '#cdcdcd'}, - **striped** : false, - **stripedColors** : ['#fff', '#f0ecd5'], - **headBackground** : '#abc6f0', - **headAlign** : 'center' // left | right | center, - **headColor** : '#000', - **headFont** : "Helvetica-Bold", - **headFontSize** : 10, - **headHeight** : 10, - **cellsFont** : "Helvetica", - **cellsFontSize** : 9, - **cellsAlign** : 'center' // left | right | center, - **cellsColor** : "#000", - **cellsPadding** : 5, - **cellsMaxWidth** : 120 _`NOTE THAT YOU CAN ADD MULTIPLE TABLES !`_ - #### setDocumentHeader - `options` - **height** : "10%" // accepts only percentage - `renderer` // callback function - #### setDocumentFooter - `options` - **height** : "5%" // accepts only percentage - `renderer` // callback function - #### addPageDoc Adds a page with header / footer rendered if they are set. - #### render Call this to render tables - #### setPageNumbers - ``templateRenderer = (p, count) => `${current} of ${count}` `` // function, returns string - **p** (current page) - **count** (number of pages in the doc) - `position = "bottom"` // accepts values : "top","top left","top right","bottom","bottom left","bottom right" _`CALL THIS AFTER FINISHING ALL THE RENDERING!`_ ## Contributing Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. ## License This project is licensed under the [MIT License](LICENSE).