如何使用C#从word文档中提取图片

要从Word文档中提取图片,可以使用C#语言中的Microsoft Office Interop库来实现。这个库提供了访问Office文件和应用程序的接口,可以用于创建、读取、编辑和保存Word文档等各种操作。这里我们将讲解如何使用C#从Word文档中提取图片,具体步骤如下:

步骤1:引用Interop库

首先,需要设置项目的引用,以便可以在C#中使用Office Interop库。右击项目,在弹出的菜单中选择“添加引用”,然后在弹出的对话框中选择“COM”选项卡,找到并勾选“Microsoft Word yy.y Object Library”(其中yy.y为Office版本号),点击“确定”按钮完成引用。

步骤2:打开Word文档

接下来,需要打开Word文档。在代码中创建一个Application对象来打开Word程序,然后使用这个对象来打开Word文档,如下所示:

Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
Document doc = app.Documents.Open(filename);

其中filename为要打开的Word文档的路径。

步骤3:遍历文档中的图片

打开Word文档后,就可以遍历文档中的所有图片,并将它们提取出来。遍历过程中,可以使用InlineShape对象来表示文档中的图片,并使用Range对象来表示图片所在的范围。代码示例如下:

foreach (InlineShape shape in doc.InlineShapes)
{
    if (shape.Type == WdInlineShapeType.wdInlineShapePicture)
    {
        Range range = shape.Range;
        string filename = range.Text.Trim();
        if (string.IsNullOrEmpty(filename))
        {
            filename = "picture" + DateTime.Now.ToString("yyyyMMddHHmmssffff") + ".jpg";
        }
        shape.Select();
        Selection sel = app.Selection;
        sel.CopyAsPicture();
        Image image = Clipboard.GetImage();
        if (image != null)
        {
            string filepath = Path.Combine(outputDir, filename);
            image.Save(filepath);
        }
    }
}

上述代码中,我们首先对文档中所有的InlineShape进行遍历,并判断每个InlineShape是否为图片类型。如果是图片类型,则创建一个Range对象,代表图片所在的文本范围。然后,我们进行一些细节处理,比如得到图片文件名、选中图片、复制图片、获取剪贴板中的图片等等。最终,我们将得到的图片保存到指定的输出目录(outputDir)中。

示例1:将Word文档中的所有图片提取出来并保存到本地

下面是一个完整的示例,演示了如何将Word文档中的所有图片提取出来并保存到本地。

using System;
using System.Drawing;
using System.IO;
using Microsoft.Office.Interop.Word;

namespace WordPictureExtractor
{
    class Program
    {
        static void Main(string[] args)
        {
            string inputFilename = "D:\\word.docx";
            string outputDir = "D:\\images";

            if (!Directory.Exists(outputDir))
            {
                Directory.CreateDirectory(outputDir);
            }

            Application app = new Application();
            Document doc = app.Documents.Open(inputFilename);

            int count = 0;
            foreach (InlineShape shape in doc.InlineShapes)
            {
                if (shape.Type == WdInlineShapeType.wdInlineShapePicture)
                {
                    Range range = shape.Range;
                    string filename = range.Text.Trim();
                    if (string.IsNullOrEmpty(filename))
                    {
                        filename = "picture" + (++count).ToString() + ".jpg";
                    }
                    shape.Select();
                    Selection sel = app.Selection;
                    sel.CopyAsPicture();
                    Image image = Clipboard.GetImage();
                    if (image != null)
                    {
                        string filepath = Path.Combine(outputDir, filename);
                        image.Save(filepath);
                    }
                }
            }

            if (doc != null)
            {
                doc.Close();
                doc = null;
            }
            if (app != null)
            {
                app.Quit();
                app = null;
            }
        }
    }
}

示例2:将Word文档中的图片提取为Base64编码字符串

下面是另一个示例,演示了如何将Word文档中的图片提取出来,并将其编码为Base64字符串。

using System;
using System.IO;
using System.Drawing;
using Microsoft.Office.Interop.Word;

namespace WordPictureExtractor
{
    class Program
    {
        static void Main(string[] args)
        {
            string inputFilename = "D:\\word.docx";

            Application app = new Application();
            Document doc = app.Documents.Open(inputFilename);

            int count = 0;
            foreach (InlineShape shape in doc.InlineShapes)
            {
                if (shape.Type == WdInlineShapeType.wdInlineShapePicture)
                {
                    Range range = shape.Range;
                    string filename = range.Text.Trim();
                    if (string.IsNullOrEmpty(filename))
                    {
                        filename = "picture" + (++count).ToString();
                    }
                    shape.Select();
                    Selection sel = app.Selection;
                    sel.CopyAsPicture();
                    Image image = Clipboard.GetImage();
                    if (image != null)
                    {
                        MemoryStream stream = new MemoryStream();
                        image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
                        byte[] buffer = stream.ToArray();
                        string base64 = Convert.ToBase64String(buffer);
                        Console.WriteLine("Picture {0}:\r\n{1}\r\n", count, base64);
                    }
                }
            }

            if (doc != null)
            {
                doc.Close();
                doc = null;
            }
            if (app != null)
            {
                app.Quit();
                app = null;
            }
        }
    }
}

