【问题标题】:Extract images from word file in C#从 C# 中的 word 文件中提取图像
【发布时间】:2017-12-06 23:14:49
【问题描述】:

我在提取图像时遇到问题。我编写了这段代码来从 word 文件中提取所有图像,但是这段代码适用于某些图像,这意味着它确实保存了一些图像文件,但另一方面,这段代码不会从 Word 文件中提取图像。我正在使用办公室互操作库。

    protected void ExtractImage(string imagename, int imagenum)
    {

        word.InlineShape shape = oword.ActiveDocument.InlineShapes[imagenum];
        int dones = oword.ActiveDocument.InlineShapes.Count;           //Counts number of images in word document
        for(int i =1 ; i <= dones; i++)
        {
            shape = oword.ActiveDocument.InlineShapes[i];
            shape.Select();
            oword.Selection.Copy();

            if (Clipboard.GetDataObject() != null)
            {
                IDataObject data = Clipboard.GetDataObject();
                if (data.GetDataPresent(DataFormats.Bitmap))
                {
                    System.Drawing.Bitmap image = (System.Drawing.Bitmap)data.GetData(typeof(System.Drawing.Bitmap));
                    image.Save(@"C:\Upload2\" + imagename, System.Drawing.Imaging.ImageFormat.Jpeg);
                    Clipboard.Clear();
                }
            }
        }
     }

【问题讨论】:

  • " 它确实保存了一些图像文件,但另一方面,此代码不会从 Word 文件中提取图像" - 它是否提取图像?你的问题很模糊。
  • 我正在从一个文件夹中读取 word 文件并从中提取所有图像。此代码 80% 次提取所有图像,但 20% 次从文件中丢失图像。
  • 是的,我只是在阅读 docx 文件。
  • 如何将word文件作为zip文件处理?
  • ExtractImage(Last_File_count+"-"+Image_naming + ".jpg", Image_index);

标签: c# ms-word office-interop


【解决方案1】:

我不喜欢弄乱剪贴板,因为用户可能正在使用它...

所以,我改为使用以下代码:

private IEnumerable<Image> GetImagesFromXml(string xml)
{
    XDocument doc = XDocument.Parse(xml);

    var ns = doc.Root.Name.Namespace;
    var images = doc.Descendants(ns + "part").Where(a => a.Attribute(ns + "contentType") != null && a.Attribute(ns + "contentType").Value.Contains("image"))
    .Select(a => new { Name = a.Attribute(ns + "name").Value, Type = a.Attribute(ns + "contentType").Value, D64 = a.Descendants(ns + "binaryData").First().Value, Compression = a.Attribute(ns + "compression").Value });

    return images.Select(i => Image.FromStream(new MemoryStream(Convert.FromBase64String(i.D64)), false, false));
}

【讨论】:

    猜你喜欢
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多