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 imagemIUriSavingHandler— interface para callbacks personalizados de salvamento de URIGroupDocsMarkdownException— exceção geral de conversãoInvalidFormatException— formato de arquivo corrompido ou não reconhecidoDocumentProtectedException— senha errada ou ausente
New static methods on MarkdownConverter
ToMarkdown(string sourcePath)and overloads withLoadOptions/ConvertOptionsToFile(string sourcePath, string outputPath)and overloadsGetInfo(string sourcePath)and overloadsGetSupportedFormats()- Async variants:
ToMarkdownAsync,ToFileAsync,GetInfoAsync
New instance methods on MarkdownConverter
GetDocumentInfo()ConvertAsync()and overloads
New properties on ConvertOptions
ImageExportStrategy(replacesExportStrategy)UriExportStrategyHeadingLevelOffsetIncludeFrontMatterFlavorMaxColumns,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 byIImageExportStrategyandIUriExportStrategyDocumentConverterOptions— renamed toConvertOptionsDocumentConverterResult— renamed toConvertResult
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" // 
};
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).