Nos complace anunciar el lanzamiento de GroupDocs.Markdown for .NET 26.3, disponible a partir de marzo 2026. Esta actualización importante introduce una API pública rediseñada, un renderizador de Markdown basado en DOM personalizado, control total del sabor de Markdown, soporte async y una serie de correcciones de errores. También agrega paquetes NuGet de tiempo de ejecución por TFM y soporte para .NET 8 y .NET 10.

Novedades en esta versión

Clave Categoría Resumen
MARKDOWNNET-33 Funcionalidad Dividir el paquete NuGet en paquetes de tiempo de ejecución por TFM
MARKDOWNNET-31 Funcionalidad Agregar soporte para .NET 8 y .NET 10
MARKDOWNNET-30 Funcionalidad Renderizador de Markdown basado en DOM personalizado
MARKDOWNNET-29 Funcionalidad Advertencias de conversión y modelo de error unificado
MARKDOWNNET-28 Funcionalidad Rutas de imagen relativas y reemplazo de imágenes
MARKDOWNNET-27 Funcionalidad Desplazamiento de nivel de encabezado y generación de front matter YAML
MARKDOWNNET-26 Funcionalidad Control del sabor de Markdown y opciones de renderizado de hojas de cálculo
MARKDOWNNET-25 Funcionalidad Inspección de documento sin conversión
MARKDOWNNET-24 Funcionalidad API async
MARKDOWNNET-23 Funcionalidad Métodos estáticos de conveniencia y descubrimiento de formatos
MARKDOWNNET-20 Mejora Revisar y rediseñar la API
MARKDOWNNET-8 Funcionalidad Soporte para reemplazar imágenes durante la conversión a Markdown
MARKDOWNNET-35 Corrección de error Problemas de calidad y funcionales

Cambios en la API pública

Nuevos tipos públicos

  • DocumentInfo — metadatos del documento (formato, número de páginas, título, autor, estado de cifrado)
  • MarkdownFlavor — enum para el dialecto de Markdown objetivo (GitHub, CommonMark)
  • IImageSavingHandler — interfaz para devoluciones de llamada personalizadas de guardado de imágenes
  • IUriSavingHandler — interfaz para devoluciones de llamada personalizadas de guardado de URI
  • GroupDocsMarkdownException — excepción general de conversión
  • InvalidFormatException — formato de archivo corrupto o no reconocido
  • DocumentProtectedException — contraseña incorrecta o ausente

Nuevos métodos estáticos en MarkdownConverter

  • ToMarkdown(string sourcePath) y sobrecargas con LoadOptions/ConvertOptions
  • ToFile(string sourcePath, string outputPath) y sobrecargas
  • GetInfo(string sourcePath) y sobrecargas
  • GetSupportedFormats()
  • Variantes async: ToMarkdownAsync, ToFileAsync, GetInfoAsync

Nuevos métodos de instancia en MarkdownConverter

  • GetDocumentInfo()
  • ConvertAsync() y sobrecargas

Nuevas propiedades en ConvertOptions

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

Nuevas propiedades en ConvertResult

  • Warnings — advertencias de conversión no fatales

Nuevas propiedades en ExportImagesToFileSystemStrategy y CustomImagesStrategy

  • ImagesRelativePath — controla la ruta escrita en las referencias de imagen de Markdown

Nuevos métodos en CustomImageSavingArgs

  • SetReplacementImage(Stream imageStream) — sustituye el contenido de la imagen

Tipos eliminados

  • IExportStrategy — reemplazado por IImageExportStrategy y IUriExportStrategy
  • DocumentConverterOptions — renombrado a ConvertOptions
  • DocumentConverterResult — renombrado a ConvertResult

Cambios incompatibles

Tipos renombrados

Antes Después
DocumentConverterOptions ConvertOptions
DocumentConverterResult ConvertResult

Enum FileFormat

Los valores a nivel de familia (FileFormat.WordProcessing, FileFormat.Spreadsheet) son reemplazados por formatos específicos (FileFormat.Docx, FileFormat.Xlsx, etc.). Nuevas entradas: FileFormat.Txt, FileFormat.Chm.

ConvertOptions y LoadOptions separadas

ConvertOptions ya no hereda de LoadOptions. La contraseña y las pistas de formato van en 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);

Estrategias de imagen y URI divididas

La única propiedad ExportStrategy se reemplaza con dos propiedades tipadas:

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

Delegados reemplazados por interfaces

CustomImagesStrategy y CustomUriExportStrategy ahora aceptan interfaces IImageSavingHandler y IUriSavingHandler en lugar de devoluciones de llamada de delegados.

LoadOptions.Extension y LoadOptions.MimeType son internos

Use new LoadOptions(FileFormat.Docx) en lugar de establecer Extension o MimeType directamente.

Nuevas funcionalidades

Renderizador de Markdown basado en DOM personalizado

La biblioteca ya no delega la generación de Markdown a una exportación de terceros. Un renderizador personalizado recorre el modelo de objetos del documento nodo por nodo y produce Markdown directamente, proporcionando control total sobre cada aspecto del resultado.

Documentos Word/PDF/Ebook/Text/CHM se renderizan con soporte para párrafos, encabezados (H1‑H6), negrita, cursiva, tachado, código en línea, listas ordenadas y desordenadas con anidamiento, tablas (sintaxis de tubería GFM o bloque de código CommonMark como alternativa), hipervínculos e imágenes.

Hojas de cálculo se renderizan con recorrido de cuadrícula celda por celda, formato de valores tipados, secciones de hoja de trabajo, truncamiento de columnas/filas con indicadores de elipsis, filtrado de hojas ocultas y separadores de hoja personalizados.

Métodos estáticos de conveniencia

Métodos de conversión de una sola línea que manejan la gestión de recursos automáticamente:

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

API async

Contrapartes async para todos los métodos estáticos y de instancia con soporte de CancellationToken:

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

Inspección de documento sin conversión

Recupera los metadatos del documento sin realizar una conversión completa:

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

Control del sabor de Markdown

Apunta a un dialecto específico de Markdown:

var options = new ConvertOptions { Flavor = MarkdownFlavor.GitHub }; // tablas con tubería, tachado
var options = new ConvertOptions { Flavor = MarkdownFlavor.CommonMark }; // tablas como bloques de código

Opciones de renderizado de hojas de cálculo

Control total sobre cómo se renderizan las hojas de cálculo a Markdown:

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

Desplazamiento de nivel de encabezado y front matter YAML

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

Advertencias de conversión y modelo de error unificado

Todos los métodos Convert() ahora lanzan excepciones en caso de fallo. ConvertResult contiene advertencias no fatales:

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

Reemplazo de imágenes y rutas relativas

Reemplaza imágenes durante la conversión y controla las referencias de ruta:

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

Renderizado de tabla de contenidos

Los documentos con tabla de contenidos se renderizan como listas limpias en lugar de códigos de campo sin procesar:

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

Ejemplo de código

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

Cómo obtener la actualización

NuGet

Actualiza al último paquete GroupDocs.Markdown a través de NuGet (p. ej., Install-Package GroupDocs.Markdown).

Recursos