C# Interop.Word. Загрузка и центрирование картинок в нормальном качестве

Уже неделю как бьюсь с задачей, где нужно загрузить последовательно друг за другом картинки, центрировать, и сохранить Word в формате веб страницы без фильтра. Проблема заключается в качестве. Искал в интернете ответ на этот вопрос, но ничего не подходит. Я вроде бы всё cделал правильно, но не могу понять, где какой параметр задать чтоб качество оставалось на том же уровне, в каком я его беру. На данный момент как я понял, он его растягивает и получается печальное качество. Как это исправить? Вот код для примера:

        private void CreateAndSaveWord()
        {
            Application wordApp = new Application();
            Document doc = wordApp.Documents.Add();
            
            Range docRange = doc.Range();

            object missing = System.Reflection.Missing.Value;

            string[] pathImages = Directory.GetFiles(DIR_PATH, "*.png", SearchOption.TopDirectoryOnly);

            for (int i = 0; i < pathImages.Length; i++)
            {
                Image img = Image.FromFile(pathImages[i]);

                InlineShape autoScaledInlineShape = doc.InlineShapes.AddPicture(pathImages[i]);

                autoScaledInlineShape.Delete();

                var newShape = doc.Shapes.AddShape(1, 0, 0, img.Width, img.Height);
                newShape.Fill.UserPicture(pathImages[i]);

                var finalInlineShape = newShape.ConvertToInlineShape();

                object oCollapseEnd = WdCollapseDirection.wdCollapseEnd;

                docRange = doc.Range();

                finalInlineShape.Range.Cut();
                docRange.Collapse(ref oCollapseEnd);
                docRange.Paste();
            }

            doc.Paragraphs.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;

            string path = Path.Combine(DIR_PATH, "example.htm");
            doc.SaveAs2(path, WdSaveFormat.wdFormatFilteredHTML);
            wordApp.Visible = true;
        }

Ответы (1 шт):

Автор решения: aepot

Чтобы создать HTML ворд не нужен, к тому же он делает этот HTML достаточно криво и с кучей мусора. Да еще и очень медленно это происходит.

Поставьте NuGet пакет HtmlAgilityPack

Должно сработать как-то так.

static void Main(string[] args)
{
    string path = "."; // путь к картинкам
    string[] pathImages = Directory.GetFiles(path, "*.png", SearchOption.TopDirectoryOnly);
    string outputDir = @"C:\output";
    string outputFile = "index.html";
    string outputImagesDir = "images";

    Directory.CreateDirectory(outputDir);
    Directory.CreateDirectory(Path.Combine(outputDir, outputImagesDir));

    HtmlDocument doc = new HtmlDocument();
    HtmlNode html = doc.DocumentNode.AppendChild(doc.CreateElement("html"));
    HtmlNode head = html.AppendChild(doc.CreateElement("head"));
    HtmlNode meta = head.AppendChild(doc.CreateElement("meta"));
    meta.Attributes.Add("charset", "utf-8");
    HtmlNode body = html.AppendChild(doc.CreateElement("body"));

    foreach (string imgPath in pathImages)
    {
        string imgName = Path.GetFileName(imgPath);
        File.Copy(imgPath, Path.Combine(outputDir, outputImagesDir, imgName), true); // копирование с перезаписью если файл существует
        HtmlNode img = doc.CreateElement("img");
        img.Attributes.Add("style", "display: block; margin: 5px auto;"); // выравнивание по центру
        img.Attributes.Add("src", $"{outputImagesDir}/{imgName}");
        body.AppendChild(img);
    }

    //Console.WriteLine(doc.DocumentNode.InnerHtml);
    doc.Save(Path.Combine(outputDir, outputFile));
}

Сгенерированный HTML выглядит так, и вроде даже работает

<html>
<head><meta charset="utf-8"></head>
<body>
<img style="display: block; margin: 0 auto;" src="images/5.png">
</body>
</html>
→ Ссылка