使用C#将Word文件页面转换为jpg图像

5

我该如何将Word文档中的页面转换成特定的图片?

我使用以下代码将其转换为.tiff格式的图片:

object varMissing = Type.Missing;

object varFalseValue = false;
object varTrueValue = true;

Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();
word.ActivePrinter = "Microsoft XPS Document Writer";
object fileName = startupPath + "\\" + filename1;
object falseValue = false;
object trueValue = true;
object missing = Type.Missing;
word.Visible = true;
word.Activate();
Document doc = word.Documents.Open(ref fileName, ref missing,
                    ref falseValue, ref missing, ref missing, ref missing,
                    ref missing, ref missing, ref missing, ref missing,
                    ref missing, ref missing, ref missing, ref missing,
                    ref missing, ref missing);
doc.Activate();

object PrintToFile = true;
object OutputFileName = startupPath + "\\" + filename1.Split('.')[0] + ".tif";

doc.PrintOut(ref varMissing, ref varFalseValue, ref varMissing, 
             ref OutputFileName, ref varMissing, ref varMissing, ref varMissing,
             ref varMissing, ref varMissing, ref varMissing, ref PrintToFile, 
             ref varMissing, ref varMissing, ref varMissing, ref varMissing, 
             ref varMissing, ref varMissing, ref varMissing);

doc.Close(ref varMissing, ref varMissing, ref varMissing);
word.Quit(ref varMissing, ref varMissing, ref varMissing);

//Multi to Single
MemoryStream ms;
Image myImage;

FileStream fs = new FileStream(startupPath + "\\" + filename1.Split('.')[0] + ".tif", FileMode.Open);
fs.Seek(0, SeekOrigin.Begin);

//Here I am getting error....
myImage = Image.FromStream(fs, true, false);

Guid myGuid = myImage.FrameDimensionsList[0];
FrameDimension myDimension = new FrameDimension(myGuid);
int myPageCount = myImage.GetFrameCount(myDimension);

for (int i = 0; i < myPageCount; i++)
{
      ms = new MemoryStream();
      myImage.SelectActiveFrame(myDimension, i);
      myImage.Save(string.Format(startupPath + "\\" + filename1.Split('.')[0] + ".tif", i), ImageFormat.Tiff);
}

fs.Close();

但是当我尝试将文件流转换为图像时,会出现错误,例如:
Parameter is not valid.

有没有其他的方法将word文件转换为图片文件?但我不能使用市场上出售的dll,我需要使用Microsoft的核心Interop dll。因此,请问是否有人可以建议我将.doc文件转换为.jpg的链接或方法。


当我将FileStream对象fs转换为Image对象myImage时。 - Rahul Gokani
感谢您的赞扬,先生。我从其他网站找到了那段代码。我看到大多数帖子都使用了我应用的相同代码。我的参考链接是https://groups.google.com/forum/#!topic/microsoft.public.word.conversions/HELHX-iXMsE。那么,您能告诉我如何将doc文件转换为图像文件吗? - Rahul Gokani
先生,还有一件事,就是在我的代码中将文件流转换为图像之前,我放了一些代码来创建 .tif 文件。因此,在该流中,我获取的是 .tif 文件流,而不是任意流。 - Rahul Gokani
我的错。我无法或不愿意按照你的代码逻辑来看,你首先生成了一个.tif文件。建议:你加载的.tif文件是否与将Word文档打印成文件有关,这是否甚至是相关的?你的“转换为图像”的代码是否适用于任何其他类型的.tif文件,或者问题仅出现在从“打印到文件”产生的.tif文件上?如果你将其他类型的文档打印成.tif文件,它是否有效? - John Saunders
逻辑对所有文档都报错。我还没有尝试使用我的逻辑来转换其他已创建或工作的tiff文件。但是在某些链接中,我发现当流不是正确格式时,逻辑会给出这种错误。因此,每当我转换此tif文件时,它似乎不是正确的格式。 - Rahul Gokani
显示剩余4条评论
2个回答

