เรามีความยินดีที่จะประกาศการเปิดตัว GroupDocs.Markdown for .NET 26.3 ซึ่งพร้อมให้ใช้งานตั้งแต่ เดือนมีนาคม 2026 การอัปเดตครั้งสำคัญนี้นำเสนอ API สาธารณะที่ออกแบบใหม่ ตัวเรนเดอร์ Markdown แบบ DOM‑based ที่กำหนดเอง การควบคุมรูปแบบ Markdown อย่างเต็มรูปแบบ การสนับสนุน async และการแก้ไขบั๊กหลายรายการ นอกจากนี้ยังเพิ่มแพ็กเกจ NuGet แบบ runtime แยกตาม TFM และรองรับ .NET 8 และ .NET 10

มีอะไรใหม่ในรุ่นนี้

Key Category Summary
MARKDOWNNET-33 Feature แยกแพ็กเกจ NuGet เป็นแพ็กเกจ runtime แยกตาม TFM
MARKDOWNNET-31 Feature เพิ่มการรองรับ .NET 8 และ .NET 10
MARKDOWNNET-30 Feature ตัวเรนเดอร์ Markdown แบบ DOM‑based ที่กำหนดเอง
MARKDOWNNET-29 Feature คำเตือนการแปลงและโมเดลข้อผิดพลาดแบบรวม
MARKDOWNNET-28 Feature เส้นทางรูปภาพแบบ relative และการแทนที่รูปภาพ
MARKDOWNNET-27 Feature การปรับระดับหัวข้อและการสร้าง YAML front matter
MARKDOWNNET-26 Feature การควบคุมรูปแบบ Markdown และตัวเลือกการเรนเดอร์สเปรดชีต
MARKDOWNNET-25 Feature ตรวจสอบเอกสารโดยไม่ต้องแปลง
MARKDOWNNET-24 Feature API แบบ async
MARKDOWNNET-23 Feature เมธอดสะดวกสบายแบบ static และการค้นหารูปแบบ
MARKDOWNNET-20 Enhancement ทบทวนและออกแบบ API ใหม่
MARKDOWNNET-8 Feature รองรับการแทนที่รูปภาพระหว่างการแปลงเป็น Markdown
MARKDOWNNET-35 Bug Fix ปัญหาด้านคุณภาพและการทำงาน

การเปลี่ยนแปลง API สาธารณะ

ประเภทสาธารณะใหม่

  • DocumentInfo — ข้อมูลเมตาของเอกสาร (รูปแบบ, จำนวนหน้า, ชื่อเรื่อง, ผู้เขียน, สถานะการเข้ารหัส)
  • MarkdownFlavor — enum สำหรับกำหนดรูปแบบ Markdown ที่ต้องการ (GitHub, CommonMark)
  • IImageSavingHandler — อินเทอร์เฟซสำหรับคอลแบ็กการบันทึกรูปภาพแบบกำหนดเอง
  • IUriSavingHandler — อินเทอร์เฟซสำหรับคอลแบ็กการบันทึก URI แบบกำหนดเอง
  • GroupDocsMarkdownException — ข้อยกเว้นทั่วไปในการแปลง
  • InvalidFormatException — รูปแบบไฟล์เสียหายหรือไม่รู้จัก
  • DocumentProtectedException — รหัสผ่านไม่ถูกต้องหรือขาดหาย

เมธอด static ใหม่บน MarkdownConverter

  • ToMarkdown(string sourcePath) และ overloads พร้อม LoadOptions/ConvertOptions
  • ToFile(string sourcePath, string outputPath) และ overloads
  • GetInfo(string sourcePath) และ overloads
  • GetSupportedFormats()
  • เวอร์ชัน async: ToMarkdownAsync, ToFileAsync, GetInfoAsync

เมธอดอินสแตนซ์ใหม่บน MarkdownConverter

  • GetDocumentInfo()
  • ConvertAsync() และ overloads

คุณสมบัติใหม่บน 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

การเปลี่ยนแปลงที่ทำให้เกิดการแตกหัก

ประเภทที่เปลี่ยนชื่อ

Before After
DocumentConverterOptions ConvertOptions
DocumentConverterResult ConvertResult

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

แทนที่ delegate ด้วยอินเทอร์เฟซ

CustomImagesStrategy และ CustomUriExportStrategy ตอนนี้รับอินเทอร์เฟซ IImageSavingHandler และ IUriSavingHandler แทนการใช้ callback delegate

LoadOptions.Extension และ LoadOptions.MimeType เป็น internal

ใช้ new LoadOptions(FileFormat.Docx) แทนการตั้งค่า Extension หรือ MimeType โดยตรง

ฟีเจอร์ใหม่

ตัวเรนเดอร์ Markdown แบบ DOM‑Based ที่กำหนดเอง

ไลบรารีไม่ต้องพึ่งพาการส่งออก Markdown ของบุคคลที่สามอีกต่อไป ตัวเรนเดอร์แบบกำหนดเองจะเดินผ่านโหนดของโมเดลวัตถุเอกสารทีละโหนดและสร้าง Markdown โดยตรง ทำให้คุณควบคุมทุกแง่มุมของผลลัพธ์ได้อย่างเต็มที่

เอกสาร Word/PDF/Ebook/Text/CHM จะถูกเรนเดอร์พร้อมรองรับย่อหน้า, หัวข้อ (H1‑H6), ตัวหนา, ตัวเอียง, ขีดทับ, โค้ดในบรรทัด, รายการลำดับและไม่มีลำดับพร้อมการซ้อนกัน, ตาราง (ไวยากรณ์ pipe ของ GFM หรือ fallback เป็นบล็อกโค้ดของ CommonMark), ลิงก์, และรูปภาพ

สเปรดชีต จะถูกเรนเดอร์ด้วยการเดินผ่านกริดเซลล์‑ต่อ‑เซลล์, การจัดรูปแบบค่าตามประเภท, ส่วนของเวิร์กชีต, การตัดคอลัมน์/แถวพร้อมตัวบ่งชี้จุดไข่ปลา, การกรองชีตที่ซ่อน, และตัวแบ่งชีตแบบกำหนดเอง

เมธอดสะดวกสบายแบบ static

เมธอดแปลงแบบบรรทัดเดียวที่จัดการการจัดการทรัพยากรโดยอัตโนมัติ:

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

API แบบ async

เมธอด async สำหรับเมธอด static และอินสแตนซ์ทั้งหมด พร้อมรองรับ 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, ขีดทับ
var options = new ConvertOptions { Flavor = MarkdownFlavor.CommonMark }; // ตารางเป็นบล็อกโค้ด

ตัวเลือกการเรนเดอร์สเปรดชีต

ควบคุมการเรนเดอร์สเปรดชีตเป็น 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     // เพิ่มเมตา YAML ด้านหน้า
};

คำเตือนการแปลงและโมเดลข้อผิดพลาดแบบรวม

เมธอด Convert() ทั้งหมดจะโยนข้อยกเว้นเมื่อเกิดความล้มเหลว ConvertResult จะบรรจุคำเตือนที่ไม่ทำให้การทำงานล้มเหลว:

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

การแทนที่รูปภาพและเส้นทางแบบ relative

แทนที่รูปภาพระหว่างการแปลงและควบคุมการอ้างอิงเส้นทาง:

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

การเรนเดอร์สารบัญ (Table of Contents)

เอกสารที่มีสารบัญจะถูกเรนเดอร์เป็นรายการที่เรียบง่ายแทนการแสดงโค้ดฟิลด์ดิบ:

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

แหล่งข้อมูล