| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| QuestPDF.2026.9.0.snupkg | 2026-09-14 | 566.2 kB | |
| QuestPDF.2026.9.0.nupkg | 2026-09-14 | 49.6 MB | |
| 2026.9.0 source code.tar.gz | 2026-09-14 | 61.5 MB | |
| 2026.9.0 source code.zip | 2026-09-14 | 61.9 MB | |
| README.md | 2026-09-14 | 7.7 kB | |
| Totals: 5 Items | 173.7 MB | 6 | |
This release is dedicated to text handling improvements
QuestPDF 2026.9.0 improves font management to make document rendering more predictable across development machines, CI, containers, and cloud environments.
Fonts installed on the operating system vary between machines. A document that looks correct during development may use different fallback fonts, display placeholder glyphs, or lose text after deployment. To help catch these problems before a PDF reaches its recipient, QuestPDF now excludes system fonts by default and validates font availability and glyph coverage during document generation.
Upgrading to 2026.9.0
Deploy the required font files with your application and reference them by the family names stored in those files. Fonts in the application directory are registered automatically; you can also register them explicitly through FontManager. Use FontManager.GetRegisteredFonts() to inspect the available family names.
Please compare previous settings with the new defaults:
:::csharp
// previous behavior:
QuestPDF.Settings.UseSystemFonts = true;
QuestPDF.Settings.ThrowOnMissingFontFamilies = false;
QuestPDF.Settings.ThrowOnMissingTextGlyphs = false;
QuestPDF.Settings.EnableDetailedLayoutErrors = false;
// current behavior:
QuestPDF.Settings.UseSystemFonts = false;
QuestPDF.Settings.ThrowOnMissingFontFamilies = true;
QuestPDF.Settings.ThrowOnMissingTextGlyphs = true;
QuestPDF.Settings.EnableDetailedLayoutErrors = true;
Also review the deployment and API changes below. Renamed APIs remain available under their previous names, marked as obsolete with compiler warnings.
Covering additional languages
QuestPDF includes the bundled Lato font, which covers Latin, Greek, and Cyrillic scripts. For other scripts, such as Chinese, Japanese, Korean, Arabic, Hebrew, Thai, or emoji, we recommend additionally deploying the free, open-source Google Noto font family, registering it with FontManager, and configuring it as a font fallback in the default text style of the document.
:::csharp
// at application startup
FontManager.RegisterFontsFromDirectory("Fonts/Noto");
// in the document
Document.Create(document =>
{
document.Page(page =>
{
page.DefaultTextStyle(style => style.FontFamily("Lato", "Noto Sans", "Noto Sans CJK SC", "Noto Emoji"));
});
});
⚠️ Breaking changes
-
System fonts are no longer used by default.
Settings.UseEnvironmentFontshas been renamed toSettings.UseSystemFontsand is now disabled by default. QuestPDF uses its bundled Lato fonts, fonts discovered throughSettings.FontDiscoveryPath, and fonts registered throughFontManager. -
Unavailable font families now stop document generation. The new
Settings.ThrowOnMissingFontFamiliesflag is enabled by default. When document text references an unavailable font family, QuestPDF throws aDocumentDrawingExceptionlisting the missing families, registered fonts, and suggested solutions. -
Missing text glyphs now stop document generation.
Settings.CheckIfAllTextGlyphsAreAvailablehas been renamed toSettings.ThrowOnMissingTextGlyphsand is now enabled by default, rather than only when a debugger is attached. If no available font can render a glyph, generation stops with an exception identifying the missing glyphs and the fonts involved. -
The bundled Lato fonts are now distributed as a single compressed archive. The
LatoFontfolder has been replaced withQuestPDF.Fonts.Lato.bron .NET 5 and newer, andQuestPDF.Fonts.Lato.gzon .NET Standard 2.0 / .NET Framework. This reduces the library’s disk footprint by approximately 40%. Standard build and publish operations require no changes. Deployment scripts that explicitly copy theLatoFontfolder must copy the archive instead.
Font management
-
Simplified font registration with
FontManager.RegisterFontFromFile,RegisterFontFromBinaryData,RegisterFontFromStream,RegisterFontFromEmbeddedResource, andRegisterFontsFromDirectory. Font family names and attributes are read directly from the font files. -
Font family matching is now case-insensitive:
FontFamily("lato")andFontFamily("LATO")both select Lato. This applies to registered fonts, system fonts, and SVG text. -
Added
FontManager.GetRegisteredFonts()andFontManager.GetSystemFonts(). Both returnFontInforecords describing the available typefaces, including family name, PostScript name, weight, and flags indicating whether a font is italic or variable. Use these methods to identify the family names accepted byTextStyle.FontFamily. -
Fonts are now loaded when the first document is generated, rather than during type initialization. Configure font-related settings at application startup, before generating any documents.
-
Automatic font discovery now skips font files that cannot be loaded.
SVG improvements
-
SVG text can now use fonts registered through
FontManager. System fonts are available only whenSettings.UseSystemFontsis enabled. -
Improved
font-familyparsing to support quoted and unquoted names and comma-separated fallback lists, such asfont-family="'Open Sans', Lato". The first available family is selected. Previously, only the first entry was considered, and it required an exact match. -
SVG text now falls back to Lato when none of the requested font families is available or no
font-familyis specified. This prevents text from disappearing because a font family is unavailable or unspecified. -
Added support for the
dominant-baselineattribute on text elements. -
Fixed handling of the vertical offset specified by
dyontspanelements. -
Fixed glyph positioning for text aligned using the
text-anchorattribute. -
Added basic support for the
emandexlength units. -
Changed the default font size for text without a
font-sizeattribute from 24px to 16px, matching web browsers. -
Fixed a layout failure when rendering SVG images with percentage dimensions and no
viewBox.
Deprecations
-
Deprecated
FontManager.RegisterFontWithCustomName. Use the font registration methods listed above and reference fonts by the family names stored in their files. Family names are matched case-insensitively. -
Deprecated
QuestPDF.Helpers.Fonts. Its constants reference fonts that may not be available in the target environment. Pass the family name of a deployed or registered font as a string instead.
Other improvements
-
Renamed
SemanticHeader1–SemanticHeader6toSemanticHeading1–SemanticHeading6, matching PDF/UA terminology. -
Renamed
Settings.EnableDebuggingtoSettings.EnableDetailedLayoutErrorsand enabled it by default, rather than only when a debugger is attached. This setting has no performance cost for successfully rendered documents. When a layout error occurs, theDocumentLayoutExceptionincludes the likely location of the problem and relevant layout measurements. Consider disabling this setting if logged exception messages must not contain fragments of document content. -
Image and font files loaded from disk are no longer memory-mapped. These files are no longer kept locked while the application runs, simplifying updates and deployments.
-
Removed startup
Tracewarnings about font and debugging configuration. -
Fixed incorrect rendering of soft hyphens.
-
Companion App: Increased the HTTP request timeout from 5 to 10 seconds to improve reliability with large documents.