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 шт):
Чтобы создать 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>