Мы рады объявить о выпуске 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— интерфейс для пользовательских обратных вызовов сохранения URIGroupDocsMarkdownException— общее исключение конвертацииInvalidFormatException— повреждённый или нераспознанный формат файлаDocumentProtectedException— неверный или отсутствующий пароль
Новые статические методы в MarkdownConverter
ToMarkdown(string sourcePath)и перегрузки сLoadOptions/ConvertOptionsToFile(string sourcePath, string outputPath)и перегрузкиGetInfo(string sourcePath)и перегрузкиGetSupportedFormats()- Async варианты:
ToMarkdownAsync,ToFileAsync,GetInfoAsync
Новые методы экземпляра в MarkdownConverter
GetDocumentInfo()ConvertAsync()и перегрузки
Новые свойства в ConvertOptions
ImageExportStrategy(заменяетExportStrategy)UriExportStrategyHeadingLevelOffsetIncludeFrontMatterFlavorMaxColumns,MaxRows,SheetSeparator,IncludeHiddenSheets
Новые свойства в ConvertResult
Warnings— некритические предупреждения при конвертации
Новые свойства в ExportImagesToFileSystemStrategy и CustomImagesStrategy
ImagesRelativePath— управляет путем, записываемым в ссылках на изображения в Markdown
Новые методы в CustomImageSavingArgs
SetReplacementImage(Stream imageStream)— заменяет содержимое изображения
Удалённые типы
IExportStrategy— заменён наIImageExportStrategyиIUriExportStrategyDocumentConverterOptions— переименован вConvertOptionsDocumentConverterResult— переименован в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" // 
};
Рендеринг оглавления
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).