使用OpenXML将图像添加到Word文档

5
我开发了一个应用程序,旨在将图像添加到Word文档中。它从Word文档中复制内容并将图片添加到副本中。我尝试添加文本,效果很好,但是添加图像时,Word文档想要打开文件,出现错误(无法打开文件“名称”,因为内容存在问题)。
我的代码如下:
File.Copy(file, newFile, true);
     WordprocessingDocument wordFile = WordprocessingDocument.Open(newFile, true);
     Body body = wordFile.MainDocumentPart.Document.Body;

     var picture = new Picture();
     var shape = new Shape() { Style = "width: 20px; height: 20px" };
     var imageData = new ImageData() { RelationshipId = "img" };

     shape.Append(imageData);
     picture.Append(shape);
     wordFile.MainDocumentPart.AddExternalRelationship(
          "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
           new Uri(link_of_image, UriKind.Absolute),"img");

     Paragraph para = body.AppendChild(new Paragraph());
     Run run = para.AppendChild(new Run());
     run.AppendChild(new Picture(picture));

     wordFile.Close();

可能出了什么问题?

这里的“link_of_image”是什么?它应该是一个有效的文件路径吗?这张图片存在吗? - Kerri Brown
@KerriBrown 这张图片并不存在于电脑上,它是一个指向已上传至服务器的图片链接,例如("something.com/Images/image.png")。 - sam saleh
还有其他可以进行调查的事情。例如,尝试使用存储在本地计算机上的图像,删除“wordFile.MainDocumentPart.AddExternalRelationship”,看看是否仍然会出现错误等。 - Kerri Brown
1个回答

6

这是一个关于如何添加本地驱动器中的图片的解决方案,但我不知道如何从在线服务器中添加图片。

解决方案:

首先添加以下组件:

using System.IO;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using A = DocumentFormat.OpenXml.Drawing;
using DW = DocumentFormat.OpenXml.Drawing.Wordprocessing;
using PIC = DocumentFormat.OpenXml.Drawing.Pictures;

然后打开文件。
        WordprocessingDocument wordprocessingDocument =
        WordprocessingDocument.Open(newFile, true);

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

        using (FileStream stream = new FileStream(@"C:\Users\User\Desktop\img.PNG", FileMode.Open))
        {
            imagePart.FeedData(stream);
        }
        AddImageToBody(wordprocessingDocument, mainPart.GetIdOfPart(imagePart));

        wordprocessingDocument.Close();

然后定义图像的引用,并将其附加到正文中。
var element =
     new Drawing(
         new DW.Inline(
             new DW.Extent() { Cx = 990000L, Cy = 792000L },
             new DW.EffectExtent()
             {
                 LeftEdge = 0L,
                 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 = "New Bitmap Image.jpg"
                             },
                             new PIC.NonVisualPictureDrawingProperties()),
                         new PIC.BlipFill(
                             new A.Blip(
                                 new A.BlipExtensionList(
                                     new A.BlipExtension()
                                     {
                                         Uri =
                                           "{28A0092B-C50C-407E-A947-70E740481C1C}"
                                     })
                             )
                             {
                                 Embed = relationshipId,
                                 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"
         });

wordDoc.MainDocumentPart.Document.Body.AppendChild(new Paragraph(new Run(element)));

参考资料 https://msdn.microsoft.com/zh-cn/library/office/bb497430.aspx

这是关于IT技术的参考资料链接。请点击上面的链接以获取更多信息。

或者您可以直接将绘图添加到文档的任何位置。将段落或项目传递给该方法:paragraph.AppendChild(new Paragraph(new Run(element))); - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接