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

时间:2017-10-05 15:41:10

标签: c# openxml-sdk

我刚开始使用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();
        }
    }  
}

2 个答案:

答案 0 :(得分: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 :(得分:-1)

您已在 Embed 属性中添加路径,但它应该是图像部件的ID。您将找到如何在您复制其余部分的同一MSDN URL创建此部件。