Ми раді оголосити про випуск GroupDocs.Markdown for .NET 26.3, доступний з березня 2026. Це велике оновлення вводить оновлений публічний API, власний рендерер Markdown на основі DOM, повний контроль над діалектом Markdown, підтримку async та низку виправлень помилок. Також додаються NuGet‑пакети runtime для кожного TFM та підтримка .NET 8 і .NET 10.
Що нового у цьому випуску
| Ключ | Категорія | Опис |
|---|---|---|
| MARKDOWNNET-33 | Функція | Розділення NuGet‑пакету на runtime‑пакети для кожного TFM |
| MARKDOWNNET-31 | Функція | Додана підтримка .NET 8 та .NET 10 |
| MARKDOWNNET-30 | Функція | Власний рендерер Markdown на основі DOM |
| MARKDOWNNET-29 | Функція | Попередження під час конвертації та уніфікована модель помилок |
| MARKDOWNNET-28 | Функція | Відносні шляхи до зображень та заміна зображень |
| MARKDOWNNET-27 | Функція | Зсув рівня заголовків та генерація YAML front matter |
| MARKDOWNNET-26 | Функція | Контроль діалекту Markdown та параметри рендерингу електронних таблиць |
| MARKDOWNNET-25 | Функція | Перевірка документа без конвертації |
| MARKDOWNNET-24 | Функція | Асинхронний API |
| MARKDOWNNET-23 | Функція | Статичні зручні методи та виявлення форматів |
| MARKDOWNNET-20 | Удосконалення | Перегляд та редизайн API |
| MARKDOWNNET-8 | Функція | Підтримка заміни зображень під час конвертації у Markdown |
| MARKDOWNNET-35 | Виправлення помилки | Проблеми якості та функціональності |
Зміни у публічному API
Нові публічні типи
DocumentInfo— метадані документа (формат, кількість сторінок, назва, автор, статус шифрування)MarkdownFlavor— перелік (enum) цільового діалекту Markdown (GitHub, CommonMark)IImageSavingHandler— інтерфейс для користувацьких зворотних викликів збереження зображеньIUriSavingHandler— інтерфейс для користувацьких зворотних викликів збереження URIGroupDocsMarkdownException— загальне виключення конвертаціїInvalidFormatException— пошкоджений або невизначений формат файлуDocumentProtectedException— неправильний або відсутній пароль
Нові статичні методи в MarkdownConverter
ToMarkdown(string sourcePath)and overloads withLoadOptions/ConvertOptionsToFile(string sourcePath, string outputPath)and overloadsGetInfo(string sourcePath)and overloadsGetSupportedFormats()- Async variants:
ToMarkdownAsync,ToFileAsync,GetInfoAsync
Нові методи екземпляра в MarkdownConverter
GetDocumentInfo()ConvertAsync()and overloads
Нові властивості в ConvertOptions
ImageExportStrategy(replacesExportStrategy)UriExportStrategyHeadingLevelOffsetIncludeFrontMatterFlavorMaxColumns,MaxRows,SheetSeparator,IncludeHiddenSheets
Нові властивості в ConvertResult
Warnings— нефатальні попередження під час конвертації
Нові властивості в ExportImagesToFileSystemStrategy та CustomImagesStrategy
ImagesRelativePath— контролює шлях, записаний у посиланнях на зображення в Markdown
Нові методи в CustomImageSavingArgs
SetReplacementImage(Stream imageStream)— замінює вміст зображення
Видалені типи
IExportStrategy— replaced byIImageExportStrategyandIUriExportStrategyDocumentConverterOptions— renamed toConvertOptionsDocumentConverterResult— renamed toConvertResult
Змінювальні (breaking) зміни
Перейменовані типи
| До | Після |
|---|---|
DocumentConverterOptions |
ConvertOptions |
DocumentConverterResult |
ConvertResult |
FileFormat Enum
Значення рівня сімейства (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 розділені
Single ExportStrategy property replaced with two typed properties:
var options = new ConvertOptions
{
ImageExportStrategy = new ExportImagesToFileSystemStrategy("images"),
UriExportStrategy = new CustomUriExportStrategy(handler)
};
Делегати замінені інтерфейсами
CustomImagesStrategy and CustomUriExportStrategy now accept IImageSavingHandler and IUriSavingHandler interfaces instead of delegate callbacks.
LoadOptions.Extension та LoadOptions.MimeType є внутрішніми
Use new LoadOptions(FileFormat.Docx) instead of setting Extension or MimeType directly.
Нові можливості
Власний рендерер Markdown на основі DOM
Бібліотека більше не делегує генерацію Markdown сторонньому експорту. Власний рендерер проходить по об’єктній моделі документа вузол за вузлом і безпосередньо створює Markdown, забезпечуючи повний контроль над кожним аспектом вихідного результату.
Word/PDF/Ebook/Text/CHM документи рендеряться з підтримкою абзаців, заголовків (H1‑H6), жирного, курсивного, закресленого тексту, inline‑коду, впорядкованих і маркованих списків з вкладенням, таблиць (синтаксис pipe GFM або fallback у вигляді блоків коду CommonMark), гіперпосилань та зображень.
Spreadsheets рендеряться шляхом покрокового обходу клітинок, форматування типізованих значень, розділів листів, обрізки колонок/рядків з індикаторами еліпсису, фільтрації прихованих листів та користувацьких розділювачів листів.
Статичні зручні методи
Методи конвертації в один рядок, які автоматично керують ресурсами:
string md = MarkdownConverter.ToMarkdown("report.docx");
MarkdownConverter.ToFile("report.docx", "report.md");
IReadOnlyList<FileFormat> formats = MarkdownConverter.GetSupportedFormats();
Асинхронний API
Асинхронні аналоги всіх статичних і методів екземпляра з підтримкою CancellationToken:
string md = await MarkdownConverter.ToMarkdownAsync("report.docx");
await MarkdownConverter.ToFileAsync("large.pdf", "output.md");
DocumentInfo info = await MarkdownConverter.GetInfoAsync("report.docx");
Перевірка документа без конвертації
Отримання метаданих документа без повної конвертації:
DocumentInfo info = MarkdownConverter.GetInfo("report.docx");
Console.WriteLine($"{info.FileFormat}, {info.PageCount} pages, by {info.Author}");
Контроль діалекту Markdown
Вибір конкретного діалекту Markdown:
var options = new ConvertOptions { Flavor = MarkdownFlavor.GitHub }; // pipe tables, strikethrough
var options = new ConvertOptions { Flavor = MarkdownFlavor.CommonMark }; // tables as code blocks
Параметри рендерингу електронних таблиць
Повний контроль над тим, як електронні таблиці конвертуються у 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
};
Попередження під час конвертації та уніфікована модель помилок
Всі методи Convert() тепер викидають виключення у випадку помилки. ConvertResult містить нефатальні попередження:
ConvertResult result = converter.Convert();
foreach (string w in result.Warnings)
Console.WriteLine(w); // e.g. "Worksheet 'Data' truncated at 50 rows."
Заміна зображень та відносні шляхи
Заміна зображень під час конвертації та контроль шляхових посилань:
var strategy = new ExportImagesToFileSystemStrategy("c:/output/images")
{
ImagesRelativePath = "images" // 
};
Рендеринг змісту
Документи зі змістом рендеряться як чисті списки замість сирих полів коду:
- 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).