У меня есть веб-приложение 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 Без названия, MsoTriState
WithWindow) в PPTImageExtractor.PptConversor.ExtractImages (String
caminhoPpt, String caminhoDestino, Int32 largura, Int32 altura, String
caminhoThumbs, Int32 larguraThumb, Int32 alturaThumb, Boolean geraXml)
в Upload.ProcessRequest (контекст HttpContext)
Процесс запущен с пользователем NT AUTHORITY \ NETWORK SERVICE. IIS настроен на использование анонимной аутентификации. Анонимный пользователь - администратор, я настроил его так, чтобы приложение могло запускаться, не беспокоясь о разрешениях.
В моей машине для разработки у меня Office 2010 бета1. Я также проверил исполняемый файл на компьютере с Office 2007. И если я запускаю код из исполняемого файла на сервере с установленным офисом 2003, он работает отлично.
Чтобы не было никаких проблем с разрешениями, каждый на сервере имеет полный доступ к веб-сайту. Сайт работает в IIS7 и в классическом режиме.
Я также слышал, что у Open-office есть API, который должен это делать, но я ничего не мог найти по этому поводу. Я не возражаю против использования DLLImport для выполнения своих задач, и я могу установить open-office на веб-сервере. Не беспокойтесь о переписывании этого метода, пока параметры одинаковы, все будет работать.
Я ценю вашу помощь.