Extraer mapas de bits de documentos de Word

Algunas personas no pueden ser convencidas de enviar capturas de pantalla como imágenes. En su lugar, pegan las capturas de pantalla en un documento de Word y envían ese documento. Es posible hacer clic derecho en un mapa de bits en Word y elegir "Guardar como imagen...", pero es demasiado trabajo para muchos mapas de bits.

Por lo tanto, estoy buscando una herramienta que pueda extraer mapas de bits en su resolución original de un documento de Word. Debería funcionar sin conexión en Windows 7 x64 y ser gratuito. Puede ser una herramienta de línea de comandos.

Respuestas (2)

Syncfusion proporciona bibliotecas de análisis de archivos para Word - Essential DocIO que también se pueden usar para este propósito.

Ejemplo

Imagen extraída de DocIO esencial

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

Todo el conjunto de controles y bibliotecas está disponible de forma gratuita a través del programa de licencia comunitaria si califica (menos de 1 millón de dólares en ingresos). Nota: Trabajo para Syncfusion.

Tal vez estoy un poco impaciente y debería esperar una respuesta por más tiempo, pero tenía la necesidad de hacer esto...

Usando la gran pero apenas documentada biblioteca DocX para C# , pude resolver esa tarea y crear una pequeña aplicación de consola que extrae todas las imágenes de un documento en una carpeta. Según mis breves pruebas, todas las imágenes están en formato PNG cuando se pegan desde el portapapeles.

El siguiente código funciona .docxsolo para archivos, lo cual está bien para mí.

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