Added
- support for Output Intents on document level - thanks to @lka
- support for shading patterns (gradients) - thanks to @andersonhc - PR 1334
- support for setting a minimal row height in tables
- support for
v_alignat the row level in tables - new optional
reset_page_indicesparameter forinsert_toc_placeholder() - support for
strikethrough text - support for
first_line_indentintext_region.Paragraph - new ViewerPreferences.print_scaling
- documentation on
fpdf2internals - documentation on generating Aztec Codes
- added Slovenian translation of the tutorial: Vodič - thanks to @DeepBlackHole
- support for adding TrueType fonts that are missing the
.notdefglyph - issue 1161 - thanks to @spacegaori - improved SVG image parsing speed by 50% to 70% - thanks to @petri-lipponen-movesense - PR 1350
- added tutorial "tuto7" (in English and German) with documentation to create PDF/A files with fpdf2 - thanks to @lka
Fixed
FPDF.write_html(): Fixed rendering of content following<a>tags; now correctly resets emphasis style post</a>tag: hyperlink styling contained within the tag authority. - issue 1311- FPDF.footer() does not "leak" its text style to the table of contents anymore
FPDF.table(): Fixed heading styles containing underline failing to render.FPDF.ln(): the method now allows a value of0to be provided forh.- font optimization: only include fonts effectively used in the final PDF document. Fonts added via
set_font()oradd_page()but not actually used in the document are no longer included in the final output. This reduces file size and improves performance, especially for documents with many fallback fonts. - issue 1382 - a
KeyErrorwas raised in some specific cases when auto-downscaling images - issue 1409Changed
- heading rows of tables are never rendered "alone" on a page anymore
I wrote my last post on fpdf2 18 months ago.
We released 7 more versions of fpdf2 since then!
This article will present some of the major features introduced since v2.7.3 to v2.8.1 of fpdf2:
click on the buttons below to reveal the various changes brought …

Pylint is a great static code analyser for Python code. I have been using it for several years, in various projects, and it's simple to use yet very powerful.
I even contributed to Pylint by submitting a new rule a few years ago : implicit-str-concat.
For an introduction to Pylint, you …
I wrote my latest post on fpdf2 almost a year ago.
As we just released a new version, v2.7,
this is the time to mention some recent additions to this library! 😊
This article will present some of the major features introduced between v2.5.3 & v2.7.3 of …
Following last week animated PDF adventure, I have been reading a series of one page dungeons... And yesterday I had the opportunity to play the best one in my opinion: The Sky-Blind Spire by Michael Prescott.
It has everythng I love on one page: a maze to explore, mysteries to …
Last week, while translating John Harper's micro-TTRPG World of Dungeons: Turbo Breakers, I discovered the wonderful world of one page dungeons, starting with Michael Prescott splendid production at trilemma.com and also the yearly One Page Dungeon Context.
While crawling through the OPDC 2021 entries, I discovered a great map …
fpdf2 is a simple & fast PDF creation library for Python that I have been maintaining since mid-2020.
In this article, I'm going to present some of the new features that landed since my last post on the subject. Hence, this will cover versions 2.5.0, 2.5.1 & 2 …
Added
- new parameters
new_xandnew_yforcell()andmulti_cell(), replacingln=0, thanks to @gmischler - new
add_highlight()method to insert highlight annotations: documentation - new
offset_rendering()method: documentation - new
.text_modeproperty: documentation - the page structure of the documentation has been revised, with a new page about adding text, thanks to @gmischler
- a warning is now raised if a context manager is used inside an
unbreakable()section, which is not supported
Changed
local_context()can now "scope" even more properties, likeblend_mode: documentation
Fixed
- No font properties should be leaked anymore after using markdown or in any other situations (cf. #359), thanks to @gmischler
- If
multi_cell(align="J")is given text with multiple paragraphs (text followed by an empty line) at once, it now renders the last line of each paragraph left-aligned,
instead of just the very last line (cf. #364), thanks to @gmischler - a regression: now again
multi_cell()always renders a cell, even iftxtis an empty string - cf. #349 - a bug with string width calculation when Markdown is enabled - cf. #351
- a few bugs when parsing some SVG files - cf. #356, #358 & #376
- a bug when using
multi_cell(..., split_only=True)inside anunbreakablesection - cf. #359
Deprecated
- The parameter
lntocell()andmulti_cell()is now deprecated, usenew_xandnew_yinstead. - The parameter
centertocell()is now deprecated, usealign="C"instead.
Displaying deprecation warnings
DeprecationWarnings are not displayed by Python by default.
Hence, every time you use a newer version of fpdf2, we strongly encourage you to execute your scripts
with the -Wd option (cf. documentation)
in order to get warned about deprecated features used in your code.
This can also be enabled programmatically with warnings.simplefilter('default', DeprecationWarning).
Last month, I realized late that October was hacktoberfest month!
This online event is a month-long celebration (October 1-31) of open source software run in partnership with different software companies, with a focus on encouraging contributions to open source projects.
While I participated in the 2019 edition as a contributor …
cf. https://fr.wikipedia.org/wiki/Fichier_de_test_Eicar
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
FROM: https://sebsauvage.net/links/?0rGdAQ
Pour vous amuser à en créer en Python, avec fpdf2:
#!/usr/bin/env python3
# REQUIRE: pip install fpdf2 pdf417 qrcode
import fpdf, pdf417, qrcode
EICAR = 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*'
pdf = fpdf.FPDF()
pdf.add_page()
pdf.set_font("Helvetica", size=30)
pdf.text(90, 20, "EICAR")
pdf.text(10, 60, "PDF-417:")
pdf.image(pdf417.render_image(pdf417.encode(EICAR)), x=10, y=60)
pdf.text(10, 140, "QRCode:")
pdf.image(qrcode.make(EICAR).get_image(), x=35, y=145)
pdf.output("eicar.pdf")I have been amazed recently at the diversity of contributors on the fpdf2 project, coming from all around the world!
Then I thought it would be nice to visualize this diversity by building a world map of all contributors locations. There it is:
Click on the image to access an …
fpdf2 is a minimalist PDF creation library for Python that I am maintaining.
With the release yesterday of its v2.4.0, I'm going to present some of its notable new features since the latest minor version.
https://github.com/pyfpdf/fpdf2/
Doc: https://pyfpdf.github.io/fpdf2/
JPEG images …

Today, I am happy to announce version 2.3.0 of fpdf2, code name: Unbreakable!
https://github.com/pyfpdf/fpdf2/
Doc: https://pyfpdf.github.io/fpdf2/
Why Unbreakable?
- As a tribute to M. Night Shyamalan movie
- Because using
fpdf2, your Python code can never break!
...
Just kidding, I would be …
fpdf2, the library I mentioned in my previous post, cannot parse existing PDF files.
However, other Python libraries can be combined with fpdf2
in order to add new content to existing PDF files.
This page provides several examples of doing so using pdfrw,
a great zero-dependency pure Python library dedicated …