13

您可以使用以下代码将Doc文件转换为图像,这对我有效。

var docPath = Path.Combine(startupPath, filename1);
var app = new Microsoft.Office.Interop.Word.Application();

MessageFilter.Register();

app.Visible = true;

var doc = app.Documents.Open(docPath);

doc.ShowGrammaticalErrors = false;
doc.ShowRevisions = false;
doc.ShowSpellingErrors = false;

if (!Directory.Exists(startupPath + "\\" + filename1.Split('.')[0]))
{
     Directory.CreateDirectory(startupPath + "\\" + filename1.Split('.')[0]);
}

//Opens the word document and fetch each page and converts to image
foreach (Microsoft.Office.Interop.Word.Window window in doc.Windows)
{
      foreach (Microsoft.Office.Interop.Word.Pane pane in window.Panes)
      {
            for (var i = 1; i <= pane.Pages.Count; i++)
            {
                 var page = pane.Pages[i];
                 var bits = page.EnhMetaFileBits;
                 var target = Path.Combine(startupPath + "\\" + filename1.Split('.')[0], string.Format("{1}_page_{0}", i, filename1.Split('.')[0]));

                 try
                 {
                     using (var ms = new MemoryStream((byte[])(bits)))
                     {
                          var image = System.Drawing.Image.FromStream(ms);
                          var pngTarget = Path.ChangeExtension(target, "png");
                          image.Save(pngTarget, ImageFormat.Png);
                     }
                 }
                 catch (System.Exception ex)
                 { }
         }
    }
}
doc.Close(Type.Missing, Type.Missing, Type.Missing);
app.Quit(Type.Missing, Type.Missing, Type.Missing);
MessageFilter.Revoke();

当我将文档转换为图像时,出现以下错误:集合的请求成员不存在。 说明:当前 Web 请求执行期间发生了一个未经处理的异常。请查看堆栈跟踪以获取有关错误的更多信息以及其在代码中的来源。异常详细信息:System.Runtime.InteropServices.COMException:集合的请求成员不存在。 - Sagar Rawal
如何将所有图像合并为一个文件? - Kumar Gaurav
不是很有用,通常会像上面提到的那样抛出错误。最好使用打印机或第三方组件。 - MRP
生成的图像太大,缩小也无法产生良好的质量,请给予建议。 - Wessam El Mahdy
在调用Register和Revoke方法时,我遇到了错误。它们在哪个DLL文件中可以找到?谢谢。 - shahar eldad

3

我认为我已经找到了@WarLock提供的代码中的错误。我更改了其中的一些部分,并且只使用了一个文件:

Microsoft.Office.Interop.Word.Application myWordApp = new Microsoft.Office.Interop.Word.Application();
Document myWordDoc = new Document();
object missing = System.Type.Missing;
object path1= path + filename + ".doc";
myWordDoc = myWordApp.Documents.Add(path1, missing, missing, missing);

foreach (Microsoft.Office.Interop.Word.Window window in myWordDoc.Windows)
{
    foreach (Microsoft.Office.Interop.Word.Pane pane in window.Panes)
    {
        for (var i = 1; i <= pane.Pages.Count; i++)
        {
            var bits = pane.Pages[i].EnhMetaFileBits;
            var target =path1 + "_image.doc";
            try
            {
                using (var ms = new MemoryStream((byte[])(bits)))
                {
                    var image = System.Drawing.Image.FromStream(ms);
                    var pngTarget = Path.ChangeExtension(target, "png");
                    image.Save(pngTarget, System.Drawing.Imaging.ImageFormat.Png);
                }
            }
            catch (System.Exception ex)
            { }
        }
    }
}
myWordDoc.Close(Type.Missing, Type.Missing, Type.Missing);
myWordApp.Quit(Type.Missing, Type.Missing, Type.Missing);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接