We’re pleased to announce the release of GroupDocs.Markdown for .NET 26.3, available as of March 2026. This major update introduces a redesigned public API, a custom DOM‑based Markdown renderer, full Markdown flavor control, async support, and a range of bug fixes. It also adds per‑TFM runtime NuGet packages and support for .NET 8 and .NET 10.

What’s new in this release

Key Category Summary
MARKDOWNNET-33 Feature Split NuGet package into per-TFM runtime packages
MARKDOWNNET-31 Feature Add support for .NET 8 and .NET 10
MARKDOWNNET-30 Feature Custom DOM-based Markdown renderer
MARKDOWNNET-29 Feature Conversion warnings and unified error model
MARKDOWNNET-28 Feature Relative image paths and image replacement
MARKDOWNNET-27 Feature Heading level offset and YAML front matter generation
MARKDOWNNET-26 Feature Markdown flavor control and spreadsheet rendering options
MARKDOWNNET-25 Feature Document inspection without conversion
MARKDOWNNET-24 Feature Async API
MARKDOWNNET-23 Feature Static convenience methods and format discovery
MARKDOWNNET-20 Enhancement Review and redesign the API
MARKDOWNNET-8 Feature Support for replacing images during conversion to Markdown
MARKDOWNNET-35 Bug Fix Quality and functional issues

Public API changes

New public types

  • DocumentInfo — document metadata (format, page count, title, author, encryption status)
  • MarkdownFlavor — enum for target Markdown dialect (GitHub, CommonMark)
  • IImageSavingHandler — interface for custom image saving callbacks
  • IUriSavingHandler — interface for custom URI saving callbacks
  • GroupDocsMarkdownException — general conversion exception
  • InvalidFormatException — corrupt or unrecognized file format
  • DocumentProtectedException — wrong or missing password

New static methods on MarkdownConverter

  • ToMarkdown(string sourcePath) and overloads with LoadOptions/ConvertOptions
  • ToFile(string sourcePath, string outputPath) and overloads
  • GetInfo(string sourcePath) and overloads
  • GetSupportedFormats()
  • Async variants: ToMarkdownAsync, ToFileAsync, GetInfoAsync

New instance methods on MarkdownConverter

  • GetDocumentInfo()
  • ConvertAsync() and overloads

New properties on ConvertOptions

  • ImageExportStrategy (replaces ExportStrategy)
  • UriExportStrategy
  • HeadingLevelOffset
  • IncludeFrontMatter
  • Flavor
  • MaxColumns, MaxRows, SheetSeparator, IncludeHiddenSheets

New properties on ConvertResult

  • Warnings — non‑fatal conversion warnings

New properties on ExportImagesToFileSystemStrategy and CustomImagesStrategy

  • ImagesRelativePath — controls the path written in Markdown image references

New methods on CustomImageSavingArgs

  • SetReplacementImage(Stream imageStream) — substitute image content

Removed types

  • IExportStrategy — replaced by IImageExportStrategy and IUriExportStrategy
  • DocumentConverterOptions — renamed to ConvertOptions
  • DocumentConverterResult — renamed to ConvertResult

Breaking changes

Renamed Types

Before After
DocumentConverterOptions ConvertOptions
DocumentConverterResult ConvertResult

FileFormat Enum

Family‑level values (FileFormat.WordProcessing, FileFormat.Spreadsheet) are replaced with specific formats (FileFormat.Docx, FileFormat.Xlsx, etc.). New entries: FileFormat.Txt, FileFormat.Chm.

ConvertOptions and LoadOptions separated

ConvertOptions no longer inherits LoadOptions. Password and format hints go on LoadOptions:

var loadOptions = new LoadOptions(FileFormat.Docx) { Password = "secret" };
var convertOptions = new ConvertOptions { HeadingLevelOffset = 1 };
using var converter = new MarkdownConverter("file.docx", loadOptions);
var result = converter.Convert(convertOptions);

Image and URI strategies split

Single ExportStrategy property replaced with two typed properties:

