Извлечение растровых изображений из документов Word

Некоторых людей невозможно убедить отправить скриншоты в виде картинок. Вместо этого они вставляют скриншоты в документ Word и отправляют этот документ. Можно щелкнуть правой кнопкой мыши растровое изображение в Word и выбрать «Сохранить как изображение...», но для многих растровых изображений это слишком трудоемко.

Поэтому я ищу инструмент, который может извлекать растровые изображения в исходном разрешении из документа Word. Он должен работать в автономном режиме на Windows 7 x64 и быть бесплатным. Это может быть инструмент командной строки.

Ответы (2)

Syncfusion предоставляет библиотеки разбора файлов для Word — Essential DocIO , которые также можно использовать для этой цели.

Пример

Извлеченный образ 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>");
        }
    }
}