将图片从word保存到文件夹C#

将图片从word保存到文件夹C#,c#,ms-word,image,C#,Ms Word,Image,所以我想出了如何用文字替换word中的图片 但现在我需要将图片从word导出到文件夹。我猜每当我发现一张图片是一个对象(类型s=Microsoft.Office.Interop.Word.WdInlineShapeType.wdInlineShapePicture),我都应该对它做些什么。。。但是我找不到选项:s.saveAsPicture(@“C:\pic.jpg”) 您的问题可能与以下问题重复: 但是,根据您关于如何以编程方式将外部图像与Word中的内联形状进行比较的问题(请参阅),您可以进

所以我想出了如何用文字替换word中的图片


但现在我需要将图片从word导出到文件夹。我猜每当我发现一张图片是一个对象(类型s=Microsoft.Office.Interop.Word.WdInlineShapeType.wdInlineShapePicture),我都应该对它做些什么。。。但是我找不到选项:s.saveAsPicture(@“C:\pic.jpg”)

您的问题可能与以下问题重复:

但是,根据您关于如何以编程方式将外部图像与Word中的内联形状进行比较的问题(请参阅),您可以进行一些简单的调整,并使用几乎完全相同的示例代码将每个内联形状导出到文件夹中,而不是将形状与另一个图像进行比较

为了说明这一点,我为您做了必要的调整,并提供了下面的源代码。同样,该应用程序是一个基于.NET 4.5、Microsoft Office对象库版本15.0和Microsoft Word对象库版本15.0的C#控制台应用程序

和以前一样,我在源代码中包含了引用,这样您就可以看到我的解决方案基于哪些源代码(并且这些源代码得到了它们应得的信任;)

使用系统;
使用系统图;
使用系统线程;
使用System.Windows.Forms;
使用Application=Microsoft.Office.Interop.Word.Application;
名称空间WordDocStats
{
班级计划
{
//总体思路基于:https://stackoverflow.com/a/7937590/700926
静态void Main()
{
//打开文档文件
var wordApplication=新应用程序();
var document=wordApplication.Documents.Open(@“C:\Users\Username\Documents\Documents.docx”);
//对于每个内联形状,将其导出到文件
//通过检查,您可以看到第一个内联形状具有索引1(而不是预期的零)
对于(var i=1;我保存inlineshapetofile(inlineShapeId,wordApplication));
//需要STA才能访问剪贴板
// https://stackoverflow.com/a/518724/700926
SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
}
//结束语
wordApplication.Quit();
Console.ReadLine();
}
//总体思路基于:https://stackoverflow.com/a/7937590/700926
受保护的静态无效SaveInlineShapeToFile(int inlineShapeId,Application wordApplication)
{
//获取形状,选择并将其复制到剪贴板
var inlineShape=wordApplication.ActiveDocument.InlineShapes[inlineShapeId];
inlineShape.Select();
wordApplication.Selection.Copy();
//检查数据是否在剪贴板中
if(剪贴板.GetDataObject()!=null)
{
var data=Clipboard.GetDataObject();
//检查数据是否符合位图格式
if(data!=null&&data.GetDataPresent(DataFormats.Bitmap))
{
//获取图像并将其转换为位图
var image=(image)data.GetData(DataFormats.Bitmap,true);
var currentBitmap=新位图(图像);
//将位图保存到文件中
currentBitmap.Save(@“C:\Users\Username\Documents\”+String.Format(“img{0}.png”,inlineShapeId));
}
}
}
}
}

您的问题可能与以下问题重复:

但是,根据您关于如何以编程方式将外部图像与Word中的内联形状进行比较的问题(请参阅),您可以进行一些简单的调整,并使用几乎完全相同的示例代码将每个内联形状导出到文件夹中,而不是将形状与另一个图像进行比较

为了说明这一点,我为您做了必要的调整,并提供了下面的源代码。同样,该应用程序是一个基于.NET 4.5、Microsoft Office对象库版本15.0和Microsoft Word对象库版本15.0的C#控制台应用程序

和以前一样,我在源代码中包含了引用,这样您就可以看到我的解决方案基于哪些源代码(并且这些源代码得到了它们应得的信任;)

使用系统;
使用系统图;
使用系统线程;
使用System.Windows.Forms;
使用Application=Microsoft.Office.Interop.Word.Application;
名称空间WordDocStats
{
班级计划
{
//总体思路基于:https://stackoverflow.com/a/7937590/700926
静态void Main()
{
//打开文档文件
var wordApplication=新应用程序();
var document=wordApplication.Documents.Open(@“C:\Users\Username\Documents\Documents.docx”);
//对于每个内联形状,将其导出到文件
//通过检查,您可以看到第一个内联形状具有索引1(而不是预期的零)
对于(var i=1;我保存inlineshapetofile(inlineShapeId,wordApplication));
//需要STA才能访问剪贴板
// https://stackoverflow.com/a/518724/700926
SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
}
//结束语
wordApplication.Quit();
Console.ReadLine();
}
//总体思路基于:https://stackoverflow.com/a/7937590/700926
受保护的静态无效SaveInlineShapeToFile(int inlineShapeId,Application wordApplication)
{
//获取形状,选择并将其复制到剪贴板
var inlineShape=wordApplication.ActiveDocument.InlineShapes[inlineShapeId];
inlineShape.Select();
wordApplication.Selection.Copy();
using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
using Application = Microsoft.Office.Interop.Word.Application;

namespace WordDocStats
{
    class Program
    {
        // General idea is based on: https://stackoverflow.com/a/7937590/700926
        static void Main()
        {
            // Open a doc file
            var wordApplication = new Application();
            var document = wordApplication.Documents.Open(@"C:\Users\Username\Documents\document.docx");

            // For each inline shape, export it to a file
            // By inspection you can see that the first inline shape have index 1 ( and not zero as one might expect )
            for (var i = 1; i <= wordApplication.ActiveDocument.InlineShapes.Count; i++)
            {
                // closure
                // http://confluence.jetbrains.net/display/ReSharper/Access+to+modified+closure
                var inlineShapeId = i; 

                // parameterized thread start
                // https://stackoverflow.com/a/1195915/700926
                var thread = new Thread(() => SaveInlineShapeToFile(inlineShapeId, wordApplication));

                // STA is needed in order to access the clipboard
                // https://stackoverflow.com/a/518724/700926
                thread.SetApartmentState(ApartmentState.STA);
                thread.Start();
                thread.Join();
            }

            // Close word
            wordApplication.Quit();
            Console.ReadLine();
        }

        // General idea is based on: https://stackoverflow.com/a/7937590/700926
        protected static void SaveInlineShapeToFile(int inlineShapeId, Application wordApplication)
        {
            // Get the shape, select, and copy it to the clipboard
            var inlineShape = wordApplication.ActiveDocument.InlineShapes[inlineShapeId];
            inlineShape.Select();
            wordApplication.Selection.Copy();

            // Check data is in the clipboard
            if (Clipboard.GetDataObject() != null)
            {
                var data = Clipboard.GetDataObject();

                // Check if the data conforms to a bitmap format
                if (data != null && data.GetDataPresent(DataFormats.Bitmap))
                {
                    // Fetch the image and convert it to a Bitmap
                    var image = (Image) data.GetData(DataFormats.Bitmap, true);
                    var currentBitmap = new Bitmap(image);

                    // Save the bitmap to a file
                    currentBitmap.Save(@"C:\Users\Username\Documents\" + String.Format("img_{0}.png", inlineShapeId));
                }
            }
        }
    }
}