首页 > 解决方案 > 替换word doc中的图片

问题描述

我有许多包含图像(徽标)的 word 文档(超过 10k)。我想用另一个图像替换我在 word doc 中的徽标。其中一些word文件甚至可能没有图像,有些可能有多个图像。图片不一定在文档的标题部分。

我在 Stackoverflow 中解决了一些关于此的问题。主要是这个

但是作为新手OpenXML,我目前什至无法替换单个单词文档中的图像。我面临的问题是尝试替换我的 word 文档中的图像,它似乎工作正常,但 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));
                }
            }
        }
    }
   }
}

这不会对我正在尝试的单个文档产生任何影响。另外我想知道如何在上述情况下对具有多个图像的文档进行此操作可能的。任何帮助将不胜感激。谢谢

标签: .netopenxml

解决方案


您没有保存您创建的文档。您的文档当前位于内存流中,然后您必须将内存流写入文件系统,然后您可以从那里打开它。您正在寻找类似以下的内容:

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

如果您考虑一下,您正在阅读文档并将其存储在 RAM 中。然后你操纵它,一旦你处理掉你的内存流,它就会消失。您必须实际将您操作的字节写入某处。


推荐阅读