Image OpenXMLSDK。如何用图像搜索、阅读和替换段落中的文本

Image OpenXMLSDK。如何用图像搜索、阅读和替换段落中的文本,image,search,sdk,replace,openxml,Image,Search,Sdk,Replace,Openxml,我正在生成Word(.docx)文档,遇到了一个问题,即如何在文档中插入图表、图像,而不是已经存在的自定义标记。但最初我使用“Altchunk”方法从几个.RTF文件创建文档,将.RTFs插入模板文档的内容控件中。这些.RTF文件包含我们的自定义标记,它们看起来像“”,并以如下所示的新行显示在文档中。(而且我们事先不知道文档中将包含多少这些标记) 。。。。。。。 谷歌搜索了它,但找不到用图像替换标签的好方法。 因为首先我需要读取标记以识别图像的名称,所以我知道图像将取代标记,然后从文档中删除

我正在生成Word(.docx)文档,遇到了一个问题,即如何在文档中插入图表、图像,而不是已经存在的自定义标记。但最初我使用“Altchunk”方法从几个.RTF文件创建文档,将.RTFs插入模板文档的内容控件中。这些.RTF文件包含我们的自定义标记,它们看起来像“”,并以如下所示的新行显示在文档中。(而且我们事先不知道文档中将包含多少这些标记)

。。。。。。。 谷歌搜索了它,但找不到用图像替换标签的好方法。 因为首先我需要读取标记以识别图像的名称,所以我知道图像将取代标记,然后从文档中删除标记(仅文本),并在其位置放置我刚刚获取的图像,知道图像的名称。所以这是相当复杂的,但我希望有人有好的想法分享。谢谢

我想更具体地描述一下这个问题:

1) 关于altchunk方法,我只找到我放在word文档中用作模板的内容控件,当我有rtf字符串时,我会在CC之后插入altchunk。
我的方法如下所示:

    private void ReplaceContentControlWithRTF(MainDocumentPart mainPart, string tagName,     string rtfString) 
{
                SdtBlock sb = mainPart.Document.Body.Descendants<SdtBlock>().Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == tagName).Single();
                string altChunkId = "altChunkId" + altChunkIdNumber++;
                AlternativeFormatImportPart chunk = mainPart.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.Rtf, altChunkId);
                MemoryStream s = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(rtfString));
                chunk.FeedData(s);
                AltChunk altChunk = new AltChunk();
                altChunk.Id = altChunkId;
                DocumentFormat.OpenXml.OpenXmlElement parent = sb.Parent;
                parent.InsertAfter(altChunk, sb);
                sb.Remove();
                mainPart.Document.Save();

}
private void ReplaceContentControlWithRTF(MainDocumentPart mainPart,字符串标记名,字符串rtfString)
{
SdtBlock sb=mainPart.Document.Body.subjections().Where(r=>r.SdtProperties.GetFirstChild().Val==tagName.Single();
字符串altChunkId=“altChunkId”+altChunkIdNumber++;
AlternativeFormatImportPart chunk=mainPart.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.Rtf,altChunkId);
MemoryStream s=新的MemoryStream(System.Text.Encoding.UTF8.GetBytes(rtfString));
块。FeedData(多个);
AltChunk AltChunk=新的AltChunk();
altChunk.Id=altChunkId;
DocumentFormat.OpenXml.openxmlement parent=sb.parent;
父母插入者(altChunk,sb);
除去某人;
mainPart.Document.Save();
}

我的答案很长,因此我将用一些标题分隔内容,以便更容易阅读:)。除非你已经找到了更好的方法,否则你应该考虑每一个。

连接文档

我假设,当您使用altchunk方法时,您拥有第一个文档(原始文档)的xml,并且所有附加文档都被编码。 更好的方法是连接文档的内容,因为这样可以轻松访问整个文档的xml树。如果不在连接的文档中使用图像、超链接等,这是非常容易的,因为它们需要以特殊的方式进行处理,并且会使处理变得更加复杂

或者,您可以尝试在连接图像之前将图像插入到每个文档中


将内容控件用作文档中的占位符

现在,假设您已经可以访问文档,您应该将内容控件放置在Word文档中,放置在希望图像显示的位置,并将每个图像的标记设置为一个值,然后在代码中搜索,以找到插入图片的正确位置。您可以在此处找到有关内容控件的一些基本信息:

插入XML标记和图像字节

为了将图像插入到文档中,您不仅需要在希望图像显示的位置插入一些XML标记,还需要将包含图像的字节添加为
ImagePart
。我在这里找到了一个教程,解释了如何做到这一点(尽管我自己没有遵循它):

考虑使用OpenXML SDK 2.0生产力工具

为了简化OpenXMLSDK的使用,我建议您使用Microsoft的SDK生产力工具。它可以作为OpenXMLSDK的一部分加载,允许您打开任何MS Office OpenXML文档,以XML方式显示其内容,甚至可以显示重新创建文档所需的C#代码。您可以从此处下载:


如果您有任何其他问题,请随时提问:)。

“在文档中使用内容控件作为占位符”,是的,知道我的图像将出现在哪里会很好,但此文档应该使用不同的输入数据(rtf文件)生成多次,因此我不知道图像的数量和位置。但是当我插入了所有的rtf文件后,我就有了.docx文件,该文件带有自定义标记,看起来就像新段落中的文本。所以我必须找到它们,读取,然后替换为匹配的图像(我已经读取了它的名称)。所以我不确定你们的问题是什么。你必须按照问题中的描述去做;)。阅读上的教程。它解释了如何将图像插入到文档中。基本上,当您找到自定义标记时,将其删除,获取父pagargaph节点并在其中插入图像标记,以及将图像部分插入文档。我想这个链接包含了非常详细的说明,解释了如何插入图像。这几乎完成了,但是你能给出关于如何获得页面可用空间宽度的最后线索吗?我想它会以一些单位,而不是像素为单位。如果你能提供更多的信息,那会很有帮助。如果要确定的是一个常量大小,我建议您使用OpenXMLSDK生产力工具。如果你想在这个空间里放一个图像,用Word,保存文档,然后在工具中打开它,检查使用的大小:)。现在页面宽度可以了。但是当我使用上面的altchunk方法在模板文档中插入所有的.rtf文件时。我需要浏览所有的段落。这里有一些奇怪的事情。我使用下面的行-“foreach”(mainPart.Document.Body.subjects()中的p段)“但它实际上只起作用,如果我之前更新了目录,如果没有,我就不会得到所有的段落,请参见