4

我想打开一个 docx 文件,然后使用 Microsoft.Office.Interop.Word 包将其转换为 asp.net 中的 pdf 文件。

这是我用asp按钮单击事件编写的代码:

object fileFormat = Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatPDF;
                        Object missing = Type.Missing;
                        object saveName = strURL.Replace(".docx", ".pdf");
                        object openName = docPath + "\\T4.docx";

                    Microsoft.Office.Interop.Word.Application wdApp = new Microsoft.Office.Interop.Word.Application();
                    Microsoft.Office.Interop.Word.Document doc = wdApp.Documents.Open(openName,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing);
doc.SaveAs(saveName,fileFormat,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing);
 doc.Close(ref missing, ref missing, ref missing);

但是在执行时它在wdApp.Documents.Open()行上有一些麻烦。

浏览器符号似乎总是在加载。

我不知道这个错误的原因是什么。

4

2 回答 2

2

Microsoft 不支持在服务器环境中自动化 Office 应用程序,此知识库文章解释了如果您尝试它可能会出现的一些潜在问题。

我建议您寻找第三方组件,例如 Aspose。

于 2012-11-22T20:04:27.803 回答
2

当 Word 试图向用户显示对话框时,可能会发生这种情况。互操作不够聪明,无法抑制所有这些对话框。尝试以下操作:

1) 登录服务器并手动打开 MS Word。可能有某种对话框需要用户确认(例如第一次运行 Word 时显示的许可对话框)。一旦您手动通过这些对话框,它们将不再是互操作的问题。(也可以尝试打开其中一份文件。也许问题出在文件本身上。)

2) 在您的代码中尽可能多地抑制对话框。我知道 2 个这样的地方(DisplayAlerts 和 NoEncodingDialog)。

var word = new Word.Application();
word.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone;

Word.Documents documents = word.Documents;
documents.Open(openName, NoEncodingDialog: true);

附带说明,但非常重要:为了避免内存泄漏,您需要非常小心如何引用和处置这些 COM 对象。遵循此答案中的建议。如果这样做,您可能会成功地使用与 ASP.NET 的互操作。(多年来,我有一台服务器正在做你想做的事——使用 Word 互操作将 .docx 转换为 .pdf——即使在重负载下它也能正常工作,但这只是因为我正确处理了每一个COM 对象引用。)

于 2012-11-29T18:07:17.730 回答