Заменить изображение в слове документ - PullRequest
0 голосов
/ 23 апреля 2019

У меня много текстовых документов (более 10 тыс.), В которых есть изображения (логотип).Я хочу заменить логотип, который у меня есть в слове doc, на другое изображение.Некоторые из этих файлов слов могут даже не содержать изображений, а некоторые могут содержать несколько изображений.Изображения не обязательно находятся в разделе заголовка документа.

Я рассмотрел некоторые вопросы по этому вопросу в Stackoverflow. В основном это

Но, будучи новичком в OpenXML, в настоящее время я даже не могу заменить изображения внутри одного слова doc.Проблема, с которой я сталкиваюсь, заключается в попытке заменить изображение в моем word doc, кажется, что оно работает нормально, но в Word Doc нет никаких изменений.Любая помощь будет принята.

Это код, который я пробовал до сих пор

byte[] docBytes = File.ReadAllBytes(_myFilePath);
using (MemoryStream ms = new MemoryStream())
{
    ms.Write(docBytes, 0, docBytes.Length);

    using (WordprocessingDocument wpdoc = WordprocessingDocument.Open(ms, true))
    {
        MainDocumentPart mainPart = wpdoc.MainDocumentPart;
        Document doc = mainPart.Document;

        IEnumerable<Drawing> drawings = mainPart.Document.Descendants<Drawing>().ToList();
    foreach (Drawing drawing in drawings)
    {
        DocProperties dpr = drawing.Descendants<DocProperties>().FirstOrDefault();
        if (dpr != null && dpr.Name == "Picture 1")
        {
            foreach (DocumentFormat.OpenXml.Drawing.Blip b in drawing.Descendants<DocumentFormat.OpenXml.Drawing.Blip>().ToList())
            {
                OpenXmlPart imagePart = wordDoc.MainDocumentPart.GetPartById(b.Embed);
                using (var writer = new BinaryWriter(imagePart.GetStream()))
                {
                    writer.Write(File.ReadAllBytes(Path to my image with which to replace));
                }
            }
        }
    }
   }
}

Это не приводит к изменениям в одном документе, для которого я его пробую.Кроме того, мне было интересно, как это можно сделать для документов с несколькими изображениями в приведенном выше случае, я открыл файл XML и увидел, что имя файла в свойствах документа было "Изображение 1", но для документов Word с несколькими изображениями это не будетвозможный.Любая помощь будет оценена.Спасибо

1 Ответ

1 голос
/ 23 апреля 2019

Вы не сохраняете документ, который создали. Ваш документ в данный момент находится в потоке памяти, затем вы должны записать поток памяти в вашу файловую систему и оттуда вы можете открыть его. Вы ищете что-то вроде следующего:

    byte[] docBytes = File.ReadAllBytes(_myFilePath);
    using (MemoryStream ms = new MemoryStream())
    {
        ms.Write(docBytes, 0, docBytes.Length);
        using (WordprocessingDocument wpdoc = WordprocessingDocument.Open(ms, true))
        {
            MainDocumentPart mainPart = wpdoc.MainDocumentPart;
            Document doc = mainPart.Document;
            IEnumerable<Drawing> drawings = mainPart.Document.Descendants<Drawing>().ToList();
            foreach (Drawing drawing in drawings)
            {
                DocProperties dpr = drawing.Descendants<DocProperties>().FirstOrDefault();
                if (dpr != null && dpr.Name == "Picture 1")
                {
                    foreach (DocumentFormat.OpenXml.Drawing.Blip b in drawing.Descendants<DocumentFormat.OpenXml.Drawing.Blip>().ToList())
                    {
                        OpenXmlPart imagePart = wordDoc.MainDocumentPart.GetPartById(b.Embed);
                        using (var writer = new BinaryWriter(imagePart.GetStream()))
                        {
                            writer.Write(File.ReadAllBytes(Path to my image with which to replace));
                        }
                    }
                }
            }
        }

        using (FileStream fs = new FileStream(fileName, FileMode.CreateNew, FileAccess.Write))
        {
            ms.CopyTo(fs);
        }
    }

Если вы думаете об этом, вы читаете документ и сохраняете его в оперативной памяти. Затем вы манипулируете им, и как только вы избавляетесь от потока памяти, он исчезает. На самом деле вы должны записать байты, которыми вы где-то манипулировали.

...