У меня есть веб-приложение ASP.NET 2.0, которое должно загрузить файл ppt, а затем извлечь его слайды в изображения. Для этого я импортировал сборки office.dll и Microsoft.Office.Interop.PowerPoint.dll и написал следующий код
public static int ExtractImages(string ppt, string targetPath, int width, int height)
{
var pptApplication = new ApplicationClass();
var pptPresentation = pptApplication.Presentations.Open(ppt, MsoTriState.msoTrue, MsoTriState.msoFalse, MsoTriState.msoFalse);
var slides = new List<string>();
for (var i = 1; i <= pptPresentation.Slides.Count; i++)
{
var target = string.Format(targetPath, i);
pptPresentation.Slides[i].Export(target, "jpg", width, height);
slides.Add(new FileInfo(target).Name);
}
pptPresentation.Close();
return slides.Count;
}
Если я запускаю этот код на своем локальном компьютере, в asp.net или в исполняемом файле, он работает отлично. Но если я попытаюсь запустить его на производственном сервере, я получу следующую ошибку:
System.Runtime.InteropServices.COMException (0x80004005): PowerPoint не удалось открыть файл. в Microsoft.Office.Interop.PowerPoint.Presentations.Open (String FileName, MsoTriState ReadOnly, MsoTriState Untitled, MsoTriState WithWindow) в PPTImageExtractor.PptConversor.ExtractImages (String caminhoPpt, Intin32 larguum, String caminho32destrans, String caminho32 larry, int Int32 alturaThumb, Boolean geraXml) в Upload.ProcessRequest (контекст HttpContext)
Процесс запущен с пользователем NT AUTHORITY \ NETWORK SERVICE. IIS настроен на использование анонимной проверки подлинности. Анонимный пользователь является администратором, я установил его так, чтобы приложение могло работать, не беспокоясь о разрешениях.
На моей машине разработки у меня есть Office 2010 beta1. Я также тестировал исполняемый файл на компьютере с Office 2007. И если я запускаю код из исполняемого файла на сервере с установленным Office 2003, он работает отлично.
Чтобы гарантировать отсутствие проблем с разрешениями, каждый на сервере имеет полный доступ к веб-сайту. Веб-сайт работает в IIS7 и классическом режиме.
Я также слышал, что у Open-office есть API, который должен это делать, но я ничего не нашел об этом. Я не против использования DLLImport, чтобы делать то, что мне нужно, и могу установить open-office на веб-сервере. Не беспокойтесь о том, чтобы переписать этот метод, пока параметры остаются такими же, все будет работать.
Я ценю вашу помощь.