fpdf2 - HTML (original) (raw)

fpdf2 supports basic rendering from HTML.

This is implemented by using html.parser.HTMLParser from the Python standard library. The whole HTML 5 specification is not supported, and neither is CSS, but bug reports & contributions are very welcome to improve this. cf. Supported HTML features below for details on its current limitations.

For a more robust & feature-full HTML-to-PDF converter in Python, you may want to check Reportlab (or xhtml2pdf based on it), WeasyPrint or borb.

write_html usage example

HTML rendering requires the use of FPDF.write_html():

`from fpdf import FPDF

pdf = FPDF() pdf.add_page() pdf.write_html("""

Description title
Description Detail

Big title

Section title

Hello world. I am tired.

py-pdf/fpdf2 GitHub repo

right aligned text

i am a paragraph
in two parts.

hello in green

hello small

hello helvetica

hello times

Other section title

  1. ordered
  2. list
  3. items


i am preformatted text.

hello blockquote
ID Name
1 Alice
2 Bob
""") pdf.output("html.pdf") `

Styling HTML tags globally

New in 2.7.9

The style of several HTML tags (<a>, <blockquote>, <code>, <pre>, <h1>, <h2>, <h3>...) can be set globally, for the whole HTML document, by passing tag_styles to FPDF.write_html():

`from fpdf import FPDF, FontFace

pdf = FPDF() pdf.add_page() pdf.write_html("""

Big title

Section title

Hello world!

""", tag_styles={ "h1": FontFace(color="#948b8b", size_pt=32), "h2": FontFace(color="#948b8b", size_pt=24), }) pdf.output("html_styled.pdf") `

Similarly, the indentation of several HTML tags (<blockquote>, <dd>, <li>) can be set globally, for the whole HTML document, by passing tag_styles to FPDF.write_html():

`from fpdf import FPDF, TextStyle

pdf = FPDF() pdf.add_page() pdf.write_html("""

Term
Definition
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam.
""", tag_styles={ "dd": TextStyle(l_margin=5), "blockquote": TextStyle(color="#ccc", font_style="I", t_margin=5, b_margin=5, l_margin=10), }) pdf.output("html_dd_indented.pdf") `

⚠️ Note that this styling is currently only supported for a subset of all HTML tags, and that some FontFace or TextStyle properties may not be honored. However, Pull Request are welcome to implement missing features!

Default font

New in 2.8.0

The default font used by FPDF.write_html() is Times.

You can change this default font by passing font_family to this method:

`from fpdf import FPDF

pdf = FPDF() pdf.add_page() pdf.write_html("""

Big title

Section title

Hello world!

""", font_family="Helvetica") pdf.output("html_helvetica.pdf") `

Supported HTML features

Page breaks

New in 2.8.0

Page breaks can be triggered explicitly using the break-before or break-after CSS properties. For example you can use:

<br style="break-after: page">

or:

`

Top of a new page.

`

Known limitations

fpdf2 HTML renderer does not support some configurations of nested tags. For example:

You can also check the currently open GitHub issues with the tag html: label:html is:open

Using Markdown

Check the dedicated page: Combine with Markdown