使用C#Word API从Word文件中读取图像,而不使用剪贴板

时间:2016-03-01 07:01:13

标签: c# bitmap ms-word office-interop word-automation

我一直致力于从多个word文件中读取图像的应用程序,并使用C#中的Microsoft.Office.Interop.Word将它们存储在一个单词文件中

编辑:我还需要在文件系统上保存图像的副本,因此我需要位图或类似对象中的图像。

到目前为止This是我的实现,工作正常:

        foreach (InlineShape shape in doc.InlineShapes)
        {
            shape.Range.Select();
            if (shape.Type == WdInlineShapeType.wdInlineShapePicture)
            {
                doc.ActiveWindow.Selection.Range.CopyAsPicture();
                ImageData = Clipboard.GetDataObject();
                object _ob1 = ImageData.GetData(DataFormats.Bitmap);
                bmp = (Bitmap)_ob1;
                images[i++] = bmp;
                /*
                bmp.Save("C:\\Users\\Akshay\\Pictures\\bitmaps\\test" + i.ToString() + ".bmp");
                */
            }
        }



我有:

  • 将图片选为InlineShapes
  • 将形状复制到剪贴板
  • DataObject
  • 的形式在剪贴板中存储形状
  • DataObject格式从Bitmap提取形状并存储在Bitmap对象中。



我被告知不要在Word自动化中使用剪贴板,而是使用Word API。 我已经阅读了它并找到了SO answer说明相同的内容。



我在MSDNSO等上查找了许多从Word文件中读取图像的实现,但在没有使用剪贴板的情况下找不到任何实现。

如何在不使用剪贴板的情况下使用Microsoft.Office.Interop.Word命名空间中的Word API从Word文件中读取图像?

1 个答案:

答案 0 :(得分:0)

Office Open XML文件格式的Word文档在Base64中存储图像。因此,应该可以提取该信息并将其转换/流式传输到文件中。使用Range.WordOpenXML属性在Word应用程序中打开文档时,可以访问该信息。

string shapeBase64 = shape.Range.WordOpenXML;

这将以平面文件OPC格式返回整个Word Open XML。换句话说,它不仅包含Base64中的图片,而是整个zip包定义为围绕它的XML。在我的快速测试中,包含实际Base64的标签是

<pkg:binaryData>

这是

的子元素
<pkg:part pkg:name="/word/media/image1.jpg" pkg:contentType="image/jpeg" pkg:compression="store">

请注意,您也可以一步到位地获取整个文档的WordOpenXML:

document.Content.WordOpenXML

但是可能需要了解文档正文中的InlineShapes链接到&#34; media&#34;中的实际信息的方式。一部分。

当然,可以直接使用Zip包(也许使用Open XML SDK),而不是在Word.Application中打开文档。