Skip to content

Latest commit

 

History

History
194 lines (150 loc) · 7.07 KB

pdf-reports.md

File metadata and controls

194 lines (150 loc) · 7.07 KB
jupyter
jupytextkernelspecplotly
notebook_metadata_filtertext_representation
all
extensionformat_nameformat_versionjupytext_version
.md
markdown
1.1
1.1.1
display_namelanguagename
Python 2
python
python2
descriptiondisplay_aslanguagelayoutnameorderpage_typepermalinkthumbnail
How to make PDF reports with Python and Plotly Graphs.
report_generation
python
base
Python PDF Reports
1
example_index
python/pdf-reports/
thumbnail/ipython_10_pdf_report.jpg

Since Plotly graphs can be embedded in HTML or exported as a static image, you can embed Plotly graphs in reports suited for print and for the web. This notebook is a primer on creating PDF reports with Python from HTML with Plotly graphs. This notebook uses:

  • Plotly for interactive, web native graphs
  • IPython Notebook to create this notebook, combining text, HTML, and Python code
  • xhtml2pdf to convert HTML to PDF in Python

Run ! pip install xhtml2pdf in the Terminal to install the xhtml2pdf package.

Create the HTML Template

First choose the plots that you'd like to add to the report.

graphs= ['https://plot.ly/~christopherp/308', 'https://plot.ly/~christopherp/306', 'https://plot.ly/~christopherp/300', 'https://plot.ly/~christopherp/296']
fromIPython.displayimportdisplay, HTMLdefreport_block_template(report_type, graph_url, caption=''): ifreport_type=='interactive': graph_block='<iframe style="border: none;" src="{graph_url}.embed" width="100%" height="600px"></iframe>'elifreport_type=='static': graph_block= ('''<a href="{graph_url}" target="_blank">'# Open the interactive graph when you click on the image'<img style="height: 400px;" src="{graph_url}.png">''</a>') report_block= (''+graph_block+'{caption}'+# Optional caption to include below the graph'<br>'+# Line break'<a href="{graph_url}" style="color: rgb(190,190,190); text-decoration: none; font-weight: 200;" target="_blank">'+'Click to comment and see the interactive graph'+# Direct readers to Plotly for commenting, interactive graph'</a>'+'<br>'+'<hr>') # horizontal linereturnreport_block.format(graph_url=graph_url, caption=caption) interactive_report=''static_report=''forgraph_urlingraphs: _static_block=report_block_template('static', graph_url, caption='') _interactive_block=report_block_template('interactive', graph_url, caption='') static_report+=_static_blockinteractive_report+=_interactive_block

Display the Interactive Report

This version, suited for the web, contains the interactive version of the Plotly graphs, served from Plotly's server.

display(HTML(interactive_report))

Display the Static Report

This version is easy to convert to PDF. It contains the static version of the Plotly graphs, also served from Plotly's server.

display(HTML(static_report))
importxhtml2pdffromxhtml2pdfimportpisa

Part 2 - Convert the HTML to PDF with xhtml2pdf

fromxhtml2pdfimportpisa# Utility functiondefconvert_html_to_pdf(source_html, output_filename): # open output file for writing (truncated binary)result_file=open(output_filename, "w+b") # convert HTML to PDFpisa_status=pisa.CreatePDF( source_html, # the HTML to convertdest=result_file) # file handle to recieve result# close output fileresult_file.close() # close output file# return True on success and False on errorsreturnpisa_status.errconvert_html_to_pdf(static_report, 'report.pdf') ! openreport.pdf

Generating Images on the fly

The static report in the example above uses graphs that were already created in Plotly. Sometimes it's helpful to use graph images that are created on-the-fly. For example, if you're using plotly.js to create the web-reports you might not be saving the graphs to accounts on plot.ly.

To create static images of graphs on-the-fly, use the plotly.plotly.image class. This class generates images by making a request to the Plotly image server.

Here's an alternative template that uses py.image.get to generate the images and template them into an HTML and PDF report.

importplotly.plotlyaspyimportbase64width=600height=600template= ('''<img style="width: {width}; height: {height}" src="data:image/png;base64,{image}">''{caption}'# Optional caption to include below the graph'<br>''<hr>''') # A collection of Plotly graphsfigures= [ {'data': [{'x': [1,2,3], 'y': [3,1,6]}], 'layout': {'title': 'the first graph'}}, {'data': [{'x': [1,2,3], 'y': [3,7,6], 'type': 'bar'}], 'layout': {'title': 'the second graph'}} ] # Generate their images using `py.image.get`images= [base64.b64encode(py.image.get(figure, width=width, height=height)).decode('utf-8') forfigureinfigures] report_html=''forimageinimages: _=template_=_.format(image=image, caption='', width=width, height=height) report_html+=_display(HTML(report_html)) convert_html_to_pdf(report_html, 'report-2.pdf')

Learn more

! pipinstallpublisher--upgradefromIPython.displayimportHTML, displaydisplay(HTML('<link href="//fonts.googleapis.com/css?family=Open+Sans:600,400,300,200|Inconsolata|Ubuntu+Mono:400,700" rel="stylesheet" type="text/css" />')) display(HTML('<link rel="stylesheet" type="text/css" href="https://help.plot.ly/documentation/all_static/css/ipython-notebook-custom.css">')) ! pipinstallgit+https://github.com/plotly/publisher.git--upgradeimportpublisherpublisher.publish('pdf-reports.ipynb', 'python/pdf-reports/', 'PDF Reports''How to make PDF reports with Python and Plotly Graphs.', title='Python PDF Reports | plotly', name='PDF Reports', has_thumbnail='true', thumbnail='thumbnail/ipython_10_pdf_report.jpg', language='python', page_type='example_index', display_as='report_generation', order=1)
close