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

Jac*_*ard 5 c# image openxml openxml-sdk google-drive-api

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

我当前正在使用MainDocumentPart.AddImagePart方法,该方法将图像插入/media文件层次结构的文件夹中。但是,驱动器仅希望读取图像(如果它位于/word/media文件夹中)。

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

有什么方法可以将图像放置在/word/media文件夹中,而无需关闭Open XML SDK中的文件,将其作为zip存档打开,重新定位图像并手动更新关系。

Han*_*ans 6

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

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

  1. 创建一个PackagePart将Uri设置为的路径/word/media
  2. 将图像数据输入包装部分。
  3. PackageReleationship为图像创建一个。
  4. 使用的ID PackageReleationship引用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)));
}
Run Code Online (Sandbox Code Playgroud)

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