阅读幻灯片时powerpoint Interop出现异常

本文关键字:异常 Interop powerpoint 幻灯片 | 更新日期: 2023-09-27 18:21:21

我有一块代码,可以读取powerpoint幻灯片并为它们创建xml。在我的本地机器上一切都很好。但在服务器上,当读到第二张幻灯片时。I获得异常:EXCEPTION:The message filter indicated that the application is busy. (Exception from HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER)) for Powerpoint Interop

函数抛出错误:

public string AddPPTPages(long templateid, long pptFileId)
    {
        string strPptFilePath = "";
        string strSuccess = "";
        using (var dc = new DataContext())
        {
            var template = dc.Templates.GetByID(templateid);
            template.ExtendedData = "<template><pptfileid>" + pptFileId + "</pptfileid></template>";
            template.Save();
            dc.SubmitChanges();
            var file = dc.FileHandles.GetByID(Convert.ToInt64(pptFileId));
            file.EnsureUrlFiles();
            strPptFilePath = file.GetPhysicalPath(file.FileName);//get path of original ppt file 
        }
        try
        {
            using (new Impersonator(Installs.Current.PPTUser, null, Installs.Current.PPTPassword))
            {
                PowerPoint.Application PowerPoint_App = new PowerPoint.Application();//Open PowerPoint app/process
                PowerPoint.Presentation presentation = null;//initialize presentation to null
                try
                {
                    PowerPoint_App.Visible = MsoTriState.msoTrue;//set app visibility to true
                    presentation = PowerPoint_App.Presentations.Open(strPptFilePath, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoTrue);//open powerpoint presentation using path strPptFilePath
                    templateID = templateid;//required for readslide function
    /////////ERROR is THROWN FOR BELOW LINE//////////////////
                    for (int i = 0; i < presentation.Slides.Count; i++)
                    {
                        ReadSlides(presentation, i);//call to read current slide
                    }
                    using (var dc = new DataContext())
                    {
                        var template = dc.Templates.GetByID(templateID);
                        template.FixPageIndexes();
                        template.Save();
                        dc.SubmitChanges();
                    }
                    presentation.Close();//close presentation
                    PowerPoint_App.Quit();//quit opened powerpoint app/process
                }
                catch (Exception ex)
                {
                    strSuccess = ex.ToString();
                }
                finally
                {
                    while (Marshal.FinalReleaseComObject(presentation) != 0) { }
                    presentation = null;
                    while (Marshal.FinalReleaseComObject(PowerPoint_App) != 0) { }
                    PowerPoint_App = null;
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                    KillPPTProcess();//find ppt process in taskmanager and kill it
                }
            }
        }
        catch (Exception e)
        {
            strSuccess = e.ToString();
            MindMatrix.Libraries.Entities.ExceptionMessage.HandleException(e, null);
            Loggers.HandleException2(e);
        }
        return strSuccess;
    }
private void ReadSlides(PowerPoint.Presentation presentation, int i)
    {
        try
        {
            string strPptXml = "";
            //get number of objects(text and image) present in current slide
            foreach (var item in presentation.Slides[i + 1].Shapes)
            {
                var shape = (PowerPoint.Shape)item;
                strPptXml += ReadShape(shape);//read object and add it to xml
            }
            int height = ConvertToPixel(presentation.Slides[i + 1].Master.Height);//get height of current slide
            int width = ConvertToPixel(presentation.Slides[i + 1].Master.Width);//get width of current slide
            strFileImage = Installs.Current.GetTempDirectory(DirectoryType.PPT);//get the temporary folder path for current loggedin user in machine
            if (System.IO.Directory.Exists(strFileImage) == false)
            {
                System.IO.Directory.CreateDirectory(strFileImage);
            }
            strFileImage = strFileImage + "''" + (i + 1) + ".png";//create image path for slide snapshot
            presentation.Slides[i + 1].Export(strFileImage, "png", width, height);//create snapshot as png image to temp folder
            strPptXml = "<slides datasourceid='0' repeaterid = '0' id='" + presentation.Slides[i + 1].SlideID + "' >" + strPptXml + "</slides>";//create slide xml using slideid and ppt xml(contains text and image objects of slide)
            MemoryStream ms = new MemoryStream();
            System.Drawing.Image imageIn;
            imageIn = System.Drawing.Image.FromFile(strFileImage);//Creates an Image from location strFileImage.
            imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            using (var dc = new DataContext())
            {
                var template = dc.Templates.GetByID(templateID);
                //template.createPptPage(strPptXml, height, width, ms);//call to create ppt page for current slide
                template.createPptPage(RemoveTroublesomeCharacters(strPptXml), height, width, ms);//call to create ppt page for current slide
                dc.SubmitChanges();
            }
        }
        catch (Exception e)
        {
            Loggers.HandleException2(e);
        }
    }

有人帮忙吗??

阅读幻灯片时powerpoint Interop出现异常

我的猜测是ReadSlides正在更改演示文稿的值。Slides.Count。如果您在ReadSlides中向演示文稿添加幻灯片或从演示文稿中删除幻灯片,就会发生这种情况。

我会把它拉到它自己的变量中,然后在for循环中使用这个变量,就像这样:

var slideCount = presentation.Slides.Count;
for (int i = 0; i < slideCount; i++)
{
    //etc etc

您是否尝试将DisplayAlert设置为false?

 PowerPoint_App.DisplayAlerts = Powerpoint.PpAlertLevel.ppAlertsNone

当Office打开对话框,而您的应用程序无法继续时,通常会出现此异常。

引用您的问题:

在我的本地计算机上一切正常。但在服务器上,当读取第二张幻灯片时。I获取异常

如果您的应用程序确实在无人参与的服务器环境中运行,请注意,Microsoft专门支持COM for Office。他们的警告相当明确。这里有一个片段:

如果使用服务器端解决方案中的Office应用程序,则该应用程序将缺乏成功运行所需的许多功能。此外,您将在整体解决方案的稳定性方面承担风险。