5

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

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

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

有没有办法将图像放在/word/media文件夹中,除了在 Open XML SDK 中关闭文件,将其作为 zip 存档打开,重新定位图像并手动更新关系?

4

1 回答 1

10

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

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

  1. 创建一个PackagePart路径 Uri 设置为/word/media.
  2. 将图像数据输入包部分。
  3. 为图像创建一个PackageReleationship
  4. 使用 的 IDPackageReleationship来引用 word 文档中的图像。

我已经从这个MSDN网站复制了AddImageToBody()函数的代码。

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),您必须更改内容类型。

于 2013-09-07T14:06:51.653 回答