Как скопировать изображение из одного документа в другой с помощью OpenXML и C #? - PullRequest
1 голос
/ 18 февраля 2012

Мне (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>
 ...
...