【发布时间】:2019-02-21 15:36:43
【问题描述】:
处理来自 PPTX 扩展程序的文本非常有效,但如果 PPSX 位于相同的 URL(相同的服务器和权限)上,则代码会引发 code:9 错误 (ER_NOENT)。有人可以帮助确定为什么 PPTX 和 PPSX 的处理方式不同,尽管它们都是相同的 openXML 标准?如何从 PPSX 文件中提取文本?
mime-type 供参考:application/vnd.openxmlformats-officedocument.presentationml.slideshow
<?php
if(isset($_POST['processFile']) && isset($_FILES["file"]["tmp_name"]))
{
$fileText = ppsx_to_text($_FILES["file"]["tmp_name"]);
}
function ppsx_to_text( $path_to_file )
{
$zip_handle = new ZipArchive();
$response = '';
if (true === $zip_handle->open($path_to_file)) // <-- fails to open / recognize PPSX as zip***
{
$slide_number = 1; //loop through slide files
$doc = new DOMDocument();
while (($xml_index = $zip_handle->locateName('ppt/slides/slide' . $slide_number . '.xml')) !== false)
{
$xml_data = $zip_handle->getFromIndex($xml_index);
$doc->loadXML($xml_data, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
$response .= strip_tags($doc->saveXML());
$slide_number++;
}
$zip_handle->close();
}
return $response;
}
?>
<form id="content_form" class="the_form" action="" method="post" enctype="multipart/form-data">
<label for="file">Choose file to upload</label>
<input type="file" id="file" name="file">
<button type="submit" value="processFile" name="processFile">Process</button>
<div><?php echo $fileText;?></div>
</form>
【问题讨论】:
-
这不能从示例代码和描述中重现。文件功能正确的可能性很高,并且文件在给定位置不存在。
-
@mario,我正在开发一个专有系统,所以我无法在公共论坛中指向该站点上的文件。您可以通过实例化变量来测试代码: $path_to_file = "www.example.com/test.ppsx";并调用函数。我有一个个人网站,今晚可以上传。文件存在,因为我把它们放在那里。如果我将 URL 放在任何浏览器中都会下载,所以我知道这是一个很好的链接。
-
@mario,我说过我无法将您指向一个文件,它是专有的。再次阅读评论。无论如何。代码存在一些问题:首先,它需要在表单标签中使用 enctype="multipart/form-data"。之后,我仍然在文本提取中获得命中或未命中数据。像大多数人一样,我不控制我的托管服务器设置,因此对于“上传”的 DOCX 文件而不是 PPSX 文件来说可见性很好。为了解决可见性问题,我没有进行后处理,而是在内存中传递了 $_FILES["file"]["tmp_name"] 临时文件进行处理,现在它可以工作了。我希望这对其他人有帮助...
-
感谢 nickrouty 提供的基本代码:gist.github.com/nickrouty/6f5ed07e79d2223b279fc5e662264b10
标签: php powerpoint slideshow openxml ziparchive