2017-10-03 11 views
0

PowerPoint 문서 한 장을 복제하고 OpenXML을 사용하여 같은 문서에 삽입하고 싶습니다.이미지가있는 새 PowerPoint 슬라이드를 복제하지 못했습니다.

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); 
} 

오리지널 슬라이드 그냥 텍스트가 포함 된 경우, 그것은 잘 작동하지만, 오리지널 슬라이드가 너무 이미지를 contans 때, 그 결과 파워 포인트 문서가 손상 BW합니다 :이를 위해, 나는 다음과 같은 기능을 사용하고 있습니다. 새 슬라이드의 이미지는 "이 이미지를 현재 표시 할 수 없습니다."라는 메시지 만 표시됩니다.

이미지가있는 슬라이드를 복제하는 데 도움이됩니다. 미리 감사드립니다.

답변

1

이 코드는 데이터 및 레이아웃 만 복사하기 때문에 손상된 슬라이드를 생성하지만 슬라이드에있는 이미지는 생성하지 않습니다.

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

예 : 위의 두 줄은 새 슬라이드가 이미지를 나타내는 것으로 표시되지만 이미지 자체는 새 슬라이드에 없습니다. 따라서이 문제를 해결하려면 이미지를 이전 슬라이드에서 새 슬라이드로 복사하는 코드를 작성해야합니다.

//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

이것은 완벽하게 작동했습니다. –