Skip to content

soufiane-marar/pdfkit-construct

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Pdfkit-Construct

PdfkitConstruct is a pdfkit helper for simplifying the creation of tables.

Getting Started

Prerequisites

pdfkit-construct depends on pdfkit package, make sure its installed.

npm install pdfkit

Installing

Installation uses the npm package manager. Just type the following command after installing npm.

npm install pdfkit-construct

Usage

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 package please consider checking this website.

  • 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.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published