Некоторых людей невозможно убедить отправить скриншоты в виде картинок. Вместо этого они вставляют скриншоты в документ Word и отправляют этот документ. Можно щелкнуть правой кнопкой мыши растровое изображение в Word и выбрать «Сохранить как изображение...», но для многих растровых изображений это слишком трудоемко.
Поэтому я ищу инструмент, который может извлекать растровые изображения в исходном разрешении из документа Word. Он должен работать в автономном режиме на Windows 7 x64 и быть бесплатным. Это может быть инструмент командной строки.
Syncfusion предоставляет библиотеки разбора файлов для Word — Essential DocIO , которые также можно использовать для этой цели.
private void ExtractImagesFromWordDocument(string inputFilePath,string outputFolderLocation)
{
//Create Word document instance.
WordDocument document = new WordDocument();
//Open Existing Word document
document.Open(inputFilePath);
int index = 0;
foreach (var item in document.Visit())
{
//If the entity is picture then save at particular location
if (item.EntityType == EntityType.Picture)
{
WPicture pic = (WPicture)item;
pic.Image.Save(outputFolderLocation + "Image" + index + ".png", ImageFormat.Png);
index++;
}
}
document.Close();
}
Весь набор элементов управления и библиотек доступен бесплатно в рамках программы лицензирования сообщества , если вы соответствуете требованиям (доход менее 1 миллиона долларов США). Примечание: я работаю в Syncfusion.
Возможно, я немного нетерпелив, и мне следует ждать ответа дольше, но мне просто нужно было это сделать...
Используя замечательную, но плохо документированную библиотеку DocX для C# , я смог решить эту задачу и создать небольшое консольное приложение, которое извлекает все изображения из документа в папку. Согласно моим коротким тестам, все изображения в формате PNG при вставке из буфера обмена.
Следующий код работает .docx
только для файлов, что меня устраивает.
using System;
using System.IO;
using Novacode;
namespace BmpFromDocx
{
static class Program
{
static void Main(string[] args)
{
if (args.Length < 2)
{
PrintHelp();
return;
}
var doc = DocX.Load(args[0]);
var index = 0;
foreach (var image in doc.Images)
{
var stream = image.GetStream(FileMode.Open, FileAccess.Read);
var buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
File.WriteAllBytes(Path.Combine(args[1], $"image{index}.png"), buffer);
index++;
}
}
private static void PrintHelp()
{
Console.WriteLine("Usage: BmpFromDocx <docx> <output path>");
}
}
}