2013-10-03 3 views
2

Ниже у меня есть код, который вставляет изображение в конец документа словом, используя OpenXML. Что мне нужно сделать, это попытаться найти и элемент под названием [Image Holder] в документе и заменить его изображением, которое я передаю.Замените держатель текста изображением в OpenXML

Вот текущий код, который добавляет его в конец документа

 var element = 
      new Drawing(
       new DW.Inline(
        new DW.Extent() { Cx = 990000L, Cy = 792000L }, 
        new DW.EffectExtent() 
        { 
         LeftEdge = 0L, 
         TopEdge = 0L, 
         RightEdge = 0L, 
         BottomEdge = 0L 
        }, 
        new DW.DocProperties() 
        { 
         Id = (UInt32Value)1U, 
         Name = "NGSignature" 
        }, 
        new DW.NonVisualGraphicFrameDrawingProperties(
         new A.GraphicFrameLocks() { NoChangeAspect = true }), 
        new A.Graphic(
         new A.GraphicData(
          new PIC.Picture(
           new PIC.NonVisualPictureProperties(
            new PIC.NonVisualDrawingProperties() 
            { 
             Id = (UInt32Value)0U, 
             Name = "NGSignature.jpg" 
            }, 
            new PIC.NonVisualPictureDrawingProperties()), 
           new PIC.BlipFill(
            new A.Blip(
             new A.BlipExtensionList(
              new A.BlipExtension() 
              { 
               Uri = 
                "{28A0092B-C50C-407E-A947-70E740481C1C}" 
              }) 
            ) 
            { 
             Embed = relationship_id, 
             CompressionState = 
             A.BlipCompressionValues.Print 
            }, 
            new A.Stretch(
             new A.FillRectangle())), 
           new PIC.ShapeProperties(
            new A.Transform2D(
             new A.Offset() { X = 0L, Y = 0L }, 
             new A.Extents() { Cx = 990000L, Cy = 792000L }), 
            new A.PresetGeometry(
             new A.AdjustValueList() 
            ) { Preset = A.ShapeTypeValues.Rectangle })) 
         ) { Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" }) 
       ) 
       { 
        DistanceFromTop = (UInt32Value)0U, 
        DistanceFromBottom = (UInt32Value)0U, 
        DistanceFromLeft = (UInt32Value)0U, 
        DistanceFromRight = (UInt32Value)0U, 
        EditId = "50D07946" 
       }); 

     word_doc.MainDocumentPart.Document.Body.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Paragraph(new DocumentFormat.OpenXml.Wordprocessing.Run(element))); 

UPDATE Ok я открыл файл в инструменте OpenXML и нашел следующие строки, которые содержат I данных необходимо заменить внутри XML-файла.

<w:r> 
    <w:rPr> 
     <w:sz w:val="20" /> 
    </w:rPr> 
    <w:instrText xml:space="preserve"> REF NG_MACRO "HOLDER" "3fd95b6f-4c63-42fb-ba2e-dc6d57975c57" </w:instrText> 
    </w:r> 

и

<w:r> 
    <w:rPr> 
     <w:sz w:val="20" /> 
    </w:rPr> 
    <w:t xml:space="preserve">{HOLDER}</w:t> 
    </w:r> 

Вторая часть это то, что я вижу, когда я открываю документ. Первая часть, я не уверен, но приложение, которое ее создает, помещает ее.

Чтобы сделать это правильно, я предполагаю, что 1 часть необходимо удалить, а затем раздел изображения, чтобы заменить вторую часть.

+0

Какое изделие является держателем для изображений? Это просто текст или владелец места содержания? – Hans

+0

Я считаю, что это всего лишь текст, но я могу отделить его, чтобы проверить – Tsukasa

+0

У меня конфликт в пространствах имен, не могли бы вы добавить, к чему относятся ваши теги пространства имен? –

ответ

4

Чтобы заменить текст держателя с данным изображением выполните следующие действия:

  1. Поиск для держателя текста место.
  2. Определить родителя текстового места для хранения
  3. Вставьте изображение (Drawing) после размещения текста.
  4. Снимите держатель для текста.

ниже код реализует описанные выше шаги:

// Search for text holder 
Text textPlaceHolder = word_doc.MainDocumentPart.Document.Body.Descendants<Text>() 
    .Where((x) => x.Text == "$image_tag$").First(); 

if (textPlaceHolder == null) 
{ 
    Console.WriteLine("Text holder not found!");  
} 
else 
{ 
    var parent = textPlaceHolder.Parent; 

    if(!(parent is Run)) // Parent should be a run element. 
    { 
    Console.Out.WriteLine("Parent is not run"); 
    } 
    else 
    { 
    // Insert image (the image created with your function) after text place holder.   
    textPlaceHolder.Parent.InsertAfter<Drawing>(element, textPlaceHolder); 
    // Remove text place holder. 
    textPlaceHolder.Remove(); 
    } 
} 

Вы также можете использовать контент заполнителей (SdtElement) вместо простых держателей текста место.

Смежные вопросы