2017-10-03 7 views
0

Je voudrais cloner une diapositive d'un document PowerPoint et insérer dans le même document OpenXML. Pour cela, j'utilise la fonction suivante:impossible de cloner une nouvelle diapositive PowerPoint avec des images

public static void AddNewSlide(PresentationPart parent, Slide _slideTemplate, string newId) 
{ 
    var newSlidePart = parent.AddNewPart<SlidePart>(newId); 
    newSlidePart.FeedData(_slideTemplate.SlidePart.GetStream(FileMode.Open)); 
    newSlidePart.AddPart(_slideTemplate.SlidePart.SlideLayoutPart, _slideTemplate.SlidePart.GetIdOfPart(_slideTemplate.SlidePart.SlideLayoutPart)); 
    newSlidePart.Slide.Save(); 

    DocumentFormat.OpenXml.Presentation.SlideIdList slideIdList = parent.Presentation.SlideIdList; 
    uint maxSlideId = 1; 

    foreach (DocumentFormat.OpenXml.Presentation.SlideId slideId in slideIdList.ChildElements) 
    { 
     if (slideId.Id > maxSlideId) maxSlideId = slideId.Id; 
    } 

    DocumentFormat.OpenXml.Presentation.SlideId newSlideId = new DocumentFormat.OpenXml.Presentation.SlideId { Id = ++maxSlideId, RelationshipId = parent.GetIdOfPart(newSlidePart) }; 
    slideIdList.Append(newSlideId); 
} 

Si la diapositive orig contient uniquement du texte, il fonctionne très bien, mais quand la lame orig Contans images aussi, le résultat doc PowerPoint bw corrompu. Les images sur la nouvelle diapositive ne seront pas affichées, juste avec un message: "Cette image ne peut pas être affichée actuellement."

Veuillez aider à cloner une diapositive avec des images. Merci d'avance.

Répondre

1

Ce code est la génération de diapositive corrompu, car il est la copie que les données et la mise en page, mais pas les images qui sont dans la diapositive.

newSlidePart.FeedData(_slideTemplate.SlidePart.GetStream(FileMode.Open)); 
newSlidePart.AddPart(_slideTemplate.SlidePart.SlideLayoutPart, _slideTemplate.SlidePart.GetIdOfPart(_slideTemplate.SlidePart.SlideLayoutPart)); 

pour par exemple: les 2 lignes ci-dessus vous diront que la nouvelle diapositive fait référence à une image, mais cette image elle-même est manquante dans la nouvelle diapositive. Par conséquent, pour résoudre ce problème, vous devez également écrire le code qui copiera l'image de l'ancienne diapositive vers la nouvelle.

//add all the image part from the source slide to the new one 

      List<ImagePart> imageParts = new List<ImagePart>(); 
      sourceSlidePart.GetPartsOfType<ImagePart>(imageParts); 

      foreach (ImagePart img in imageParts) 
      { 
       var relID = sourceSlidePart.GetIdOfPart(img); // get relationship ID 

       ImagePart newImagePart = newSlidePart.AddImagePart(img.ContentType, relID); 

       newImagePart.FeedData(img.GetStream(FileMode.Open)); 
      } 
+0

Cela a fonctionné parfaitement pour moi. –