Мне (OpenXML Newbie) нужно расширить программу, которая расширяет собственные шаблоны.Есть таблица с именем человека и описанием.Описание должно быть взято из другого документа.Эта часть прекрасно работает с неформатированным текстом.
Теперь клиент хочет использовать форматированный текст и изображения в части описания.Форматирование работает, но я не мог заставить часть изображения работать.Word 2007 больше не мог открыть документ.
Я предполагаю, что что-то с отношениями пошло не так.Я нашел две части в XML, которые пахнут:
- В оригинальном документе изображение было в пути:
/word/media/image1.bin
теперь в сгенерированном документе изображение находится в /media/image.bin
.Может ли это вызвать проблемы?В /word/_rels/document.xml
путь указывает на правильный ресурс: Target="/media/image.bin"
- Кажется, что слово теряет пространство имен «pic»: В сгенерированном документе у меня есть теги:
<a:pic>, <a:nvPicPr>, ...
вместо <pic:pic>, <pic:ncvPicPr>, ...
Не могли бы вы помочь мне с этим вопросом или указать мне учебное пособие?Поскольку большие части документа уже существуют, я вынужден реализовать это (например, я должен вернуть TableCell).
Редактировать:
Я только что отредактировал сгенерированный document.xml вручную: я заменил <a:...>
на <pic:...>
, и теперь он, кажется, работает.Так что проблема в том, как правильно сгенерировать элементы <pic:...>
.
Вот некоторые фрагменты кода, касающиеся отношения:
...
ImagePart myIP = mainPart.AddImagePart(iP.ContentType);
// mIPRelId is a string which ist later used (blip)
mIPRelId = mainPart.CreateRelationshipToPart(myIP);
// iP is the imagepart from the source doc...
myIP.FeedData(iP.GetStream());
// myDR is the local drawing
// generate Inline should generate the inline part
myDR.Inline = generateInline(myXMLDrawing, nsManager);
...
// later when generating the blip
if (myChild.Name == "a:blip")
{
DocumentFormat.OpenXml.Drawing.Blip myBlip = new Blip();
myBlip.Embed = mIPRelId;
...
myBlipFill.Append(myBlip);
}
Вот фрагмент кода, который генерирует часть изображения (вероятности пространства имен):
...
DocumentFormat.OpenXml.Drawing.Picture myPic =
new DocumentFormat.OpenXml.Drawing.Picture();
string myNodes = ".//descendant::pic:nvPicPr | ";
myNodes += ".//descendant::pic:blipFill | ";
myNodes += ".//descendant::pic:spPr | ";
myNodes += ".//following::w:bookmarkEnd";
XmlNodeList followingNodesList = myXMLPic.
SelectNodes(myNodes, nsManager);
myPic.AddNamespaceDeclaration(
"pic",
"http://schemas.openxmlformats.org/drawingml/2006/picture");
// stepping through the descendants and adding them
// to the picture
foreach (XmlElement el in followingNodesList)
{
if (el.Name == "pic:nvPicPr")
{
DocumentFormat.OpenXml.Drawing.NonVisualPictureProperties myNVPP =
new NonVisualPictureProperties();
...
myPic.Append(myNVPP);
}
...
// Adding the other parts like blipfill....
Вотфрагмент сгенерированного XML (извините за форматирование):
...
<a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
<a:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
<a:nvPicPr>
<a:cNvPr id="0" name="MS_HUND.JPG" />
<a:cNvPicPr />
</a:nvPicPr>
<a:blipFill>
<a:blip r:embed="R65532bbe7935423e" cstate="print" />
<a:stretch>
<a:fillRect />
</a:stretch>
</a:blipFill>
<a:spPr>
<a:xfrm>
<a:off x="0" y="0" />
<a:ext cx="714375" cy="762000" />
</a:xfrm>
<a:prstGeom prst="rect">
<a:avLst />
</a:prstGeom>
</a:spPr>
</a:pic>
</a:graphicData>
</a:graphic>
...