PdfkitConstruct is a pdfkit helper for simplifying the creation of tables.
pdfkit-construct depends on pdfkit package, make sure its installed.
npm install pdfkit
Installation uses the npm package manager. Just type the following command after installing npm.
npm install pdfkit-construct
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}...`));
If you are not familiar with PDFKIT package please consider checking this website.
-
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 keyoptions
: 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 !
-
options
- height : "10%" // accepts only percentage
renderer
// callback function
-
options
- height : "5%" // accepts only percentage
renderer
// callback function
-
Adds a page with header / footer rendered if they are set.
-
Call this to render tables
-
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!
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
This project is licensed under the MIT License.