Мы рады объявить о выпуске GroupDocs.Markdown for .NET 26.3, доступном с мартa 2026. Это крупное обновление представляет переработанный публичный API, пользовательский рендерер Markdown на основе DOM, полный контроль над диалектом Markdown, поддержку асинхронных операций и ряд исправлений ошибок. Также добавлены runtime‑пакеты NuGet для каждого TFM и поддержка .NET 8 и .NET 10.

Что нового в этом выпуске

Ключ Категория Краткое описание
MARKDOWNNET-33 Feature Разделить пакет NuGet на runtime‑пакеты для каждого TFM
MARKDOWNNET-31 Feature Добавлена поддержка .NET 8 и .NET 10
MARKDOWNNET-30 Feature Пользовательский рендерер Markdown на основе DOM
MARKDOWNNET-29 Feature Предупреждения при конвертации и унифицированная модель ошибок
MARKDOWNNET-28 Feature Относительные пути к изображениям и замена изображений
MARKDOWNNET-27 Feature Смещение уровня заголовков и генерация YAML front matter
MARKDOWNNET-26 Feature Контроль над диалектом Markdown и параметры рендеринга таблиц
MARKDOWNNET-25 Feature Инспекция документа без конвертации
MARKDOWNNET-24 Feature Асинхронный API
MARKDOWNNET-23 Feature Статические удобные методы и обнаружение форматов
MARKDOWNNET-20 Enhancement Пересмотр и редизайн API
MARKDOWNNET-8 Feature Поддержка замены изображений при конвертации в Markdown
MARKDOWNNET-35 Bug Fix Проблемы качества и функциональные ошибки

Изменения публичного API

Новые публичные типы

  • DocumentInfo — метаданные документа (формат, количество страниц, заголовок, автор, статус шифрования)
  • MarkdownFlavor — перечисление для целевого диалекта Markdown (GitHub, CommonMark)
  • IImageSavingHandler — интерфейс для пользовательских обратных вызовов сохранения изображений
  • IUriSavingHandler — интерфейс для пользовательских обратных вызовов сохранения URI
  • GroupDocsMarkdownException — общее исключение конвертации
  • InvalidFormatException — повреждённый или нераспознанный формат файла
  • DocumentProtectedException — неверный или отсутствующий пароль

Новые статические методы в MarkdownConverter

  • ToMarkdown(string sourcePath) и перегрузки с LoadOptions/ConvertOptions
  • ToFile(string sourcePath, string outputPath) и перегрузки
  • GetInfo(string sourcePath) и перегрузки
  • GetSupportedFormats()
  • Async варианты: ToMarkdownAsync, ToFileAsync, GetInfoAsync

Новые методы экземпляра в MarkdownConverter

  • GetDocumentInfo()
  • ConvertAsync() и перегрузки

Новые свойства в ConvertOptions

  • ImageExportStrategy (заменяет ExportStrategy)
  • UriExportStrategy
  • HeadingLevelOffset
  • IncludeFrontMatter
  • Flavor
  • MaxColumns, MaxRows, SheetSeparator, IncludeHiddenSheets

Новые свойства в ConvertResult

  • Warnings — некритические предупреждения при конвертации

Новые свойства в ExportImagesToFileSystemStrategy и CustomImagesStrategy

  • ImagesRelativePath — управляет путем, записываемым в ссылках на изображения в Markdown

Новые методы в CustomImageSavingArgs

  • SetReplacementImage(Stream imageStream) — заменяет содержимое изображения

Удалённые типы

  • IExportStrategy — заменён на IImageExportStrategy и IUriExportStrategy
  • DocumentConverterOptions — переименован в ConvertOptions
  • DocumentConverterResult — переименован в ConvertResult

Нарушающие совместимость изменения

Переименованные типы

До После
DocumentConverterOptions ConvertOptions
DocumentConverterResult ConvertResult

Перечисление FileFormat

Значения уровня семейства (FileFormat.WordProcessing, FileFormat.Spreadsheet) заменены конкретными форматами (FileFormat.Docx, FileFormat.Xlsx и т.д.). Добавлены новые элементы: FileFormat.Txt, FileFormat.Chm.

ConvertOptions и LoadOptions разделены

ConvertOptions больше не наследует LoadOptions. Пароль и подсказки формата задаются в 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);

Стратегии изображений и URI разделены

Единственное свойство ExportStrategy заменено двумя типизированными свойствами:

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

Делегаты заменены интерфейсами

CustomImagesStrategy и CustomUriExportStrategy теперь принимают интерфейсы IImageSavingHandler и IUriSavingHandler вместо делегатов.

LoadOptions.Extension и LoadOptions.MimeType являются внутренними

Используйте new LoadOptions(FileFormat.Docx) вместо прямой установки Extension или MimeType.

Новые возможности

Пользовательский рендерер Markdown на основе DOM

Библиотека больше не делегирует генерацию Markdown стороннему экспорту. Пользовательский рендерер проходит по объектной модели документа узел за узлом и генерирует Markdown напрямую, предоставляя полный контроль над каждым аспектом вывода.

Документы Word/PDF/Ebook/Text/CHM рендерятся с поддержкой абзацев, заголовков (H1‑H6), полужирного, курсивного, зачеркивания, встроенного кода, упорядоченных и неупорядоченных списков с вложенностью, таблиц (синтаксис GFM pipe или fallback в виде блока кода CommonMark), гиперссылок и изображений.

Электронные таблицы рендерятся с обходом ячейка за ячейкой, форматированием типизированных значений, разделами листов, усечением столбцов/строк с индикаторами многоточия, фильтрацией скрытых листов и пользовательскими разделителями листов.

Статические удобные методы

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();

Асинхронный 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");

Инспекция документа без конвертации

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

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

Параметры рендеринга электронных таблиц

Full control over how spreadsheets are rendered to Markdown:

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

Смещение уровня заголовков и YAML Front Matter

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

Предупреждения при конвертации и унифицированная модель ошибок

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."

Замена изображений и относительные пути

Replace images during conversion and control path references:

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

Рендеринг оглавления

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

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

Пример кода

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

Как получить обновление

NuGet

Обновите до последней версии пакета GroupDocs.Markdown через NuGet (например, Install-Package GroupDocs.Markdown).

Ресурсы