Создать ссылку между слайдами в PowerPoint с OpenXML - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь создать таблицу содержимого при создании презентации PowerPoint с использованием OpenXML. Для этого необходимо иметь гиперссылки на слайды. Я использовал инструмент Open XML Productivity Tool, чтобы попытаться выяснить, какой код использовать, а также посмотреть на этот вопрос и на ссылку, на которую есть ссылка.

Файл Power Point, который я использую для тестирования, содержит несколько слайдов, но для тестирования код должен добавить слайд в начале с текстовым полем с двумя строками текста, ссылающимися на слайд 2 и 3 соответственно.

При открытии файла в конце выдает следующую ошибку PowerPoint обнаружил проблему с контентом в. PowerPoint может попытаться восстановить презентацию.

Если я пытаюсь исправить, текстовое поле с двумя строками остается, но все форматирование изменилось в презентации, и текст не ссылается на другие слайды.

Вот код, который я использую

    private void InsertLinkOnNewSlide()
    {
        var position = 0;
        string slideTitle = "Slide with a hyperlink";
        using (PresentationDocument presentationDocument = PresentationDocument.Open(openFileDialog1.FileName, true))
        {
            if (presentationDocument == null)
            {
                throw new ArgumentNullException("presentationDocument");
            }

            if (slideTitle == null)
            {
                throw new ArgumentNullException("slideTitle");
            }

            PresentationPart presentationPart = presentationDocument.PresentationPart;

            // Verify that the presentation is not empty.
            if (presentationPart == null)
            {
                throw new InvalidOperationException("The presentation document is empty.");
            }

            // Declare and instantiate a new slide.
            Slide slide = new Slide(new CommonSlideData(new ShapeTree()));
            uint drawingObjectId = 1;

            // Construct the slide content.            
            // Specify the non-visual properties of the new slide.
            NonVisualGroupShapeProperties nonVisualProperties = slide.CommonSlideData.ShapeTree.AppendChild(new NonVisualGroupShapeProperties());
            nonVisualProperties.NonVisualDrawingProperties = new NonVisualDrawingProperties() { Id = 1, Name = "" };
            nonVisualProperties.NonVisualGroupShapeDrawingProperties = new NonVisualGroupShapeDrawingProperties();
            nonVisualProperties.ApplicationNonVisualDrawingProperties = new ApplicationNonVisualDrawingProperties();

            // Specify the group shape properties of the new slide.
            slide.CommonSlideData.ShapeTree.AppendChild(new GroupShapeProperties());

            // Declare and instantiate the title shape of the new slide.
            Shape titleShape = slide.CommonSlideData.ShapeTree.AppendChild(new Shape());

            drawingObjectId++;

            // Specify the required shape properties for the title shape. 
            titleShape.NonVisualShapeProperties = new NonVisualShapeProperties
                (new NonVisualDrawingProperties() { Id = drawingObjectId, Name = "Title" },
                new NonVisualShapeDrawingProperties(new Drawing.ShapeLocks() { NoGrouping = true }),
                new ApplicationNonVisualDrawingProperties(new PlaceholderShape() { Type = PlaceholderValues.Title }));
            titleShape.ShapeProperties = new ShapeProperties();

            // Specify the text of the title shape.
            titleShape.TextBody = new TextBody(new Drawing.BodyProperties(),
                    new Drawing.ListStyle(),
                    new Drawing.Paragraph(new Drawing.Run(new Drawing.Text() { Text = slideTitle })));

            // Declare and instantiate the body shape of the new slide.
            slide.CommonSlideData.ShapeTree.AppendChild(ToC());

            // Create the slide part for the new slide.
            SlidePart slidePart = presentationPart.AddNewPart<SlidePart>();
            // Save the new slide part.
            slide.Save(slidePart);

            // Modify the slide ID list in the presentation part.
            // The slide ID list should not be null.
            SlideIdList slideIdList = presentationPart.Presentation.SlideIdList;

            // Find the highest slide ID in the current list.
            uint maxSlideId = 1;
            SlideId prevSlideId = null;

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

                position--;
                if (position == 0)
                {
                    prevSlideId = slideId;
                }

            }

            maxSlideId++;

            // Get the ID of the previous slide.
            SlidePart lastSlidePart;

            if (prevSlideId != null)
            {
                lastSlidePart = (SlidePart)presentationPart.GetPartById(prevSlideId.RelationshipId);
            }
            else
            {
                lastSlidePart = (SlidePart)presentationPart.GetPartById(((SlideId)(slideIdList.ChildElements[0])).RelationshipId);
            }


            SlideLayoutIdList slideLayoutIdList1 = new SlideLayoutIdList();
            SlideLayoutId slideLayoutId1 = new SlideLayoutId() { Id = (UInt32Value)2147483649U, RelationshipId = "rId2" };
            SlideLayoutId slideLayoutId2 = new SlideLayoutId() { Id = (UInt32Value)2147483650U, RelationshipId = "rId3" };
            slideLayoutIdList1.Append(slideLayoutId1);
            slideLayoutIdList1.Append(slideLayoutId2);
            lastSlidePart.SlideLayoutPart.SlideMasterPart.SlideMaster.Append(slideLayoutIdList1);

            // Use the same slide layout as that of the previous slide.
            if (null != lastSlidePart.SlideLayoutPart)
            {
                slidePart.AddPart(lastSlidePart.SlideLayoutPart);
            }

            // Insert the new slide into the slide list after the previous slide.
            SlideId newSlideId = slideIdList.InsertAfter(new SlideId(), prevSlideId);
            newSlideId.Id = maxSlideId;
            newSlideId.RelationshipId = presentationPart.GetIdOfPart(slidePart);

            // Save the modified presentation.
            presentationPart.Presentation.Save();
        }
    }

    private Shape ToC()
    {
        Shape shape65 = new Shape();

        NonVisualShapeProperties nonVisualShapeProperties65 = new NonVisualShapeProperties();

        NonVisualDrawingProperties nonVisualDrawingProperties79 = new NonVisualDrawingProperties() { Id = (UInt32Value)4U, Name = "TextBox 3" };

        Drawing.NonVisualDrawingPropertiesExtensionList nonVisualDrawingPropertiesExtensionList65 = new Drawing.NonVisualDrawingPropertiesExtensionList();

        Drawing.NonVisualDrawingPropertiesExtension nonVisualDrawingPropertiesExtension65 = new Drawing.NonVisualDrawingPropertiesExtension() { Uri = "{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}" };

        OpenXmlUnknownElement openXmlUnknownElement65 = OpenXmlUnknownElement.CreateOpenXmlUnknownElement("<a16:creationId xmlns:a16=\"http://schemas.microsoft.com/office/drawing/2014/main\" id=\"{82A8F1A8-1020-4A5E-9C65-D3C2432A2F35}\" />");

        nonVisualDrawingPropertiesExtension65.Append(openXmlUnknownElement65);

        nonVisualDrawingPropertiesExtensionList65.Append(nonVisualDrawingPropertiesExtension65);

        nonVisualDrawingProperties79.Append(nonVisualDrawingPropertiesExtensionList65);
        NonVisualShapeDrawingProperties nonVisualShapeDrawingProperties65 = new NonVisualShapeDrawingProperties() { TextBox = true };
        ApplicationNonVisualDrawingProperties applicationNonVisualDrawingProperties79 = new ApplicationNonVisualDrawingProperties();

        nonVisualShapeProperties65.Append(nonVisualDrawingProperties79);
        nonVisualShapeProperties65.Append(nonVisualShapeDrawingProperties65);
        nonVisualShapeProperties65.Append(applicationNonVisualDrawingProperties79);

        ShapeProperties shapeProperties65 = new ShapeProperties();

        Drawing.Transform2D transform2D25 = new Drawing.Transform2D();
        Drawing.Offset offset39 = new Drawing.Offset() { X = 278296L, Y = 318052L };
        Drawing.Extents extents39 = new Drawing.Extents() { Cx = 3331596L, Cy = 646331L };

        transform2D25.Append(offset39);
        transform2D25.Append(extents39);

        Drawing.PresetGeometry presetGeometry6 = new Drawing.PresetGeometry() { Preset = Drawing.ShapeTypeValues.Rectangle };
        Drawing.AdjustValueList adjustValueList6 = new Drawing.AdjustValueList();

        presetGeometry6.Append(adjustValueList6);
        Drawing.NoFill noFill1 = new Drawing.NoFill();

        shapeProperties65.Append(transform2D25);
        shapeProperties65.Append(presetGeometry6);
        shapeProperties65.Append(noFill1);

        TextBody textBody65 = new TextBody();

        Drawing.BodyProperties bodyProperties65 = new Drawing.BodyProperties() { Wrap = Drawing.TextWrappingValues.Square, RightToLeftColumns = false };
        Drawing.ShapeAutoFit shapeAutoFit1 = new Drawing.ShapeAutoFit();

        bodyProperties65.Append(shapeAutoFit1);
        Drawing.ListStyle listStyle65 = new Drawing.ListStyle();

        Drawing.Paragraph paragraph101 = new Drawing.Paragraph();

        Drawing.Run run64 = new Drawing.Run();

        Drawing.RunProperties runProperties88 = new Drawing.RunProperties() { Language = "en-ZA", Dirty = false };
        Drawing.HyperlinkOnClick hyperlinkOnClick1 = new Drawing.HyperlinkOnClick() { Id = "rId2", Action = "ppaction://hlinksldjump" };

        runProperties88.Append(hyperlinkOnClick1);
        Drawing.Text text88 = new Drawing.Text();
        text88.Text = "Link to slide 2";

        run64.Append(runProperties88);
        run64.Append(text88);

        Drawing.Break break1 = new Drawing.Break();
        Drawing.RunProperties runProperties89 = new Drawing.RunProperties() { Language = "en-ZA", Dirty = false };

        break1.Append(runProperties89);

        Drawing.Run run65 = new Drawing.Run();

        Drawing.RunProperties runProperties90 = new Drawing.RunProperties() { Language = "en-ZA", Dirty = false };
        Drawing.HyperlinkOnClick hyperlinkOnClick2 = new Drawing.HyperlinkOnClick() { Id = "rId3", Action = "ppaction://hlinksldjump" };

        runProperties90.Append(hyperlinkOnClick2);
        Drawing.Text text89 = new Drawing.Text();
        text89.Text = "Link to slide 3";

        run65.Append(runProperties90);
        run65.Append(text89);
        Drawing.EndParagraphRunProperties endParagraphRunProperties59 = new Drawing.EndParagraphRunProperties() { Language = "en-ZA", Dirty = false };

        paragraph101.Append(run64);
        paragraph101.Append(break1);
        paragraph101.Append(run65);
        paragraph101.Append(endParagraphRunProperties59);

        textBody65.Append(bodyProperties65);
        textBody65.Append(listStyle65);
        textBody65.Append(paragraph101);

        shape65.Append(nonVisualShapeProperties65);
        shape65.Append(shapeProperties65);
        shape65.Append(textBody65);

        return shape65;
    }

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

            SlideLayoutIdList slideLayoutIdList1 = new SlideLayoutIdList();
            SlideLayoutId slideLayoutId1 = new SlideLayoutId() { Id = (UInt32Value)2147483649U, RelationshipId = "rId2" };
            SlideLayoutId slideLayoutId2 = new SlideLayoutId() { Id = (UInt32Value)2147483650U, RelationshipId = "rId3" };
            slideLayoutIdList1.Append(slideLayoutId1);
            slideLayoutIdList1.Append(slideLayoutId2);
            lastSlidePart.SlideLayoutPart.SlideMasterPart.SlideMaster.Append(slideLayoutIdList1);
...