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

Chave Categoria Resumo
MARKDOWNNET-33 Recurso Dividir o pacote NuGet em pacotes de tempo de execução por TFM
MARKDOWNNET-31 Recurso Adicionar suporte para .NET 8 e .NET 10
MARKDOWNNET-30 Recurso Renderizador Markdown baseado em DOM personalizado
MARKDOWNNET-29 Recurso Avisos de conversão e modelo de erro unificado
MARKDOWNNET-28 Recurso Caminhos de imagem relativos e substituição de imagem
MARKDOWNNET-27 Recurso Deslocamento de nível de cabeçalho e geração de front matter YAML
MARKDOWNNET-26 Recurso Controle de sabor Markdown e opções de renderização de planilhas
MARKDOWNNET-25 Recurso Inspeção de documento sem conversão
MARKDOWNNET-24 Recurso API assíncrona
MARKDOWNNET-23 Recurso Métodos estáticos de conveniência e descoberta de formatos
MARKDOWNNET-20 Melhoria Revisar e redesenhar a API
MARKDOWNNET-8 Recurso Suporte para substituir imagens durante a conversão para Markdown
MARKDOWNNET-35 Correção de Bug Problemas de qualidade e funcionais

Public API changes

New public types

  • DocumentInfo — metadados do documento (formato, número de páginas, título, autor, status de criptografia)
  • MarkdownFlavor — enum para dialeto Markdown alvo (GitHub, CommonMark)
  • IImageSavingHandler — interface para callbacks personalizados de salvamento de imagem
  • IUriSavingHandler — interface para callbacks personalizados de salvamento de URI
  • GroupDocsMarkdownException — exceção geral de conversão
  • InvalidFormatException — formato de arquivo corrompido ou não reconhecido
  • DocumentProtectedException — senha errada ou ausente

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 — avisos de conversão não fatais

New properties on ExportImagesToFileSystemStrategy and CustomImagesStrategy

  • ImagesRelativePath — controla o caminho escrito nas referências de imagem Markdown

New methods on CustomImageSavingArgs

  • SetReplacementImage(Stream imageStream) — substitui o conteúdo da imagem

Removed types

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

Breaking changes

Renamed Types

Antes Depois
DocumentConverterOptions ConvertOptions
DocumentConverterResult ConvertResult

FileFormat Enum

Valores de nível de família (FileFormat.WordProcessing, FileFormat.Spreadsheet) são substituídos por formatos específicos (FileFormat.Docx, FileFormat.Xlsx, etc.). Novas entradas: FileFormat.Txt, FileFormat.Chm.

ConvertOptions and LoadOptions separated

ConvertOptions não herda mais LoadOptions. Senha e dicas de formato vão em 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

A propriedade única ExportStrategy foi substituída por duas propriedades tipadas:

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

Delegates replaced with interfaces

CustomImagesStrategy e CustomUriExportStrategy agora aceitam as interfaces IImageSavingHandler e IUriSavingHandler em vez de callbacks de delegate.

LoadOptions.Extension and LoadOptions.MimeType are internal

Use new LoadOptions(FileFormat.Docx) em vez de definir Extension ou MimeType diretamente.

New features

Custom DOM‑Based Markdown Renderer

A biblioteca não delega mais a geração de Markdown a um exportador de terceiros. Um renderizador personalizado percorre o modelo de objeto de documento nó a nó e produz Markdown diretamente, proporcionando controle total sobre cada aspecto da saída.

Documentos Word/PDF/Ebook/Text/CHM são renderizados com suporte a parágrafos, cabeçalhos (H1‑H6), negrito, itálico, tachado, código embutido, listas ordenadas e não ordenadas com aninhamento, tabelas (sintaxe de pipe GFM ou fallback para bloco de código CommonMark), hyperlinks e imagens.

Planilhas são renderizadas com travessia de grade célula a célula, formatação de valores tipados, seções de planilha, truncamento de colunas/linhas com indicadores de elipse, filtragem de planilhas ocultas e separadores de planilha personalizados.

Static Convenience Methods

Métodos de conversão de uma linha que gerenciam recursos automaticamente:

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

Async API

Contrapartes assíncronas para todos os métodos estáticos e de instância com suporte a CancellationToken:

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

Recupere metadados do documento sem executar uma conversão completa:

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

Markdown Flavor Control

Alvo um dialeto Markdown específico:

var options = new ConvertOptions { Flavor = MarkdownFlavor.GitHub }; // tabelas pipe, tachado
var options = new ConvertOptions { Flavor = MarkdownFlavor.CommonMark }; // tabelas como blocos de código

Spreadsheet Rendering Options

Controle total sobre como planilhas são renderizadas para 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

Todos os métodos Convert() agora lançam exceção em caso de falha. ConvertResult carrega avisos não fatais:

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

Substitua imagens durante a conversão e controle as referências de caminho:

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

Table of Contents Rendering

Documentos com Sumário são renderizados como listas limpas em vez de códigos de campo brutos:

- 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

Atualize para o pacote mais recente GroupDocs.Markdown via NuGet (por exemplo, Install-Package GroupDocs.Markdown).

Resources