Obtaining Image from ms-word gave me headache for a week. MS-Word contains two type of shapes: Shape and InlineShapes.
Shape refers to the objects inserted as object like Chemical Equations, Microsoft Equations, while inline shapes refer to images inserted, drawings etc. Following code provides an way to save both such files.
An updated version of the code will be republished later.
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Threading;
using System.Windows.Forms;
using MyProject.Common;
using Microsoft.Office.Interop.Word;
using Application = Microsoft.Office.Interop.Word.Application;
public class InteropOfficeHelper
{
public void Main(string filePath, int index, string savedFilePath, bool isInline)
{
// Open a doc file
var wordApplication = new Application();
var document = wordApplication.Documents.Open(filePath);
//if not inline and other shapes
if (!isInline)
{
if (index <= wordApplication.ActiveDocument.Shapes.Count)
{
var shapeId = index;
var thread = new Thread(() => SaveShapeToFile(shapeId, wordApplication, savedFilePath));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
}
}
//if inliine images
else
{
if (index <= wordApplication.ActiveDocument.InlineShapes.Count)
{
var shapeId = index;
var thread = new Thread(() => SaveInlineShapeToFile(shapeId, wordApplication, savedFilePath));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
}
}
// Close word
wordApplication.Quit();
}
protected static void SaveInlineShapeToFile(int inlineShapeId, Application wordApplication, string savedFilePath)
{
// 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(savedFilePath);
}
}
}
protected static void SaveShapeToFile(int shapeId, Application wordApplication, string savedFilePath)
{
// Get the shape, select, and copy it to the clipboard
var shape = wordApplication.ActiveDocument.Shapes[shapeId];
shape.Select();
wordApplication.Selection.Copy();
// Check data is in the clipboard
var data = Clipboard.GetDataObject();
if (data != null)
{
// Check if the data conforms to a bitmap format
if (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(savedFilePath);
}
else if (data.GetDataPresent(“PNG”))
{
var byteArray = StreamHelper.ReadToEnd((Stream)data.GetData(“PNG”));
using (var stream = new MemoryStream(byteArray))
{
using (var newImage = Image.FromStream(stream))
{
newImage.Save(savedFilePath, ImageFormat.Png);
}
}
}
else if (data.GetDataPresent(“GIF”))
{
var byteArray = StreamHelper.ReadToEnd((Stream)data.GetData(“GIF”));
using (var stream = new MemoryStream(byteArray))
{
using (var newImage = Image.FromStream(stream))
{
newImage.Save(savedFilePath, ImageFormat.Gif);
}
}
}
}
}
}