Где Word хранит свои картинки?

85
27 октября 2021, 12:10

В общем, есть много Word'ов, которые я обрабатываю через interop и пытаюсь вытянуть картинки, что бы их сохранить отдельно.

До сего момента я просто брал InlineShapes и сохранял их.

Однако, попался хитрый Word, где кол-во InlineShapes=0 и есть просто обычный Shape, который имеет Id=17(Т.е текстовый) и в него вписана картинка.

Я копался в свойствах этого Shape, но не нашел каких-либо свойств в которых могла бы хранится картинка.

Как я могу достать картинку из этого Shape и сохранить ее?

Да, есть вариант конвертировать все в docx, а потом открыть zip'ом и все такое..., но это крайний случай.

P.S Тег VBA так как работа с interop+- похожа на VBA=> VBAшное решение на 99% мне подойдет.

Answer 1

Собственно у вас получается, что inlineShape вставлен в Shape. Если преобразовать Shape в InlineShape, то получим рисунок с рамкой, а это не совсем то, что нужно.

Есть вариант с использованием OpenXML

Надо поставить референс на NugetPackage DocumentFormat.OpenXml

using DocumentFormat.OpenXml.Packaging;

Далее мы проходим по всем внедренным изображениям и сохраняем

string document = @"D:\ttt.docx";
            using (WordprocessingDocument wordprocessingDocument =
                WordprocessingDocument.Open(document, false))
            {
                var imageParts = wordprocessingDocument.MainDocumentPart.ImageParts;
                foreach (var imagePart in imageParts)
                {
                    var uri = imagePart.Uri;
                    var filename = uri.ToString().Split('/').Last();
                    var stream = wordprocessingDocument.Package.GetPart(uri).GetStream();
                    Bitmap b = new Bitmap(stream);
                    b.Save(@"D:\" + filename);
                }
            }

В данном способе мы сохраняем любые внедренные изображения независимо от места внедрения.

READ ALSO
Как связать List с ListView в XAML?

Как связать List с ListView в XAML?

Подскажите как в Xaml, через DataContext или ItemSource(или я не правильно думаю, что бы прибиндить из XAML свою коллекцию _ListProduct(Желательно с тремя столбиками,...

90
Как массиву спрайтов можно присвоить значение?

Как массиву спрайтов можно присвоить значение?

Есть массив спрайтов,у каждого элемента свой цвет и картинкаКак можно через enum(или другим способом) присвоить значение каждому элементу

105
Ошибка при работе с базами данных mssql (asp.net)

Ошибка при работе с базами данных mssql (asp.net)

Я разработал модели и контекст, чтобы можно было связать эти модели с таблицами в бдНо почему-то при любом обращении к полученным данным приложение...

117
С помощью какой технологии сделаны прикрепляемые окошки wpf?

С помощью какой технологии сделаны прикрепляемые окошки wpf?

Мне нужно сделать открепляемые и прикрепляемые окошки на wpf C# как в студииИначе говоря что бы можно было открепить панель от основного окна...

90