上述代码中,我们使用MemoryStream对象将图片转换为二进制数据,并使用Convert.ToBase64String方法将其编码为Base64字符串。最后,我们将得到的Base64字符串输出到控制台中。

注意:这里我们仅使用了部分代码,如果要完整运行代码,请将其放入适当的类中,并添加必要的命名空间。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何使用C#从word文档中提取图片 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • Docker容器运行ASP.NET Core的实现步骤

    下面是Docker容器运行ASP.NET Core的实现步骤: 1. 环境搭建 首先需要在本机上安装Docker。可以在Docker官网上下载对应操作系统的安装包,安装完成后启动Docker服务,并在终端中输入以下命令检查是否安装成功: docker version 此外还需要安装.NET Core SDK,去官网上下载对应版本的SDK,安装完成后同样在终端…

    C# 2023年6月3日
    00
  • C#实现获取不同对象中名称相同属性的方法

    获取不同对象中名称相同属性的方法,可以通过反射实现。以下是C#实现该方法的步骤和示例说明: 步骤 步骤一:获取对象类型 使用GetType()方法获取对象的类型,返回Type类型的实例。 Type objectType = objectInstance.GetType(); 步骤二:获取属性信息 使用GetProperties()方法获取对象的所有属性,返回…

    C# 2023年5月31日
    00
  • 关于C#调用C++dll传指针释放内存问题

    C# 调用 C++ DLL 传递指针并释放内存,需要注意以下事项: 1.确保 C++ DLL 使用标准的导出和导入约定,以免在调用时出现问题。 2.在 C++ DLL 中,应声明一个专用于释放内存的函数。 3.在 C# 中,需要使用 Marshaling 手动管理内存。 以下是一些实践指南: 声明函数接口 需要在 C# 中与 C++ DLL 中的函数的名称、…

    C# 2023年5月15日
    00
  • C#如何自动选择出系统中最合适的IP地址

    为了选择系统中最合适的IP地址,我们可以使用C#编写程序使用以下步骤: 获取所有可用的网络接口信息 在C#中,我们可以使用NetworkInterface.GetAllNetworkInterfaces()方法获取当前系统中所有的网络接口信息,该方法会返回一个NetworkInterface类型的数组。 以下是一个获取网络接口信息的示例代码: using S…

    C# 2023年6月7日
    00
  • 使用EF Code First搭建简易ASP.NET MVC网站并允许数据库迁移

    以下是使用EF Code First搭建简易ASP.NET MVC网站并允许数据库迁移的完整攻略: 什么是EF Code First Entity Framework Code First是一种ORM(对象关系映射)框架,它允许开发人员使用.NET对象来定义数据库模型,而不是使用XML或其他配置文件。使用Code First,开发人员可以更轻松地创建和维护数…

    C# 2023年5月12日
    00
  • ajax的定时调用每5秒调用一次

    要实现ajax的定时调用每5秒调用一次,我们可以使用JavaScript中的setInterval函数。本文将提供详细的“ajax的定时调用每5秒调用一次”的完整攻略,包括如何使用setInterval函数、如何发送ajax请求以及两个示例。 使用setInterval函数 setInterval函数是JavaScript中的一个定时器函数,可以按照指定的时…

    C# 2023年5月15日
    00
  • C#实现分治算法求解股票问题

    C#实现分治算法求解股票问题攻略 简介 本文将介绍如何使用C#语言实现分治算法求解股票问题。 股票问题是一道经典的算法问题,在股票市场中,假设你只能进行一次买卖(即买卖一支股票),请你设计一个算法,找出最大的收益。其中股票当天的价格列表作为输入。例如,给定价格为[7,1,5,3,6,4]的股票价格列表,则通过一次买卖可以获得的最大收益为5。 分治算法是一种将…

    C# 2023年6月8日
    00
  • C# DataGridView添加新行的2个方法

    下面是详细讲解“C# DataGridView添加新行的2个方法”的完整攻略: 1. 使用数据绑定添加新行 使用DataGridView进行数据绑定时,可以通过添加数据源中的新数据来添加新行。下面是添加新行的步骤: 步骤 1:创建数据源 首先,我们需要创建一个数据源。下面是一个示例: var dataSource = new List<Product&…

    C# 2023年6月6日
    00
合作推广
合作推广
分享本页
返回顶部