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

使用C#Word API从Word文件中读取图像而不使用剪贴板,c#,bitmap,ms-word,office-interop,word-automation,C#,Bitmap,Ms Word,Office Interop,Word Automation,我一直在开发一个应用程序,可以从多个word文件中读取图像,并使用C语言中的Microsoft.Office.Interop.word将其存储在一个word文件中# 编辑:我还需要在文件系统上保存图像的副本,因此我需要位图或类似对象中的图像。 到目前为止,我的实施效果良好: foreach (InlineShape shape in doc.InlineShapes) { shape.Range.Select();

我一直在开发一个应用程序,可以从多个word文件中读取图像,并使用C语言中的Microsoft.Office.Interop.word将其存储在一个word文件中#

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

到目前为止,我的实施效果良好:

        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
  • 位图
    格式的
    数据对象
    中提取形状,并存储在
    位图
    对象中


我被告知不要在Word自动化中使用剪贴板,而是使用Word API。 我已经读过了,发现了一个相同的例子



我在
MSDN
SO
等网站上查找了许多从Word文件读取图像的实现,但没有使用剪贴板就找不到任何实现。

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


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

string shapeBase64 = shape.Range.WordOpenXML;
这将以平面文件OPC格式返回整个Word Open XML。换句话说,它不仅包含Base64中的图片,还包含围绕它的整个zip包定义XML。在我的快速测试中,包含实际Base64的标记是

<pkg:binaryData>
但随后可能需要了解文档体中的内联形状与“媒体”部分中的实际信息的链接方式


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

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

string shapeBase64 = shape.Range.WordOpenXML;
这将以平面文件OPC格式返回整个Word Open XML。换句话说,它不仅包含Base64中的图片,还包含围绕它的整个zip包定义XML。在我的快速测试中,包含实际Base64的标记是

<pkg:binaryData>
但随后可能需要了解文档体中的内联形状与“媒体”部分中的实际信息的链接方式


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

这是不使用剪贴板即内存的原因吗?如果是这样,您不能在保存图像后立即处理对象吗?是否从剪贴板中删除图像\对象?不,不使用剪贴板不是内存问题。我想继续使用Interop Word提供的标准API,而不是剪贴板解决方案。您可以声明“…并将它们存储在一个Word文件中”。如果确实要将图片直接传输到另一个Word文档,则应能够使用TargetRange.FormattedText=shape.Range。FormattedText@CindyMeister我需要位图或类似对象中的图像,以便在文件系统中保存副本或作为图像进行进一步操作图像到剪贴板图像质量降低。这是不使用剪贴板的原因吗?如果是这样,您不能在保存图像后立即处理对象吗?是否从剪贴板中删除图像\对象?不,不使用剪贴板不是内存问题。我想继续使用Interop Word提供的标准API,而不是剪贴板解决方案。您可以声明“…并将它们存储在一个Word文件中”。如果确实要将图片直接传输到另一个Word文档,则应能够使用TargetRange.FormattedText=shape.Range。FormattedText@CindyMeister我需要位图或类似对象中的图像,以便在文件系统中保存副本或作为图像进行进一步操作图像到剪贴板图像质量降低。我的实现:我可以使用此方法读取图像,但文档中只有少数图像提供了有效的XML表示。后面的XML字符串既不符合预期的格式,也不包含任何图像数据。经过反复试验,我发现无法阅读的图像是word文档第一页中没有的图像。我可以遍历文档中的所有InlineShape图片,但只有第一页中的图片才能给出有效的XML字符串。。。如果它适用于第一页,则该原则应适用于所有页面。您可能需要分析文档中的各种图形对象,它们可能并非都是相同的图形类型(bmp、png、jpg、wmf等)或以相同的方式插入,我的实现:我可以使用这种方法读取图像,但文档中只有少数图像提供了有效的XML表示。后面的XML字符串既不符合预期的格式,也不包含任何图像数据。经过反复试验,我发现无法阅读的图像是word文档第一页中没有的图像。我可以遍历文档中的所有InlineShape图片,但只有第一页中的图片才能给出有效的XML字符串