1

我正在尝试将 ppt 文件上的幻灯片转换为 PNG 文件,但我的代码有问题。

在本地测试中,脚本停留在这一行:

$ppApp = new COM("PowerPoint.Application") or die ("Unable to instantiate PowerPoint");

然后显示"Maximum execution time of 30 seconds exceeded";

当我在我的实时服务器上运行时,脚本第一次工作,但随后出现错误

“致命错误:未捕获的异常‘异常’,消息‘无法关闭 ppt 文件 1251.pptx。’

我在 Windows 服务器上,我认为我使用 ppt 进程的方式有问题。

这是代码:

$ppApp = new COM("PowerPoint.Application") or die ("Unable to instantiate PowerPoint");
    $ppApp->Visible = True;
    $strPath = realpath(basename(getenv($_SERVER["SCRIPT_NAME"])));
    $ppName = $jobQuery['id'].".pptx";
    $FileName = "MyPP";

    //*** Open Document ***//
    $ppApp->Presentations->Open(realpath($ppName));

    //*** Save Document ***//
    $p_opned =  $ppApp->ActivePresentation->SaveAs($strPath."/".$jobQuery['id']."_".$FileName,18);
    //$ppApp->ActivePresentation->SaveAs(realpath($FileName),17);
    $ppApp->Quit();
    $ppApp = NULL;
    unset($ppApp); 

谢谢您的帮助。

4

1 回答 1

0

我认为您的问题可能与您的保存位置有关,或者只是找不到您的文件,您确定您尝试保存的位置实际上存在于您的代码中吗?我不太确定?

$strPath = realpath(basename(getenv($_SERVER["SCRIPT_NAME"])));

应该:

$strPath = realpath(dirname(__FILE__));

您确定此文件实际存在于以下位置:

$ppName = $jobQuery['id'].".pptx";

检查它:

file_exists($ppName)

在这里寻找类似的问题:Fatal Error in convert PPT to PNG in PHP

编辑:

试试下面的,我认为你的 $p_opned 保持对你的 $ppApp 对象的引用是开放的,因此你的实例没有被正确删除。

//*** Save Document ***//
$ppApp->ActivePresentation->SaveAs($strPath."/".$jobQuery['id']."_".$FileName,18);

编辑2:

根据要求尝试包装您认为导致异常的行(因此假设它是这一行):

try {
  //*** Save Document ***//
  $ppApp->ActivePresentation->SaveAs($strPath."/".$jobQuery['id']."_".$FileName,18);
} catch (Exception $e) {
    echo 'Exception message: ',  $e->getMessage(), "\n";
}

虽然再次查看您的错误消息,但它指的是您尝试打开的原始文件(1251.pptx),因为您尝试使用不同的后期修复(代码中未提及)保存文件。

如果上述方法不起作用,您可以尝试将 Exception try / catch 包装在“打开”脚本行周围,或者您可以尝试在退出之前添加:

$ppApp->ActivePresentation->Close();

如果您的错误是因为 Powerpoint 在第一个实例调用后仍然挂起,那一定是因为您在某处仍然有一个活动的引用,所以请尝试检查您的所有代码。如果您仍然收到错误,您应该在您的问题中包含完整的错误消息并从您的问题中删除 Max execution 错误消息这实际上不是问题(我假设您仍然没有得到“超过 30 秒的最大执行时间“消息了吗?)。

最后,您可以随时尝试 PowerPoint 库:

http://phppowerpoint.codeplex.com/

于 2012-06-15T15:50:16.637 回答