.net - 替换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));
}
}
}
}
}
}
这不会对我正在尝试的单个文档产生任何影响。另外我想知道如何在上述情况下对具有多个图像的文档进行此操作可能的。任何帮助将不胜感激。谢谢
解决方案
您没有保存您创建的文档。您的文档当前位于内存流中,然后您必须将内存流写入文件系统,然后您可以从那里打开它。您正在寻找类似以下的内容:
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 中。然后你操纵它,一旦你处理掉你的内存流,它就会消失。您必须实际将您操作的字节写入某处。
推荐阅读
- linux - pageup 和 pagedown 在使用 konsole 的 vim 中不起作用
- java - Hibernate:如何将“具有”子类的类映射到单个表?
- android - 是否可以在 Android Emulator 文件系统(在我的计算机内)中搜索文件?
- angular - Angular:如果我们将 .js 或 .ts 放在 import 语句的末尾,则依赖注入不会正确发生
- c# - 由于传递依赖,提供运行时标识符时,Dotnet 还原失败
- r - 提取 1:1000 中从第一个数字开始的所有数字==2
- r - 亚马逊 MWS API 与 R 的集成:SignatureDoesNotMatch
- database-migration - 相当于 POSTGRESQL 中 SQL Server 的 SYSPROCESS
- python - 在 Python 类中重构生成器代码
- apache-spark - 无法提取 zeppelin-server 映像