打开xml SDK。插入图片时无法显示图片

问题描述 投票:0回答:2

我刚开始使用Open Xml SDK,我遇到了以下问题。我正在尝试使用Open xml SDK将文本替换为word文件中的图像。图像在所需的位置,但我得到图标“图片无法显示”。如果我将图像添加到文档的末尾,一切正常。这是为什么?

using (WordprocessingDocument wordDoc1 = WordprocessingDocument.Open(link, true))
{
    Text textPlaceHolder = wordDoc1.MainDocumentPart.Document.Body.Descendants<Text>().Where((x) => x.Text == "(Imageplaceholder)").FirstOrDefault();
    if (textPlaceHolder == null)
    {
        Console.WriteLine("Text holder not found!");
    }
    else
    {
        var parent = textPlaceHolder.Parent;

        if (!(parent is Run))  // Parent should be a run element.
        {
            Console.Out.WriteLine("Parent is not run");
        }
        else
        {
            var element =
        new DocumentFormat.OpenXml.Wordprocessing.Drawing(
            new DW.Inline(
                new DW.Extent() { Cx = 480000L, Cy = 792000L },
                new DW.EffectExtent()
                {
                    LeftEdge = 980000L,
                    TopEdge = 0L,
                    RightEdge = 0L,
                    BottomEdge = 0L
                },
                new DW.DocProperties()
                {
                    Id = (UInt32Value)1U,
                    Name = "Picture 1"
                },
                new DW.NonVisualGraphicFrameDrawingProperties(
                    new A.GraphicFrameLocks() { NoChangeAspect = true }),
                new A.Graphic(
                    new A.GraphicData(
                        new PIC.Picture(
                            new PIC.NonVisualPictureProperties(
                                new PIC.NonVisualDrawingProperties()
                                {
                                    Id = (UInt32Value)0U,
                                    Name = "Test.jpg"
                                },
                                new PIC.NonVisualPictureDrawingProperties()),
                            new PIC.BlipFill(new A.Blip(
                                    new A.BlipExtensionList(
                                        new A.BlipExtension()
                                        {
                                            Uri =
                                            "{28A0092B-C50C-407E-A947-70E740481C1C}"
                                        })
                                )
                                {
                                    Embed = "C:\\Users\\Me\\Desktop\\Test.jpg",
                                    CompressionState =
                                  A.BlipCompressionValues.Print
                                },
                                new A.Stretch(
                                    new A.FillRectangle())),
                            new PIC.ShapeProperties(
                                new A.Transform2D(
                                    new A.Offset() { X = 0L, Y = 0L },
                                    new A.Extents() { Cx = 990000L, Cy = 792000L }),
                                new A.PresetGeometry(
                                    new A.AdjustValueList()
                                )
                                { Preset = A.ShapeTypeValues.Rectangle }))
                    )
                    { Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" })
            )
            {
                DistanceFromTop = (UInt32Value)0U,
                DistanceFromBottom = (UInt32Value)0U,
                DistanceFromLeft = (UInt32Value)0U,
                DistanceFromRight = (UInt32Value)0U,
                EditId = "50D07946"
            });

            // Insert image (the image created with your function) after text place holder.        
            textPlaceHolder.Parent.InsertAfter<DocumentFormat.OpenXml.Wordprocessing.Drawing>(element, textPlaceHolder);
            // Remove text place holder.
            textPlaceHolder.Remove();
            wordDoc1.Close();
        }
    }  
}
c# openxml-sdk
2个回答
0
投票

将其添加到using块的顶部(在{}内):

using (WordprocessingDocument wordDoc1 = WordprocessingDocument.Open(link, true))
{
    MainDocumentPart mainPart = wordprocessingDocument.MainDocumentPart;

    ImagePart imagePart = mainPart.AddImagePart(ImagePartType.Jpeg);

    using (FileStream stream = new FileStream(fileName, FileMode.Open))
    {
        imagePart.FeedData(stream);
    }
    var relationshipId = mainPart.GetIdOfPart(imagePart);

    # And then continue with the code you had:
    Text textPlaceHolder = wordDoc1.MainDocumentPart.Document.Body.Descendants<Text>().Where((x) => x.Text == "(Imageplaceholder)").FirstOrDefault();
    # etc

然后更换你的线

Embed = "C:\\Users\\Me\\Desktop\\Test.jpg",

Embed = relationshipId,

备查:

对我来说问题是我在处理WordprocessingDocument对象之前将文档写入文件。

要么将WordprocessingDocument包装在using块中(就像OP那样),要么在将文档流写入文件之前调用wordprocessingDocument.Dispose()


-1
投票

您已在Embed属性中放置路径,但它应该是图像部件的ID。你会发现如何在你复制其余部分的同一个MSDN URL上创建这个部分。

© www.soinside.com 2019 - 2024. All rights reserved.