OOXML: сохранять изображения отображаемыми после перемещения содержимого заголовка в тело

Я использую Open XML SDK и хочу переместить содержимое элемента управления содержимым (содержащее изображения) из заголовка в тело, проблема в том, что изображения не отображаются после перемещения. После копирования содержимого элемента управления я добавляю части изображения следующим образом:

foreach (var headerPart in wordDocument.MainDocumentPart.HeaderParts)
                        {
                            SdtBlock sdtToSave = this.FindSdtBlock(contentControlTag, headerPart );
                            if (sdtToSave != null)
                            {
                                foreach (var imagePart in headerPart.ImageParts)
                                {
                                    ImagePart newPart = mainPart.AddImagePart(imagePart.ContentType);
                                    this.GenerateImagePartContent(newPart, imagePart.GetStream());                                                                }
                                 }
                        }
private void GenerateImagePartContent(ImagePart imagePart, Stream partStream)
        {
            imagePart.FeedData(partStream);
            partStream.Close();
        }

то, если я добавлю эти строки:

Paragraph paragraph = sdtToSave.SdtContentBlock.GetFirstChild<Paragraph>();
                                    Run run = new Run();
                                    paragraph.Append(run);
                                    run.Append(this.GenerateDrawing(mainPart.GetIdOfPart(newPart)));


private Drawing GenerateDrawing(String relationshipID)
        {
            Drawing drawing1 = new Drawing();

            Inline inline1 = new Inline() { DistanceFromTop = (UInt32Value)0U, DistanceFromBottom = (UInt32Value)0U, DistanceFromLeft = (UInt32Value)0U, DistanceFromRight = (UInt32Value)0U };
            Extent extent1 = new Extent() { Cx = 152400L, Cy = 152400L };
            EffectExtent effectExtent1 = new EffectExtent() { LeftEdge = 0L, TopEdge = 0L, RightEdge = 0L, BottomEdge = 0L };
            DocProperties docProperties1 = new DocProperties() { Id = (UInt32Value)1U, Name = "Image 1" };

            NonVisualGraphicFrameDrawingProperties nonVisualGraphicFrameDrawingProperties1 = new NonVisualGraphicFrameDrawingProperties();

            A.GraphicFrameLocks graphicFrameLocks1 = new A.GraphicFrameLocks() { NoChangeAspect = true };
            graphicFrameLocks1.AddNamespaceDeclaration("a", "http://schemas.openxmlformats.org/drawingml/2006/main");

            nonVisualGraphicFrameDrawingProperties1.Append(graphicFrameLocks1);

            A.Graphic graphic1 = new A.Graphic();
            graphic1.AddNamespaceDeclaration("a", "http://schemas.openxmlformats.org/drawingml/2006/main");

            A.GraphicData graphicData1 = new A.GraphicData() { Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" };

            Pic.Picture picture1 = new Pic.Picture();
            picture1.AddNamespaceDeclaration("pic", "http://schemas.openxmlformats.org/drawingml/2006/picture");

            Pic.NonVisualPictureProperties nonVisualPictureProperties1 = new Pic.NonVisualPictureProperties();
            Pic.NonVisualDrawingProperties nonVisualDrawingProperties1 = new Pic.NonVisualDrawingProperties() { Id = (UInt32Value)0U, Name = "AddTo_Blink.png" };
            Pic.NonVisualPictureDrawingProperties nonVisualPictureDrawingProperties1 = new Pic.NonVisualPictureDrawingProperties();

            nonVisualPictureProperties1.Append(nonVisualDrawingProperties1);
            nonVisualPictureProperties1.Append(nonVisualPictureDrawingProperties1);

            Pic.BlipFill blipFill1 = new Pic.BlipFill();

            A.Blip blip1 = new A.Blip() { Embed = relationshipID };

            A.BlipExtensionList blipExtensionList1 = new A.BlipExtensionList();

            A.BlipExtension blipExtension1 = new A.BlipExtension() { Uri = "{28A0092B-C50C-407E-A947-70E740481C1C}" };

            A14.UseLocalDpi useLocalDpi1 = new A14.UseLocalDpi() { Val = false };
            useLocalDpi1.AddNamespaceDeclaration("a14", "http://schemas.microsoft.com/office/drawing/2010/main");

            blipExtension1.Append(useLocalDpi1);

            blipExtensionList1.Append(blipExtension1);

            blip1.Append(blipExtensionList1);

            A.Stretch stretch1 = new A.Stretch();
            A.FillRectangle fillRectangle1 = new A.FillRectangle();

            stretch1.Append(fillRectangle1);

            blipFill1.Append(blip1);
            blipFill1.Append(stretch1);

            Pic.ShapeProperties shapeProperties1 = new Pic.ShapeProperties();

            A.Transform2D transform2D1 = new A.Transform2D();
            A.Offset offset1 = new A.Offset() { X = 0L, Y = 0L };
            A.Extents extents1 = new A.Extents() { Cx = 152400L, Cy = 152400L };

            transform2D1.Append(offset1);
            transform2D1.Append(extents1);

            A.PresetGeometry presetGeometry1 = new A.PresetGeometry() { Preset = A.ShapeTypeValues.Rectangle };
            A.AdjustValueList adjustValueList1 = new A.AdjustValueList();

            presetGeometry1.Append(adjustValueList1);

            shapeProperties1.Append(transform2D1);
            shapeProperties1.Append(presetGeometry1);

            picture1.Append(nonVisualPictureProperties1);
            picture1.Append(blipFill1);
            picture1.Append(shapeProperties1);

            graphicData1.Append(picture1);

            graphic1.Append(graphicData1);

            inline1.Append(extent1);
            inline1.Append(effectExtent1);
            inline1.Append(docProperties1);
            inline1.Append(nonVisualGraphicFrameDrawingProperties1);
            inline1.Append(graphic1);

            drawing1.Append(inline1);
            return drawing1;

        }

все изображения показаны в конце тела.

Из инструмента повышения производительности OXML SDK я вижу, что закладки используются для вставки изображений внутри абзаца.

Подводя итог, я хочу знать, как сохранить изображения при перемещении элементов управления содержимым из заголовка в тело.

С Уважением.


person DevTun    schedule 20.07.2011    source источник


Ответы (1)


Когда вы добавляете свою часть изображения в mainPart, ей будет присвоен relId, который вряд ли будет таким же, как relId, который у нее был в headerPart. Таким образом, вам придется настроить relId в чертеже (Embed=relationID), чтобы он совпадал.

person JasonPlutext    schedule 20.07.2011
comment
Это было именно то, что мне нужно было сделать: изменить свойство embed Blip, чтобы оно соответствовало добавленному imagePart отношенияShipId. - person DevTun; 22.07.2011