Skip to content

Kuama-IT/express-puppeteer

Repository files navigation

Express puppeteer

This is a standalone puppeteer server which transforms pure HTML DOM to a PDF. The server is built with expressjs and node and can be launched with docker.

Run with docker

The docker image can be built and run with docker compose.

docker compose build

or

docker compose up -d

Run locally

The expressjs server can be launched locally, for development or testing, using:

npm run dev

Remember to install the dependencies first:

npm i
npx puppeteer browsers install

Test data

The API can be tested using this example payload:

curl --location 'localhost:9000/api' \
--header 'Content-Type: application/json' \
--data-raw '{"html":"<!doctype html>\r\n<html lang=\"en\">\r\n    <head>\r\n        <title>W3.CSS Template</title>\r\n        <meta charset=\"UTF-8\" />\r\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\r\n        <link\r\n            rel=\"stylesheet\"\r\n            href=\"https://www.w3schools.com/w3css/5/w3.css\"\r\n        />\r\n        <link\r\n            rel=\"stylesheet\"\r\n            href=\"https://fonts.googleapis.com/css?family=Lato\"\r\n        />\r\n        <link\r\n            rel=\"stylesheet\"\r\n            href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css\"\r\n        />\r\n        <style>\r\n            body {\r\n                font-family: \"Lato\", sans-serif;\r\n            }\r\n            .mySlides {\r\n                display: none;\r\n            }\r\n        </style>\r\n    </head>\r\n    <body>\r\n        <!-- Navbar -->\r\n        <div class=\"w3-top\">\r\n            <div class=\"w3-bar w3-black w3-card\">\r\n                <a\r\n                    class=\"w3-bar-item w3-button w3-padding-large w3-hide-medium w3-hide-large w3-right\"\r\n                    href=\"javascript:void(0)\"\r\n                    onclick=\"myFunction()\"\r\n                    title=\"Toggle Navigation Menu\"\r\n                    ><i class=\"fa fa-bars\"></i\r\n                ></a>\r\n                <a href=\"#\" class=\"w3-bar-item w3-button w3-padding-large\"\r\n                    >HOME</a\r\n                >\r\n                <a\r\n                    href=\"#band\"\r\n                    class=\"w3-bar-item w3-button w3-padding-large w3-hide-small\"\r\n                    >BAND</a\r\n                >\r\n                <a\r\n                    href=\"#tour\"\r\n                    class=\"w3-bar-item w3-button w3-padding-large w3-hide-small\"\r\n                    >TOUR</a\r\n                >\r\n                <a\r\n                    href=\"#contact\"\r\n                    class=\"w3-bar-item w3-button w3-padding-large w3-hide-small\"\r\n                    >CONTACT</a\r\n                >\r\n                <div class=\"w3-dropdown-hover w3-hide-small\">\r\n                    <button class=\"w3-padding-large w3-button\" title=\"More\">\r\n                        MORE <i class=\"fa fa-caret-down\"></i>\r\n                    </button>\r\n                    <div class=\"w3-dropdown-content w3-bar-block w3-card-4\">\r\n                        <a href=\"#\" class=\"w3-bar-item w3-button\"\r\n                            >Merchandise</a\r\n                        >\r\n                        <a href=\"#\" class=\"w3-bar-item w3-button\">Extras</a>\r\n                        <a href=\"#\" class=\"w3-bar-item w3-button\">Media</a>\r\n                    </div>\r\n                </div>\r\n                <a\r\n                    href=\"javascript:void(0)\"\r\n                    class=\"w3-padding-large w3-hover-red w3-hide-small w3-right\"\r\n                    ><i class=\"fa fa-search\"></i\r\n                ></a>\r\n            </div>\r\n        </div>\r\n\r\n        <!-- Navbar on small screens (remove the onclick attribute if you want the navbar to always show on top of the content when clicking on the links) -->\r\n        <div\r\n            id=\"navDemo\"\r\n            class=\"w3-bar-block w3-black w3-hide w3-hide-large w3-hide-medium w3-top\"\r\n            style=\"margin-top: 46px\"\r\n        >\r\n            <a\r\n                href=\"#band\"\r\n                class=\"w3-bar-item w3-button w3-padding-large\"\r\n                onclick=\"myFunction()\"\r\n                >BAND</a\r\n            >\r\n            <a\r\n                href=\"#tour\"\r\n                class=\"w3-bar-item w3-button w3-padding-large\"\r\n                onclick=\"myFunction()\"\r\n                >TOUR</a\r\n            >\r\n            <a\r\n                href=\"#contact\"\r\n                class=\"w3-bar-item w3-button w3-padding-large\"\r\n                onclick=\"myFunction()\"\r\n                >CONTACT</a\r\n            >\r\n            <a\r\n                href=\"#\"\r\n                class=\"w3-bar-item w3-button w3-padding-large\"\r\n                onclick=\"myFunction()\"\r\n                >MERCH</a\r\n            >\r\n        </div>\r\n\r\n        <!-- Page content -->\r\n        <div class=\"w3-content\" style=\"max-width: 2000px; margin-top: 46px\">\r\n            <!-- Automatic Slideshow Images -->\r\n            <div class=\"mySlides w3-display-container w3-center\">\r\n                <img src=\"/w3images/la.jpg\" style=\"width: 100%\" />\r\n                <div\r\n                    class=\"w3-display-bottommiddle w3-container w3-text-white w3-padding-32 w3-hide-small\"\r\n                >\r\n                    <h3>Los Angeles</h3>\r\n                    <p><b>We had the best time playing at Venice Beach!</b></p>\r\n                </div>\r\n            </div>\r\n            <div class=\"mySlides w3-display-container w3-center\">\r\n                <img src=\"/w3images/ny.jpg\" style=\"width: 100%\" />\r\n                <div\r\n                    class=\"w3-display-bottommiddle w3-container w3-text-white w3-padding-32 w3-hide-small\"\r\n                >\r\n                    <h3>New York</h3>\r\n                    <p><b>The atmosphere in New York is lorem ipsum.</b></p>\r\n                </div>\r\n            </div>\r\n            <div class=\"mySlides w3-display-container w3-center\">\r\n                <img src=\"/w3images/chicago.jpg\" style=\"width: 100%\" />\r\n                <div\r\n                    class=\"w3-display-bottommiddle w3-container w3-text-white w3-padding-32 w3-hide-small\"\r\n                >\r\n                    <h3>Chicago</h3>\r\n                    <p><b>Thank you, Chicago - A night we won'\''t forget.</b></p>\r\n                </div>\r\n            </div>\r\n\r\n            <!-- The Band Section -->\r\n            <div\r\n                class=\"w3-container w3-content w3-center w3-padding-64\"\r\n                style=\"max-width: 800px\"\r\n                id=\"band\"\r\n            >\r\n                <h2 class=\"w3-wide\">THE BAND</h2>\r\n                <p class=\"w3-opacity\"><i>We love music</i></p>\r\n                <p class=\"w3-justify\">\r\n                    We have created a fictional band website. Lorem ipsum dolor\r\n                    sit amet, consectetur adipiscing elit, sed do eiusmod tempor\r\n                    incididunt ut labore et dolore magna aliqua. Ut enim ad\r\n                    minim veniam, quis nostrud exercitation ullamco laboris nisi\r\n                    ut aliquip ex ea commodo consequat. Duis aute irure dolor in\r\n                    reprehenderit in voluptate velit esse cillum dolore eu\r\n                    fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\r\n                    proident, sunt in culpa qui officia deserunt mollit anim id\r\n                    est laborum consectetur adipiscing elit, sed do eiusmod\r\n                    tempor incididunt ut labore et dolore magna aliqua. Ut enim\r\n                    ad minim veniam, quis nostrud exercitation ullamco laboris\r\n                    nisi ut aliquip ex ea commodo consequat.\r\n                </p>\r\n                <div class=\"w3-row w3-padding-32\">\r\n                    <div class=\"w3-third\">\r\n                        <p>Name</p>\r\n                        <img\r\n                            src=\"/w3images/bandmember.jpg\"\r\n                            class=\"w3-round w3-margin-bottom\"\r\n                            alt=\"Random Name\"\r\n                            style=\"width: 60%\"\r\n                        />\r\n                    </div>\r\n                    <div class=\"w3-third\">\r\n                        <p>Name</p>\r\n                        <img\r\n                            src=\"/w3images/bandmember.jpg\"\r\n                            class=\"w3-round w3-margin-bottom\"\r\n                            alt=\"Random Name\"\r\n                            style=\"width: 60%\"\r\n                        />\r\n                    </div>\r\n                    <div class=\"w3-third\">\r\n                        <p>Name</p>\r\n                        <img\r\n                            src=\"/w3images/bandmember.jpg\"\r\n                            class=\"w3-round\"\r\n                            alt=\"Random Name\"\r\n                            style=\"width: 60%\"\r\n                        />\r\n                    </div>\r\n                </div>\r\n            </div>\r\n\r\n            <!-- The Tour Section -->\r\n            <div class=\"w3-black\" id=\"tour\">\r\n                <div\r\n                    class=\"w3-container w3-content w3-padding-64\"\r\n                    style=\"max-width: 800px\"\r\n                >\r\n                    <h2 class=\"w3-wide w3-center\">TOUR DATES</h2>\r\n                    <p class=\"w3-opacity w3-center\">\r\n                        <i>Remember to book your tickets!</i>\r\n                    </p>\r\n                    <br />\r\n\r\n                    <ul class=\"w3-ul w3-border w3-white w3-text-grey\">\r\n                        <li class=\"w3-padding\">\r\n                            September\r\n                            <span class=\"w3-tag w3-red w3-margin-left\"\r\n                                >Sold out</span\r\n                            >\r\n                        </li>\r\n                        <li class=\"w3-padding\">\r\n                            October\r\n                            <span class=\"w3-tag w3-red w3-margin-left\"\r\n                                >Sold out</span\r\n                            >\r\n                        </li>\r\n                        <li class=\"w3-padding\">\r\n                            November\r\n                            <span class=\"w3-badge w3-right w3-margin-right\"\r\n                                >3</span\r\n                            >\r\n                        </li>\r\n                    </ul>\r\n\r\n                    <div\r\n                        class=\"w3-row-padding w3-padding-32\"\r\n                        style=\"margin: 0 -16px\"\r\n                    >\r\n                        <div class=\"w3-third w3-margin-bottom\">\r\n                            <img\r\n                                src=\"/w3images/newyork.jpg\"\r\n                                alt=\"New York\"\r\n                                style=\"width: 100%\"\r\n                                class=\"w3-hover-opacity\"\r\n                            />\r\n                            <div class=\"w3-container w3-white\">\r\n                                <p><b>New York</b></p>\r\n                                <p class=\"w3-opacity\">Fri 27 Nov 2016</p>\r\n                                <p>\r\n                                    Praesent tincidunt sed tellus ut rutrum sed\r\n                                    vitae justo.\r\n                                </p>\r\n                                <button\r\n                                    class=\"w3-button w3-black w3-margin-bottom\"\r\n                                    onclick=\"document.getElementById('\''ticketModal'\'').style.display='\''block'\''\"\r\n                                >\r\n                                    Buy Tickets\r\n                                </button>\r\n                            </div>\r\n                        </div>\r\n                        <div class=\"w3-third w3-margin-bottom\">\r\n                            <img\r\n                                src=\"/w3images/paris.jpg\"\r\n                                alt=\"Paris\"\r\n                                style=\"width: 100%\"\r\n                                class=\"w3-hover-opacity\"\r\n                            />\r\n                            <div class=\"w3-container w3-white\">\r\n                                <p><b>Paris</b></p>\r\n                                <p class=\"w3-opacity\">Sat 28 Nov 2016</p>\r\n                                <p>\r\n                                    Praesent tincidunt sed tellus ut rutrum sed\r\n                                    vitae justo.\r\n                                </p>\r\n                                <button\r\n                                    class=\"w3-button w3-black w3-margin-bottom\"\r\n                                    onclick=\"document.getElementById('\''ticketModal'\'').style.display='\''block'\''\"\r\n                                >\r\n                                    Buy Tickets\r\n                                </button>\r\n                            </div>\r\n                        </div>\r\n                        <div class=\"w3-third w3-margin-bottom\">\r\n                            <img\r\n                                src=\"/w3images/sanfran.jpg\"\r\n                                alt=\"San Francisco\"\r\n                                style=\"width: 100%\"\r\n                                class=\"w3-hover-opacity\"\r\n                            />\r\n                            <div class=\"w3-container w3-white\">\r\n                                <p><b>San Francisco</b></p>\r\n                                <p class=\"w3-opacity\">Sun 29 Nov 2016</p>\r\n                                <p>\r\n                                    Praesent tincidunt sed tellus ut rutrum sed\r\n                                    vitae justo.\r\n                                </p>\r\n                                <button\r\n                                    class=\"w3-button w3-black w3-margin-bottom\"\r\n                                    onclick=\"document.getElementById('\''ticketModal'\'').style.display='\''block'\''\"\r\n                                >\r\n                                    Buy Tickets\r\n                                </button>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n\r\n            <!-- Ticket Modal -->\r\n            <div id=\"ticketModal\" class=\"w3-modal\">\r\n                <div class=\"w3-modal-content w3-animate-top w3-card-4\">\r\n                    <header\r\n                        class=\"w3-container w3-teal w3-center w3-padding-32\"\r\n                    >\r\n                        <span\r\n                            onclick=\"document.getElementById('\''ticketModal'\'').style.display='\''none'\''\"\r\n                            class=\"w3-button w3-teal w3-xlarge w3-display-topright\"\r\n                            >×</span\r\n                        >\r\n                        <h2 class=\"w3-wide\">\r\n                            <i class=\"fa fa-suitcase w3-margin-right\"></i\r\n                            >Tickets\r\n                        </h2>\r\n                    </header>\r\n                    <div class=\"w3-container\">\r\n                        <p>\r\n                            <label\r\n                                ><i class=\"fa fa-shopping-cart\"></i> Tickets,\r\n                                $15 per person</label\r\n                            >\r\n                        </p>\r\n                        <input\r\n                            class=\"w3-input w3-border\"\r\n                            type=\"text\"\r\n                            placeholder=\"How many?\"\r\n                        />\r\n                        <p>\r\n                            <label><i class=\"fa fa-user\"></i> Send To</label>\r\n                        </p>\r\n                        <input\r\n                            class=\"w3-input w3-border\"\r\n                            type=\"text\"\r\n                            placeholder=\"Enter email\"\r\n                        />\r\n                        <button\r\n                            class=\"w3-button w3-block w3-teal w3-padding-16 w3-section w3-right\"\r\n                        >\r\n                            PAY <i class=\"fa fa-check\"></i>\r\n                        </button>\r\n                        <button\r\n                            class=\"w3-button w3-red w3-section\"\r\n                            onclick=\"document.getElementById('\''ticketModal'\'').style.display='\''none'\''\"\r\n                        >\r\n                            Close <i class=\"fa fa-remove\"></i>\r\n                        </button>\r\n                        <p class=\"w3-right\">\r\n                            Need <a href=\"#\" class=\"w3-text-blue\">help?</a>\r\n                        </p>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n\r\n            <!-- The Contact Section -->\r\n            <div\r\n                class=\"w3-container w3-content w3-padding-64\"\r\n                style=\"max-width: 800px\"\r\n                id=\"contact\"\r\n            >\r\n                <h2 class=\"w3-wide w3-center\">CONTACT</h2>\r\n                <p class=\"w3-opacity w3-center\"><i>Fan? Drop a note!</i></p>\r\n                <div class=\"w3-row w3-padding-32\">\r\n                    <div class=\"w3-col m6 w3-large w3-margin-bottom\">\r\n                        <i class=\"fa fa-map-marker\" style=\"width: 30px\"></i>\r\n                        Chicago, US<br />\r\n                        <i class=\"fa fa-phone\" style=\"width: 30px\"></i> Phone:\r\n                        +00 151515<br />\r\n                        <i class=\"fa fa-envelope\" style=\"width: 30px\"> </i>\r\n                        Email: mail@mail.com<br />\r\n                    </div>\r\n                    <div class=\"w3-col m6\">\r\n                        <form action=\"/action_page.php\" target=\"_blank\">\r\n                            <div\r\n                                class=\"w3-row-padding\"\r\n                                style=\"margin: 0 -16px 8px -16px\"\r\n                            >\r\n                                <div class=\"w3-half\">\r\n                                    <input\r\n                                        class=\"w3-input w3-border\"\r\n                                        type=\"text\"\r\n                                        placeholder=\"Name\"\r\n                                        required\r\n                                        name=\"Name\"\r\n                                    />\r\n                                </div>\r\n                                <div class=\"w3-half\">\r\n                                    <input\r\n                                        class=\"w3-input w3-border\"\r\n                                        type=\"text\"\r\n                                        placeholder=\"Email\"\r\n                                        required\r\n                                        name=\"Email\"\r\n                                    />\r\n                                </div>\r\n                            </div>\r\n                            <input\r\n                                class=\"w3-input w3-border\"\r\n                                type=\"text\"\r\n                                placeholder=\"Message\"\r\n                                required\r\n                                name=\"Message\"\r\n                            />\r\n                            <button\r\n                                class=\"w3-button w3-black w3-section w3-right\"\r\n                                type=\"submit\"\r\n                            >\r\n                                SEND\r\n                            </button>\r\n                        </form>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n\r\n            <!-- End Page Content -->\r\n        </div>\r\n\r\n        <!-- Image of location/map -->\r\n        <img\r\n            src=\"/w3images/map.jpg\"\r\n            class=\"w3-image w3-greyscale-min\"\r\n            style=\"width: 100%\"\r\n        />\r\n\r\n        <!-- Footer -->\r\n        <footer\r\n            class=\"w3-container w3-padding-64 w3-center w3-opacity w3-light-grey w3-xlarge\"\r\n        >\r\n            <i class=\"fa fa-facebook-official w3-hover-opacity\"></i>\r\n            <i class=\"fa fa-instagram w3-hover-opacity\"></i>\r\n            <i class=\"fa fa-snapchat w3-hover-opacity\"></i>\r\n            <i class=\"fa fa-pinterest-p w3-hover-opacity\"></i>\r\n            <i class=\"fa fa-twitter w3-hover-opacity\"></i>\r\n            <i class=\"fa fa-linkedin w3-hover-opacity\"></i>\r\n            <p class=\"w3-medium\">\r\n                Powered by\r\n                <a\r\n                    href=\"https://www.w3schools.com/w3css/default.asp\"\r\n                    target=\"_blank\"\r\n                    >w3.css</a\r\n                >\r\n            </p>\r\n        </footer>\r\n\r\n        <script>\r\n            // Automatic Slideshow - change image every 4 seconds\r\n            var myIndex = 0;\r\n            carousel();\r\n\r\n            function carousel() {\r\n                var i;\r\n                var x = document.getElementsByClassName(\"mySlides\");\r\n                for (i = 0; i < x.length; i++) {\r\n                    x[i].style.display = \"none\";\r\n                }\r\n                myIndex++;\r\n                if (myIndex > x.length) {\r\n                    myIndex = 1;\r\n                }\r\n                x[myIndex - 1].style.display = \"block\";\r\n                setTimeout(carousel, 4000);\r\n            }\r\n\r\n            // Used to toggle the menu on small screens when clicking on the menu button\r\n            function myFunction() {\r\n                var x = document.getElementById(\"navDemo\");\r\n                if (x.className.indexOf(\"w3-show\") == -1) {\r\n                    x.className += \" w3-show\";\r\n                } else {\r\n                    x.className = x.className.replace(\" w3-show\", \"\");\r\n                }\r\n            }\r\n\r\n            // When the user clicks anywhere outside of the modal, close it\r\n            var modal = document.getElementById(\"ticketModal\");\r\n            window.onclick = function (event) {\r\n                if (event.target == modal) {\r\n                    modal.style.display = \"none\";\r\n                }\r\n            };\r\n        </script>\r\n    </body>\r\n</html>\r\n"}'

About

Standalone puppeteer node server

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors