none
Text font issues while copying slides RRS feed

  • Question

  • When I copy a slide from a powerpoint file to a new powerpoint file using open xml, everything works fine. Except for text font. This happens only with textbox element. My orginal textbox has Calibri Body font, whereas the newly created powerpoint slide shows Trebuchet MS. 

    The table element also has text font as Calibri body, and there is no issue with it. The font gets changes only for textbox element text.

    Sunday, May 26, 2013 1:12 PM

All replies

  • you can share the code or upload your project to skydrive and share with us


    with regards, Yuri

    Tuesday, May 28, 2013 12:32 PM
  •  public void SavePresentations(SlideLibrary deck, string filePath)
            {
                WindowsIdentity identity = WindowsIdentity.GetCurrent();
                WindowsImpersonationContext context = identity.Impersonate();

                string presentationTemplate = "PresentationTemplate.pptx";
               
                string presentationFolder = System.Configuration.ConfigurationManager.AppSettings["PowerpointFolder"].ToString();
                string presentationTemplatePath = System.Configuration.ConfigurationManager.AppSettings["PowerpointTemplate"].ToString();
                string newFileName = Guid.NewGuid().ToString();
                File.Copy(presentationTemplatePath + presentationTemplate, filePath, true);

                foreach (Deck item in deck.DeckSlides)
                {
                    string pptName = item.DeckName.ToString();
                    string SlideId = item.SlideIndex;
                    MergeSlides(presentationFolder, System.IO.Path.GetFileName(pptName), filePath, Convert.ToInt32(SlideId));
                }
                context.Undo();
            }
            public void MergeSlides(string presentationFolder, string sourcePresentation, string destPresentation, int SlideIdNew)
            {
                OpenXmlValidator validator = new OpenXmlValidator();

                // Open the destination presentation.
                try
                {
                    using (PresentationDocument myDestDeck = PresentationDocument.Open(destPresentation, true))
                    {

                        PresentationPart destPresPart = myDestDeck.PresentationPart;
                        // If the merged presentation doesn't have a SlideIdList element yet then add it.
                        if (destPresPart.Presentation.SlideIdList == null)
                            destPresPart.Presentation.SlideIdList = new SlideIdList();

                        // Open the source presentation. This will throw an exception if the source presentation does not exist.
                        using (PresentationDocument mySourceDeck = PresentationDocument.Open(presentationFolder + sourcePresentation, false))
                        {
                            PresentationPart sourcePresPart = mySourceDeck.PresentationPart;

                            // Get unique ids for the slide master and slide lists for use later.
                            uniqueId = GetMaxSlideMasterId(destPresPart.Presentation.SlideMasterIdList);
                            uint maxSlideId = GetMaxSlideId(destPresPart.Presentation.SlideIdList);

                            // Copy each slide in the source presentation in order to the destination presentation.
                            foreach (SlideId slideId in sourcePresPart.Presentation.SlideIdList)
                            {
                                if (slideId.Id == SlideIdNew)
                                {
                                    SlidePart sp;
                                    SlidePart destSp;
                                    SlideMasterPart destMasterPart;
                                    string relId;
                                    SlideMasterId newSlideMasterId;
                                    SlideId newSlideId;

                                    // Create a unique relationship id.
                                    id = id + 1;
                                    sp = (SlidePart)sourcePresPart.GetPartById(slideId.RelationshipId);
                                    
                                    relId = sourcePresentation.Remove(sourcePresentation.IndexOf('.')).Replace(" ", "") + id;

                                    // Add the slide part to the destination presentation.
                                    destSp = destPresPart.AddPart<SlidePart>(sp, relId);

                                    // The master part was added. Make sure the relationship is in place.
                                    destMasterPart = destSp.SlideLayoutPart.SlideMasterPart;
                                    destPresPart.AddPart(destMasterPart);

                                    // Add slide master to slide master list.
                                    uniqueId++;
                                    newSlideMasterId = new SlideMasterId();
                                    newSlideMasterId.RelationshipId = destPresPart.GetIdOfPart(destMasterPart);
                                    newSlideMasterId.Id = uniqueId;

                                    // Add slide to slide list.
                                    maxSlideId++;
                                    newSlideId = new SlideId();
                                    newSlideId.RelationshipId = relId;
                                    newSlideId.Id = maxSlideId;

                                    if (destPresPart.Presentation.SlideSize.Cy < sourcePresPart.Presentation.SlideSize.Cy)
                                    {
                                        destPresPart.Presentation.SlideSize.Cy = sourcePresPart.Presentation.SlideSize.Cy;
                                    }
                                    if (destPresPart.Presentation.SlideSize.Cx < sourcePresPart.Presentation.SlideSize.Cx)
                                    {
                                        destPresPart.Presentation.SlideSize.Cx = sourcePresPart.Presentation.SlideSize.Cx;
                                    }

                                    destPresPart.Presentation.SlideMasterIdList.Append(newSlideMasterId);
                                    destPresPart.Presentation.SlideIdList.Append(newSlideId);
                                }
                            }

                            // Make sure all slide ids are unique.
                            FixSlideLayoutIds(destPresPart);
                        }

                        // Save the changes to the destination deck.
                        destPresPart.Presentation.Save();

                        var errors = validator.Validate(myDestDeck);
                        if (errors.Count() == 0)
                        {
                            Console.WriteLine("Document is valid");
                        }
                        else
                        {
                            Console.WriteLine("Document is not valid");
                        }
                    }
                }
                catch (Exception ex)
                {

                }
            }
            static void FixSlideLayoutIds(PresentationPart presPart)
            {
                // Make sure all slide layouts have unique ids.
                foreach (SlideMasterPart slideMasterPart in presPart.SlideMasterParts)
                {
                    foreach (SlideLayoutId slideLayoutId in slideMasterPart.SlideMaster.SlideLayoutIdList)
                    {
                        uniqueId++;
                        slideLayoutId.Id = (uint)uniqueId;
                    }

                    slideMasterPart.SlideMaster.Save();
                }
            }

            static uint GetMaxSlideId(SlideIdList slideIdList)
            {
                // Slide identifiers have a minimum value of greater than or equal to 256
                // and a maximum value of less than 2147483648. 
                uint max = 256;

                if (slideIdList != null)
                    // Get the maximum id value from the current set of children.
                    foreach (SlideId child in slideIdList.Elements<SlideId>())
                    {
                        uint id = child.Id;

                        if (id > max)
                            max = id;
                    }

                return max;
            }

            static uint GetMaxSlideMasterId(SlideMasterIdList slideMasterIdList)
            {
                // Slide master identifiers have a minimum value of greater than or equal to 2147483648. 
                uint max = 2147483648;

                if (slideMasterIdList != null)
                    // Get the maximum id value from the current set of children.
                    foreach (SlideMasterId child in slideMasterIdList.Elements<SlideMasterId>())
                    {
                        uint id = child.Id;

                        if (id > max)
                            max = id;
                    }

                return max;
            }

    Praveen

    Wednesday, May 29, 2013 1:31 PM