【问题标题】:Convert Word file pages to jpg images using C#使用 C# 将 Word 文件页面转换为 jpg 图像
【发布时间】:2013-12-18 01:17:26
【问题描述】:

如何将 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's core interop dll. 所以请任何人都可以建议我将.doc文件转换为.jpg的链接或方法。

【问题讨论】:

  • 您的错误出现在哪一行?
  • 当我将 FileSram 对象 fs 转换为 Image 对象 myImage 时。
  • 开个玩笑。 Image.FromStream 用于将包含图像的流转换为内存中的图像。它不会将任何任意流转换为图像!
  • 谢谢先生的补充。我从其他网站找到了该代码。而且我看到的大多数帖子都使用了我应用的相同代码。我的参考链接是groups.google.com/forum/#!topic/…。那么你能告诉我如何将 doc 文件转换为图像文件。
  • 先生,另一件事是,在我的代码中将文件流转换为图像之前,我已经放置了一些创建 .tif 文件的代码。所以在那个流中我得到了 .tif 文件流。不是任意流。

标签: c# image ms-word


【解决方案1】:

您可以使用下面对我有用的代码将 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:请求的集合成员不存在。
  • 如何将所有图片合并到一个文件中?
  • 不是很有用,它通常会抛出上面提到的错误。最好使用打印机或第三方组件
  • 生成的图片太大,最小化效果不好,请指教。
  • 我在调用方法 Register & Revoke 时遇到错误。在哪个 DLL 文件中可以找到它们?谢谢
【解决方案2】:

我想我在@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);

【讨论】:

    猜你喜欢
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-22
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 2013-10-16
    相关资源
    最近更新 更多