A tool to print webpages as PDF files, powered by chromedp and the DevTools Protocol.
Install with:
go get github.com/chialab/print2pdf-go/print2pdfand use it in your project. See the package reference or the plain application for an example.
The plain directory in this repository contains a minimal REST application. It is also provided as a
binary for each release.
The following environmental variables can be used to configure the application:
CHROMIUM_PATH(required) full path to the Chromium binaryBUCKET(required by endpoint/v1/printandlambdaapplication) name of the AWS S3 bucket where to store the generated PDFPORT(optional, default to3000) port from which theplainapplication will be servedCORS_ALLOWED_HOSTS(optional, default to*) comma-separated list of allowed origins for pre-flight CORS requestsFORWARD_COOKIES(optional, default to"") comma-separated list of cookie names that must be forwarded from the incoming request to the Chromium browserPRINT_ALLOWED_HOSTS(optional, default to"") comma-separated list of hosts for which printing is allowed
To use the /v1/print endpoint, credentials for the AWS account need to be configured in your environment to be able to store
the generated PDF in AWS S3. See the SDK documentation
for the supported methods of providing the credentials.
Launch the binary to start the webserver at http://localhost:3000.
The webserver provides these endpoints:
/v1/printstores the generated PDF in an AWS S3 bucket/v2/printstreams the generated PDF as the response/statusreturns an empty response with status code 204 or 503, to be used as healthcheck/metricsexports metrics in the Prometheus format
Both endpoints accept POST requests with the following body parameters:
url(required) the URL of the page to print as PDFfile_name(required) the filename of the exported PDF; the suffix.pdfcan be omitted and will be automatically added if missingmedia(optional) the media type to emulate when printing the PDF; can be eitherprintorscreen, default isprintformat(optional) the printed PDF page format; can be one ofLetter,Legal,Tabloid,Ledger,A0,A1,A2,A3,A4,A5orA6, default isA4background(optional) whether to print background graphics; can be eithertrueorfalse, default istruelayout(optional) page orientation of the printed PDF; can be eitherlandscapeorportrait, default isportraitmargins(optional) page margins of the printed PDF; is an object with four optional keystop,bottom,leftandrightexpressed in inches as decimal numbers, the default for each one is 0scale(optional) print scale; is a positive decimal number, default is 1 (meaning 100%)
The /v1/print endpoint responds with a JSON object with the key url containing the URL to the file, while the /v2/print
endpoint is the file itself. In case of an error the response will have an appropriate HTTP status code and its body will be a JSON
object with the key message explaining the error, and a log line will be written to the console with more details.
The lambda directory in this repository contains a lambda function, to be run on AWS Lambda. It is also provided as a
binary for each release.
It provides the same endpoint as the /v1/print endpoint of the REST application, but is expected to
be run behind an API Gateway so the request body is a bit different.
To use it locally and in the cloud, see the docker image usage.
Docker images for the plain and lambda applications are provided. They both come with Chromium pre-installed.
The plain image can be used like this:
docker run --rm -it -p '3000:3000' -e 'BUCKET=mybucket' -e 'CHROMIUM_PATH=/usr/bin/chromium' ghcr.io/chialab/print2pdf-go/plain:latestThe lambda image can be used locally like this:
docker run --rm -it -p '8080:8080' -e 'BUCKET=mybucket' -e 'CHROMIUM_PATH=/usr/bin/chromium' --entrypoint '/usr/local/bin/aws-lambda-rie' ghcr.io/chialab/print2pdf-go/lambda:latest "/app/print2pdf"The image is based on lambda/provided, so it comes with Lambda RIE pre-packaged. See AWS documentation for more informations on how to deploy Lambda functions using container images.
Since it is expected to be run behind an API Gateway, to be used locally the request body must be converted to a JSON string
and used as value of a body parameter. Also, the actual endpoint to call is http://localhost:8080/2015-03-31/functions/function/invocations.
A Terraform module is provided in the terraform directory for convenience, it can be used to setup the AWS infrastructure
needed to deploy the image as a Lambda function:
module "lambda" {
source = "git::ssh://[email protected]:chialab/print2pdf-go.git//terraform"
...
}NOTE: you will need to build and push the Docker image to the created ECR repository before creating the Lambda function.
An Helm chart is provided in the chart directory for deploying the plain application in Kubernetes, and is distributed using GitHub's OCI container registry.
The chart repo URL is oci://ghcr.io/chialab/helm-charts/print2pdf-go. Usage example:
helm install example-release oci://ghcr.io/chialab/helm-charts/print2pdf-go --namespace example-ns --values example.yml --version ~0.1.0