在PHP中读取Word文档

7

我现在正在做一个项目,但是在阅读Word文档时遇到了困难。

Word文件内容。

This is a test word file in PHP.

Thank you.

PHP 代码。

    $myFile = "wordfile.docx";
    $fh = fopen($myFile, 'r');
    $theData = fread($fh, 1000);
    fclose($fh);
    echo $theData;

输出:

PK!éQ°Â[Content_Types].xml ¢( ´”MOÂ@†ï&þ‡f¯¦]ð`Œ¡pP<*‰Ïëv
 «Ýì,_ÿÞiI¡(ziÒNß÷}fÚÞ`©‹h•5&6Sf’²×ñc|Ë"Âd¢°R¶dƒþåEo
 ¼r€© ¦l‚»ãå´ÀÄ:0TÉ­×"ЭŸp'䧘¿îtn¸´&€  q(=X¿÷¹˜!.éñ
 š„ä,º_¿WF¥L8W()ò²Êu <"œ›l.Þ%¤¬Ìqª^Nøp0ÙKPºl­*Õ3Ó
 «¢‘ðáIhbçë3žY9ÓÔwr¼¹F›çJB­/Ýœ·é;é"©+Z(³e?ÈaUþ=ÅÚ÷Ä
 ø7¦Ã<I?Hû<4ÆeÓÉ:bGÛž!ÐN    ùþÛÆmCÇs+ÂÞ_þbǼ$§ó4ïœ
 0ñ£¶n…´#€W×îٕͱH:#oÒÎñ¿h{»JuLGÎ êõÐtÄêDZXg÷åFÌ kÈæÕîÿÿPK
 !ÇÂ'¼ß_rel

有没有办法在PHP中读取Word文档?

可能是 https://dev59.com/GFrUa4cB1Zd3GeqPkX-I 的重复问题。 - user1432124
@Webtecher,我已经尝试过了,但是出现了这个错误:致命错误:找不到类'COM' - Othman
有一个非常好的资源可以阅读Word文档:https://dev59.com/SnVC5IYBdhLWcg3wxEN1。 - Brett
5个回答

17

使用此功能来处理docx文件

function read_docx($filename){

    $striped_content = '';
    $content = '';

    if(!$filename || !file_exists($filename)) return false;

    $zip = zip_open($filename);
    if (!$zip || is_numeric($zip)) return false;

    while ($zip_entry = zip_read($zip)) {

        if (zip_entry_open($zip, $zip_entry) == FALSE) continue;

        if (zip_entry_name($zip_entry) != "word/document.xml") continue;

        $content .= zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));

        zip_entry_close($zip_entry);
    }
    zip_close($zip);      
    $content = str_replace('</w:r></w:p></w:tc><w:tc>', " ", $content);
    $content = str_replace('</w:r></w:p>', "\r\n", $content);
    $striped_content = strip_tags($content);

    return $striped_content;
}

它将从docx返回文本


但是格式正在改变。如何保持相同的格式? - Rohan Gala
@RohanGala 它将读取docx Word文件并返回其内容。你能展示一下你得到的格式吗? - Sudhir
1
不显示空格和空行的格式,但文本正确获取。 - Rohan Gala
这个代码运行良好,但由于某些原因经常跳过前几行。 - dlofrodloh
strip_tags()函数将删除所有包含内联样式和/或类的XML;您需要以某种方式解释/应用这些内容,以恢复样式。 - jrgd
是的,这个很好用而且非常简单。从我所看到的来看,所有的文本都在那里。唯一有点麻烦的是嵌入了很多数字,例如“-540385322897565151028479750031953205141595”。可能是一些布局问题,但不是什么大问题。 - Eugene van der Merwe

6
"PHPWord是一款纯PHP编写的库,提供了一组类用于读写不同的文档文件格式。" (PHPOffice, 2016)
这个开源的php库可以解决你的问题。你可以通过下载或使用Composer获取它: https://github.com/PHPOffice/PHPWord

1
PHPWord有时候表现得很好,但对于许多文件来说,提取的内容是不完整的 :( - JCarlosR

5
以下是类似于@suhdir的答案中的函数,但适用于PHP 8:
    function readDocx($filename)
    {

        $zip = new ZipArchive();
        if ($zip->open($filename)) {
            $content = $zip->getFromName("word/document.xml");
            $zip->close();
            $content = str_replace('</w:r></w:p></w:tc><w:tc>', " ", $content);
            $content = str_replace('</w:r></w:p>', "\r\n", $content);

            return strip_tags($content);
        }
        return false;

    }

PHP 8已弃用Zip函数,取而代之的是ZipArchive。

1
我正在使用PHP7,并收到了@Sudhir答案的弃用警告。此外,我尝试了phpWord,但它无法处理由MS Word或Google Docs创建的我的Word文件。这段简短的代码对两者都有效。这应该被标记为答案,谢谢。 - hapablap

2

1

Word文档不像文本文件那样方便存储(更像是XML /二进制文件),因此您不能仅使用echo并期望输出docx文件的可读部分。

有一个库可以实现您想要的功能,但它只能处理doc文件。

Docvert


这是Python而不是PHP。我对Python一无所知。那么就没有解决方案了吗? - Othman
http://code.google.com/p/docvert/source/browse/trunk/web-service.php?r=176 将编辑我的回答 - Andreas Wong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接