Print your HTML to PDF via Puppeteer in a Docker container.
This is a simple Express server listening for POST
requests passing some custom HTML to print as PDF for generating fancy reports.
Technologies used:
It offers images for both ARM and AMD architectures.
As a webserver, on the port of your choosing.
- Testing:
docker run -it --rm -p=<port>:3000 ghcr.io/ccjmne/puppeteer-html2pdf:<version>
Kill with: Ctrl^C
- Production:
docker run --name html2pdf --detach -p=<port>:3000 \
--shm-size 1G --sysctl net.ipv6.conf.all.disable_ipv6=1 \
ghcr.io/ccjmne/puppeteer-html2pdf:<version>
Stop with: docker stop html2pdf
Name | Description | Default Value |
---|---|---|
BODY_LIMIT | Maximum request body size. Passed on to body-parser and express.json . |
1mb |
The webserver listens on the port (specified in the Run it section) and exposes two endpoints:
Single-page document, default settings (format: A4
, orientation: portrait
):
Single-page document | Multi-page document | |
---|---|---|
Request Path | / |
/multiple |
Request Method | POST |
POST |
Content-Type header |
text/html |
application/json |
Request Body | HTML content | JSON array of strings containing HTML |
Request Body (example) | <h1>Hello World!</h1> |
["<h1>Page 1</h2>", "<h1>Page 2</h1>" ] |
Both methods handle the following query parameters:
filename
: the name of the resulting PDF file (will automatically append the.pdf
extension if absent)- all the options supported by Puppeteer's page#pdf([options]), except:
path
headerTemplate
margin
The /multiple
endpoint used to expect the request body to be a JSON object with a single pages
property that would map to a JSON array of strings containing your HTML content for each page to be printed.
That endpoint now expects the JSON array directly.
-
version 1.x.x
{ "pages": [ "<h1>First Page</h1>", "<h1>Second Page</h1>" ] }
-
version 2.x.x
[ "<h1>First Page</h1>", "<h1>Second Page</h1>" ]
Single-page document, default settings (format: A4
, orientation: portrait
):
curl -X POST \
'http://localhost:3000' \
-H 'Content-Type: text/html' \
-d '<html><body><h1>Hello World!</h1></body></html>'
Single-page document (format: A3
, orientation: landscape
):
curl -X POST \
'http://localhost:3000?format=a3&landscape=true' \
-H 'Content-Type: text/html' \
-d '<html><body><h1>Hello World!</h1></body></html>'
Multi-page document:
curl -X POST \
'http://localhost:3000/multiple' \
-H 'Content-Type: application/json' \
-d '[
"<html><body><h1>Hello World!</h1></body></html>",
"This is the <strong>second</strong> page"
]'
- Better handle errors.
- Set up a way to configure endpoints that will inject custom CSS styles in each page.
Automatically builds and publishes to GitHub Packages (GitHub Container Registry) with each GitHub Release.
Includes a comprehensive script that lets you build and publish new versions of the image: ./compose.sh <version>
MIT. Do as you please.
Refer to the LICENSE file for more details.