ما خوشحالیم که انتشار GroupDocs.Markdown for .NET 26.3 را اعلام می‌کنیم که از مارس 2026 در دسترس است. این به‌روزرسانی بزرگ شامل یک API عمومی بازطراحی‌شده، یک رندرکننده سفارشی Markdown مبتنی بر DOM، کنترل کامل طعم Markdown، پشتیبانی از async و مجموعه‌ای از رفع باگ‌ها می‌باشد. همچنین بسته‌های NuGet زمان اجرا به‌صورت per‑TFM و پشتیبانی از .NET 8 و .NET 10 اضافه شده‌اند.

موارد جدید در این انتشار

کلید دسته‌بندی خلاصه
MARKDOWNNET-33 قابلیت تقسیم بسته NuGet به بسته‌های زمان اجرا per‑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 — اینترفیس برای فراخوانی‌های سفارشی ذخیره‌سازی URI
  • GroupDocsMarkdownException — استثنای عمومی تبدیل
  • InvalidFormatException — فرمت فایل خراب یا ناشناخته
  • DocumentProtectedException — رمز عبور نادرست یا غیاب آن

متدهای ایستاتیک جدید در MarkdownConverter

  • ToMarkdown(string sourcePath) و overloadهای آن با LoadOptions/ConvertOptions
  • ToFile(string sourcePath, string outputPath) و overloadهای آن
  • GetInfo(string sourcePath) و overloadهای آن
  • GetSupportedFormats()
  • نسخه‌های ناهمزمان: ToMarkdownAsync، ToFileAsync، GetInfoAsync

متدهای نمونه جدید در MarkdownConverter

  • GetDocumentInfo()
  • ConvertAsync() و overloadهای آن

ویژگی‌های جدید در 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

Enum FileFormat

مقادیر سطح خانواده (FileFormat.WordProcessing، FileFormat.Spreadsheet) با فرمت‌های خاص (FileFormat.Docx، FileFormat.Xlsx و غیره) جایگزین شده‌اند. ورودی‌های جدید: FileFormat.Txt، FileFormat.Chm.

ConvertOptions and LoadOptions separated

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

Image and URI strategies split

ویژگی تک ExportStrategy با دو ویژگی تایپ‌شده جایگزین شد:

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

Delegates replaced with interfaces

CustomImagesStrategy و CustomUriExportStrategy اکنون به جای فراخوانی‌های delegate، اینترفیس‌های IImageSavingHandler و IUriSavingHandler را می‌پذیرند.

LoadOptions.Extension and LoadOptions.MimeType are internal

به‌جای تنظیم مستقیم Extension یا MimeType از new LoadOptions(FileFormat.Docx) استفاده کنید.

ویژگی‌های جدید

رندرکننده سفارشی Markdown مبتنی بر DOM

کتابخانه دیگر تولید Markdown را به یک خروجی شخص ثالث واگذار نمی‌کند. یک رندرکننده سفارشی مدل شیء سند (DOM) را گره به گره پیمایش می‌کند و مستقیماً Markdown تولید مینماید، که کنترل کامل بر تمام جنبه‌های خروجی را فراهم می‌کند.

سندهای Word/PDF/Ebook/Text/CHM با پشتیبانی از پاراگراف‌ها، عناوین (H1‑H6)، بولد، ایتالیک، خط‌خورده، کد درون‌خطی، فهرست‌های ترتیبی و غیرترتیبی با تو در تویی، جدول‌ها (سینتکس لوله‌ای GFM یا بازگشت به بلوک کد CommonMark)، پیوندها و تصاویر رندر می‌شوند.

صفحه‌گسترده‌ها با پیمایش سلول به سلول شبکه، قالب‌بندی مقادیر تایپ‌شده، بخش‌های برگه کاری، کوتاه‌سازی ستون/سطر با نشانگرهای سه‌نقطه، فیلتر کردن برگه‌های مخفی و جداکننده‌های سفارشی برگه رندر می‌شوند.

متدهای ایستاتیک راحتی

متدهای تبدیل یک‌خطی که به‌صورت خودکار مدیریت منابع را انجام می‌دهند:

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"  // ![](images/img-001.png)
};

رندر فهرست مطالب

اسناد دارای فهرست مطالب به‌صورت لیست‌های تمیز به‌جای کدهای فیلد خام رندر می‌شوند:

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

منابع