Skip to main content

Creates PDFs from HTML rendered using chrome or chromium

Project description

Pychromepdf

Pychromepdf is a Python package that lets you easily create PDFs by rendering HTML content using Chrome or Chromium as backend. It works without any external dependecies except a working installation of Chrome or Chromium that supports headless mode.

Installation

pip install pychromepdf

Usage

Rendering HTML bytestring to PDF

from pychromepdf import ChromePDF

# change to your chrome executable path
PATH_TO_CHROME_EXE = '/usr/bin/google-chrome-stable'

if __name__ == '__main__':
    # initialize chromepdf object
    cpdf = ChromePDF(PATH_TO_CHROME_EXE)

    # the html that need to be rendered into pdf
    html_bytestring = '''
    <!doctype html>
    <html>
        <head>
            <style>
            @media print {
                @page { margin: 0; }
                body { margin: 1.6cm; }
            }
            </style>
        </head>
        <body>
            <h1>Hello, World</h1>
            <h5> Generated using headless chrome </h5>
        </body>
    </html>
    '''

    # create a file and write the pdf to it
    with open('test.pdf','w') as output_file:
        if cpdf.html_to_pdf(html_bytestring,output_file):
            print("Successfully generated the pdf: {}".format(output_file.name))
        else:
            print("Error generating pdf")

Rendering a flask template into PDF

from flask import Flask, render_template, send_file
import tempfile
from pychromepdf import ChromePDF

app = Flask(__name__)

# change to your chrome executable path
PATH_TO_CHROME_EXE = '/usr/bin/google-chrome-stable'

# initialize a chromepdf object
cpdf = ChromePDF(PATH_TO_CHROME_EXE)

# home route
@app.route('/')
def index():
    return render_template('index.html',username="John")

# custom pdf route
@app.route('/getpdf',defaults={'username': 'John'})
@app.route('/getpdf/<username>')
def getpdf(username):

    # get the rendered html as string using the template
    rendered_html = render_template('index.html',username=username)

    # create a temporary output file which will be deleted when closed
    with tempfile.NamedTemporaryFile(suffix='.pdf') as output_file:

        # create a pdf from the rendered html and write it to output_file
        if cpdf.html_to_pdf(rendered_html,output_file):
            print("PDF generated successfully: {0}".format(output_file.name))

            try:
                # send the file to user
                return send_file(output_file.name,attachment_filename='awesome.pdf')
            except Exception as e:
                return str(e)
        else:
            print("Error creating PDF")

    return "Error"
                

if __name__ == '__main__':
    app.run(debug=True)

Template

{# templates/index.html #}

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Example</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>
        @media print {
            @page { margin: 0; }
            body { margin: 1.6cm; }
        }
    </style>    
</head>
<body>
    <h1>Hello {{ username }}!</h1>
    <h4>Generated using ChromePDF</h4>
</body>
</html>

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for pychromepdf, version 0.0.4
Filename, size File type Python version Upload date Hashes
Filename, size pychromepdf-0.0.4.tar.gz (3.3 kB) File type Source Python version None Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page