2013-10-10 64 views
3

我们有一个基于客户端INCLUDETEXT条件页脚:复制OpenXML的图像从一个文档到另一个

IF $CLIENT = "CLIENT1" "{INCLUDETEXT "CLIENT1HEADER.DOCX"}" ""

根据我们的文件,有可能是IF/ELSE一个变化的量,而这些都正常工作用于在正确的位置合并正确的文件。

但是,其中一些文档可能具有客户端特定的图像/品牌,也需要从INCLUDETEXT文件中复制。

以下是调用方法,用于替换从源文档复制到目标文档的IEnumerable<Run>中存在的所有Picture元素。

图像复制正常,但它似乎没有更新我的Picture中的RID或将记录添加到.XML.Rels文件中。 (我甚至尝试添加ForEach添加到所有页眉和页脚,看看本作的任何区别。

private void InsertImagesFromOldDocToNewDoc(WordprocessingDocument source, WordprocessingDocument target, IEnumerable<Picture> pics) 
    { 
     IEnumerable<Picture> imageElements = source.MainDocumentPart.Document.Descendants<Run>().Where(x => x.Descendants<Picture>().FirstOrDefault() != null).Select(x => x.Descendants<Picture>().FirstOrDefault()); 

     foreach (Picture pic in pics) //the new pics 
     { 
      Picture oldPic = imageElements.Where(x => x.Equals(pic)).FirstOrDefault(); 

      if (oldPic != null) 
      { 
       string imageId = ""; 

       ImageData shape = oldPic.Descendants<ImageData>().FirstOrDefault(); 

       ImagePart p = source.MainDocumentPart.GetPartById(shape.RelationshipId) as ImagePart; 

       ImagePart newPart = target.MainDocumentPart.AddPart<ImagePart>(p); 

       newPart.FeedData(p.GetStream()); 

       shape.RelId = target.MainDocumentPart.GetIdOfPart(newPart); 
       string relPart = target.MainDocumentPart.CreateRelationshipToPart(newPart); 
      } 
     } 
    } 

有没有人?

它出现的OpenXML的SDK文档之前碰到过这样的问题一个“小”疏...

+0

你有没有解决这个问题? –

回答

1

斯图尔特,

我曾当面对我试图编号样式从一个文档复制到其他相同的问题。

我认为Word在内部执行的是,无论何时将一个对象从一个文档复制到另一个文档,该对象的ID都不会被复制到新文档中,而是会将新ID分配给该新文档。

您必须在图像被复制后获取ID,然后在使用图像的任何地方将其替换。

我希望这可以帮助,这是我使用复制编号样式。

干杯

+0

谢谢,但这就是我已经在做的 - 使用FeedData(Stream),然后获取零件ID。 –

1

晚反应,但这个线程帮助了我很多,以得到它的工作。在这里我的复制与图像

一个文档解决方案
private static void CopyDocumentWithImages(string path) 
{ 
    if (!Path.GetFileName(path).StartsWith("~$")) 
    { 
     using (var source = WordprocessingDocument.Open(path, false)) 
     { 
      using (var newDoc = source.CreateNew(path.Replace(".docx", "-images.docx"))) 
      { 
       foreach (var e in source.MainDocumentPart.Document.Body.Elements()) 
       { 
        var clonedElement = e.CloneNode(true); 
        clonedElement.Descendants<DocumentFormat.OpenXml.Drawing.Blip>() 
         .ToList().ForEach(blip => 
         { 
          var newRelation = newDoc.CopyImage(blip.Embed, source); 
          blip.Embed = newRelation; 
         }); 
        clonedElement.Descendants<DocumentFormat.OpenXml.Vml.ImageData>().ToList().ForEach(imageData => 
        { 
         var newRelation = newDoc.CopyImage(imageData.RelationshipId, source); 
         imageData.RelationshipId = newRelation; 
        }); 
        newDoc.MainDocumentPart.Document.Append(clonedElement); 
       } 
       newDoc.Save(); 
      } 
     } 
    } 
} 

CopyImage:

public static string CopyImage(this WordprocessingDocument newDoc, string relId, WordprocessingDocument org) 
{ 
    var p = org.MainDocumentPart.GetPartById(relId) as ImagePart; 
    var newPart = newDoc.MainDocumentPart.AddPart(p); 
    newPart.FeedData(p.GetStream()); 
    return newDoc.MainDocumentPart.GetIdOfPart(newPart); 
} 

CreateNew:

public static WordprocessingDocument CreateNew(this WordprocessingDocument org, string name) 
{ 
    var doc = WordprocessingDocument.Create(name, WordprocessingDocumentType.Document); 
    doc.AddMainDocumentPart(); 
    doc.MainDocumentPart.Document = new Document(new Body()); 
    using (var streamReader = new StreamReader(org.MainDocumentPart.ThemePart.GetStream())) 
    using (var streamWriter = new StreamWriter(doc.MainDocumentPart.AddNewPart<ThemePart>().GetStream(FileMode.Create))) 
    { 
     streamWriter.Write(streamReader.ReadToEnd()); 
    } 
    using (var streamReader = new StreamReader(org.MainDocumentPart.StyleDefinitionsPart.GetStream())) 
    using (var streamWriter = new StreamWriter(doc.MainDocumentPart.AddNewPart<StyleDefinitionsPart>().GetStream(FileMode.Create))) 
    { 
     streamWriter.Write(streamReader.ReadToEnd()); 
    } 
    return doc; 
} 
+0

我会挖出原始来源,看看;)谢谢 –

相关问题