打开XML SDK-AddImagePart-将图像位置从/media更改为/word/media

本文关键字:media word SDK-AddImagePart- XML 图像 位置 打开 | 更新日期: 2023-09-27 18:30:02

我正试图使用Open XML SDK 2.5从C#向文档中插入图像。该文档随后将被上传到谷歌硬盘,并转换为谷歌文档。

我目前正在使用MainDocumentPart.AddImagePart方法,该方法将图像插入到文件层次结构的/media文件夹中。但是,驱动器只想读取位于/word/media文件夹中的图像。

在Microsoft Word中打开文档并再次保存会将图像重新定位到/word/media文件夹(并更新零件关系),从而使驱动器能够读取图像,但文件在上载到驱动器之前不会在Word中进行编辑。

除了在Open XML SDK中关闭文件、将其作为zip档案打开、重新定位图像并手动更新关系之外,还有什么方法可以将图像放置在/word/media文件夹中吗?

打开XML SDK-AddImagePart-将图像位置从/media更改为/word/media

使用Open XML SDK 2.5将图像添加到/word/media文件夹您必须自己为图像创建包部分。MainDocumentPart类的AddImagePart()成员函数总是将图像存储在CCD_ 8文件夹中。

下面的代码显示如何将图像插入/word/media文件夹使用以下步骤:

  1. 创建一个路径Uri设置为/word/mediaPackagePart
  2. 将图像数据输入到包装部件中
  3. 为图像创建一个PackageReleationship
  4. 使用PackageReleationship的ID参考中的图像word文档

我已经复制了AddImageToBody()函数的代码来自此MSDN网站。

static void Main(string[] args)
{
  InsertAPicture("mydoc.docx", "mypic.jpg");      
}
public static void InsertAPicture(string document, string fileName)
{
  using (WordprocessingDocument wordprocessingDocument =
      WordprocessingDocument.Open(document, true))
  {
    MainDocumentPart mainPart = wordprocessingDocument.MainDocumentPart;
    Uri imageUri = new Uri("/word/media/" +
      System.IO.Path.GetFileName(fileName), UriKind.Relative);
    // Create "image" part in /word/media
    // Change content type for other image types.
    PackagePart packageImagePart = 
      wordprocessingDocument.Package.CreatePart(imageUri, "Image/jpeg");
    // Feed data.
    byte[] imageBytes = File.ReadAllBytes(fileName);
    packageImagePart.GetStream().Write(imageBytes, 0, imageBytes.Length);
    PackagePart documentPackagePart = 
      mainPart.OpenXmlPackage.Package.GetPart(new Uri("/word/document.xml", UriKind.Relative));
    Console.Out.WriteLine(documentPackagePart.Uri);
    // URI to the image is relative to releationship document.
    PackageRelationship imageReleationshipPart = documentPackagePart.CreateRelationship(
          new Uri("media/" + System.IO.Path.GetFileName(fileName), UriKind.Relative),
          TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image");
    AddImageToBody(wordprocessingDocument, imageReleationshipPart.Id);
  }
}
private static void AddImageToBody(WordprocessingDocument wordDoc, string relationshipId)
{
  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 DocumentFormat.OpenXml.Wordprocessing.Paragraph(
      new DocumentFormat.OpenXml.Wordprocessing.Run(element)));
}

当然,如果您想添加其他图像类型(例如PNG),您必须更改内容类型。