简体   繁体   English

OpenXML将图像插入为链接到Word文档的文件

[英]OpenXML insert image as Link to File to word document

In Word document, there is an option in the insert image dialog box insert button that is "Link to File", where I can input a image url link into the file name input box. 在Word文档中,“插入图像”对话框中的插入按钮中有一个选项是“链接到文件”,在这里我可以将图像URL链接输入到文件名输入框中。 Word will then pull that image from the link. Word然后将从链接中提取该图像。

在此处输入图片说明

How do i translate that functionality with OpenXML? 如何使用OpenXML转换该功能? I'm currently using OpenXml SDK 2.0. 我目前正在使用OpenXml SDK 2.0。 My program is suppose to take a word document as input and add an image using that Link to File method 我的程序假设使用Word文档作为输入,并使用该Link to File方法添加图像。

The only difference between how you add a link and how you add an image is in the construction of the relationship. 如何添加链接和如何添加图像之间的唯一区别在于关系的构造。 The display part of the image is identical. 图像的显示部分相同。 In order to add the image relationship you'll need something like this: 为了添加图像关系,您将需要以下内容:

    //This isn't necessery if you know the Part Type (e.g. MainDocumentPart.AddImagePart())
    private static ImagePart CreateImagePart(OpenXmlPart container, string contentType)
    {
        var method = container.GetType().GetMethod("AddImagePart", new Type[] { typeof(string) });
        if (method == null)
            throw new Exception("Can't add an image to type: " + container.GetType().Name);
        return (ImagePart)method.Invoke(container, new object[] { contentType });
    }

    private static string AddImageToDocument(OpenXmlPart part, string imageSource, string contentType, bool addAsLink)
    {
        if (addAsLink)
        {
            ImagePart imagePart = CreateImagePart(part, contentType);
            string id = part.GetIdOfPart(imagePart);
            part.DeletePart(imagePart);
            part.AddExternalRelationship(imagePart.RelationshipType, new Uri(imageSource, UriKind.Absolute), id);
            return id;
        }
        else
        {
            ImagePart imagePart = CreateImagePart(part, contentType);
            using (Stream imageStream = File.Open(imageSource, FileMode.Open))
            {
                imagePart.FeedData(imageStream);
            }

            return part.GetIdOfPart(imagePart);
        }
    }

After you've added the image to the document, you can use the reference show the image 将图像添加到文档中后,可以使用参考显示图像

something like... 就像是...

    private static OpenXmlElement CreateImageContainer(OpenXmlPart part, string relationshipId, string imageName, int widthPixels, int heightPixels)
    {
        long widthEMU = (widthPixels * 914400L) / 96L;
        long heightEMU = (heightPixels * 914400L) / 96L;
        var element =
                    new Paragraph(
                        new Run(
                            new RunProperties(
                                new NoProof()),
                            new Drawing(
                                new wp.Inline(
                                    new wp.Extent() { Cx = widthEMU, Cy = heightEMU },
                                    new wp.DocProperties() { Id = (UInt32Value)1U, Name = "Picture 0", Description = imageName },
                                    new wp.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 = imageName },
                                                    new pic.NonVisualPictureDrawingProperties()),
                                                new pic.BlipFill(
                                                    new a.Blip() { Embed = relationshipId },
                                                    new a.Stretch(
                                                        new a.FillRectangle())),
                                                new pic.ShapeProperties(
                                                    new a.Transform2D(
                                                        new a.Offset() { X = 0L, Y = 0L },
                                                        new a.Extents() { Cx = widthEMU, Cy = heightEMU }),
                                                    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 }))
                    );
        return element;
    }

Please note that the final part of this (the CreateImageContainer) I found online and tweaked/renamed/refactored to work for my example and contains an issue, The DocProperties Id and Name and the NonVisualDrawingProperties Id need to be unique throughout the part. 请注意,我在网上找到的最后一部分(CreateImageContainer)进行了调整/重命名/重构以用于我的示例,其中包含一个问题,即DocProperties ID和Name以及NonVisualDrawingProperties Id在整个部分中必须是唯一的。 (You can't call this method twice in it's current form) (您不能以当前形式两次调用此方法)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM