Download Latest Version 2026.9.1 source code.zip (62.0 MB) Google Add to Preferred Sources
Home / 2026.9.0
Name Modified Size InfoDownloads / 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.UseEnvironmentFonts has been renamed to Settings.UseSystemFonts and is now disabled by default. QuestPDF uses its bundled Lato fonts, fonts discovered through Settings.FontDiscoveryPath, and fonts registered through FontManager.

  • Unavailable font families now stop document generation. The new Settings.ThrowOnMissingFontFamilies flag is enabled by default. When document text references an unavailable font family, QuestPDF throws a DocumentDrawingException listing the missing families, registered fonts, and suggested solutions.

  • Missing text glyphs now stop document generation. Settings.CheckIfAllTextGlyphsAreAvailable has been renamed to Settings.ThrowOnMissingTextGlyphs and 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 LatoFont folder has been replaced with QuestPDF.Fonts.Lato.br on .NET 5 and newer, and QuestPDF.Fonts.Lato.gz on .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 the LatoFont folder must copy the archive instead.

Font management

  • Simplified font registration with FontManager.RegisterFontFromFile, RegisterFontFromBinaryData, RegisterFontFromStream, RegisterFontFromEmbeddedResource, and RegisterFontsFromDirectory. Font family names and attributes are read directly from the font files.

  • Font family matching is now case-insensitive: FontFamily("lato") and FontFamily("LATO") both select Lato. This applies to registered fonts, system fonts, and SVG text.

  • Added FontManager.GetRegisteredFonts() and FontManager.GetSystemFonts(). Both return FontInfo records 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 by TextStyle.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 when Settings.UseSystemFonts is enabled.

  • Improved font-family parsing to support quoted and unquoted names and comma-separated fallback lists, such as font-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-family is specified. This prevents text from disappearing because a font family is unavailable or unspecified.

  • Added support for the dominant-baseline attribute on text elements.

  • Fixed handling of the vertical offset specified by dy on tspan elements.

  • Fixed glyph positioning for text aligned using the text-anchor attribute.

  • Added basic support for the em and ex length units.

  • Changed the default font size for text without a font-size attribute 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–SemanticHeader6 to SemanticHeading1–SemanticHeading6, matching PDF/UA terminology.

  • Renamed Settings.EnableDebugging to Settings.EnableDetailedLayoutErrors and 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, the DocumentLayoutException includes 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 Trace warnings 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.

Source: README.md, updated 2026-09-14