var options = new ConvertOptions
{
    ImageExportStrategy = new ExportImagesToFileSystemStrategy("images"),
    UriExportStrategy = new CustomUriExportStrategy(handler)
};

Delegates replaced with interfaces

CustomImagesStrategy and CustomUriExportStrategy now accept IImageSavingHandler and IUriSavingHandler interfaces instead of delegate callbacks.

LoadOptions.Extension and LoadOptions.MimeType are internal

Use new LoadOptions(FileFormat.Docx) instead of setting Extension or MimeType directly.

New features

Custom DOM‑Based Markdown Renderer

The library no longer delegates Markdown generation to a third‑party export. A custom renderer walks the document object model node by node and produces Markdown directly, providing full control over every aspect of the output.

Word/PDF/Ebook/Text/CHM documents are rendered with support for paragraphs, headings (H1‑H6), bold, italic, strikethrough, inline code, ordered and unordered lists with nesting, tables (GFM pipe syntax or CommonMark code block fallback), hyperlinks, and images.

Spreadsheets are rendered with cell‑by‑cell grid traversal, typed value formatting, worksheet sections, column/row truncation with ellipsis indicators, hidden sheet filtering, and custom sheet separators.

Static Convenience Methods

One‑liner conversion methods that handle resource management automatically:

string md = MarkdownConverter.ToMarkdown("report.docx");
MarkdownConverter.ToFile("report.docx", "report.md");
IReadOnlyList<FileFormat> formats = MarkdownConverter.GetSupportedFormats();

Async API

Async counterparts for all static and instance methods with CancellationToken support:

string md = await MarkdownConverter.ToMarkdownAsync("report.docx");
await MarkdownConverter.ToFileAsync("large.pdf", "output.md");
DocumentInfo info = await MarkdownConverter.GetInfoAsync("report.docx");

Document Inspection Without Conversion

Retrieve document metadata without performing a full conversion:

DocumentInfo info = MarkdownConverter.GetInfo("report.docx");
Console.WriteLine($"{info.FileFormat}, {info.PageCount} pages, by {info.Author}");

Markdown Flavor Control

Target a specific Markdown dialect:

var options = new ConvertOptions { Flavor = MarkdownFlavor.GitHub }; // pipe tables, strikethrough
var options = new ConvertOptions { Flavor = MarkdownFlavor.CommonMark }; // tables as code blocks

Spreadsheet Rendering Options

Full control over how spreadsheets are rendered to Markdown:

var options = new ConvertOptions
{
    MaxColumns = 8,
    MaxRows = 50,
    SheetSeparator = "\n---\n",
    IncludeHiddenSheets = false
};

Heading Level Offset and YAML Front Matter

var options = new ConvertOptions
{
    HeadingLevelOffset = 2,       // # Title  ->  ### Title
    IncludeFrontMatter = true     // prepend YAML metadata
};

Conversion Warnings and Unified Error Model

All Convert() methods now throw on failure. ConvertResult carries non‑fatal warnings:

ConvertResult result = converter.Convert();
foreach (string w in result.Warnings)
    Console.WriteLine(w);  // e.g. "Worksheet 'Data' truncated at 50 rows."

Image Replacement and Relative Paths

Replace images during conversion and control path references:

var strategy = new ExportImagesToFileSystemStrategy("c:/output/images")
{
    ImagesRelativePath = "images"  // ![](images/img-001.png)
};

Table of Contents Rendering

Documents with Table of Contents are rendered as clean lists instead of raw field codes:

- Introduction
- 1.  Executive Summary
- 2.  Company Overview

Code example

string md = MarkdownConverter.ToMarkdown("report.docx");
MarkdownConverter.ToFile("report.docx", "report.md");
IReadOnlyList<FileFormat> formats = MarkdownConverter.GetSupportedFormats();

How to get the update

NuGet

Upgrade to the latest GroupDocs.Markdown package via NuGet (e.g., Install-Package GroupDocs.Markdown).

Resources