Я создаю документ Word (.docx) и сталкиваюсь с проблемой вставки диаграмм, изображений вместо пользовательских тегов в уже существующий документ. Но изначально я создаю документ из нескольких файлов .RTF, используя подход «Altchunk», вставляя файлы .RTF в элементы управления содержимым в шаблоне документа. Эти файлы .RTF содержат наши пользовательские теги, они выглядят как «‹ElementType="Diagram" Name="Somename"›" и появляются в документе только с новой строкой, как показано ниже. (И мы не знаем заранее, сколько этих тегов будет в документе) .......
‹ElementType="Diagram" Name="Название диаграммы"›
....... Погуглил, но не нашел хорошего подхода к замене тегов изображениями. Потому что сначала мне нужно прочитать тег, чтобы распознать имя изображения, поэтому я знаю, какое изображение будет идти вместо тега, затем удалите тег (просто текст) из документа и на его место поместите изображение, которое я только что получил, зная имя изображения. Так что это довольно сложно, но я надеюсь, что у кого-то есть хорошие идеи, чтобы поделиться. Спасибо
Я хотел бы описать эту проблему немного более конкретно:
1) Что касается метода altchunk, я просто нахожу элементы управления содержимым, которые я помещаю в документ Word, который я использую в качестве шаблона, и когда у меня есть строка rtf, я вставляю altchunk после этого CC.
мой метод выглядит так: как следующее:
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();
}