1

我有一段代码可以读取 powerpoint 幻灯片并为它们创建 xml。在我的本地机器上一切正常。但是在服务器上,当读取第二张幻灯片时。我得到了异常: 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);
        }
    }

有帮助吗??

4

3 回答 3

0

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

我会把它拉到它自己的变量中,然后在你的 for 循环中使用这个变量,如下所示:

var slideCount = presentation.Slides.Count;

for (int i = 0; i < slideCount; i++)
{
    //etc etc
于 2013-07-08T08:59:12.653 回答
0

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

 PowerPoint_App.DisplayAlerts = Powerpoint.PpAlertLevel.ppAlertsNone

当 Office 打开对话并且您的应用程序无法继续时,您通常会收到此异常。

于 2013-07-08T08:36:08.277 回答
0

引用你的问题:

在我的本地机器上一切正常。但是在服务器上,当第二张幻灯片被读取时。我得到了例外

如果您的应用真正在无人值守的服务器环境中运行,请注意 Microsoft 明确不支持COM for Office。他们的警告相当明确。这是一个片段:

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

于 2017-01-14T11:45:47.077 回答