32

是否可以在不使用 COM 对象的情况下在 PHP 中读取和写入 Word(2003 和 2007)文件?我知道我可以:

$file = fopen('c:\file.doc', 'w+');
fwrite($file, $text);
fclose();

但 Word 会将其读取为 HTML 文件而不是本机 .doc 文件。

4

16 回答 16

29

读取二进制 Word 文档将涉及根据已发布的 DOC 格式文件格式规范创建解析器。我认为这不是真正可行的解决方案。

您可以使用Microsoft Office XML 格式来读取和写入 Word 文件 - 这与 2003 和 2007 版本的 Word 兼容。为了阅读,您必须确保以正确的格式保存 Word 文档(在 Word 2007 中称为 Word 2003 XML-Document)。对于编写,您只需遵循公开可用的 XML 模式。我从未使用这种格式从 PHP 写出 Office 文档,但我使用它来读取 Excel 工作表(自然保存为 XML-Spreadsheet 2003)并在网页上显示其数据。由于这些文件显然是 XML 数据,因此在其中导航并弄清楚如何提取所需的数据是没有问题的。

另一个选项 - 仅 Word 2007 选项(如果您的 Word 2003 中未安装 OpenXML 文件格式) - 将求助于OpenXML。正如databyss在这里指出的那样,DOCX 文件格式只是一个包含 XML 文件的 ZIP 存档。MSDN上有很多关于 OpenXML 文件格式的资源,因此您应该能够弄清楚如何读取所需的数据。我认为写作会复杂得多——这取决于你要投入多少时间。

也许您可以看看PHPExcel,它是一个能够使用 OpenXML 标准写入 Excel 2007 文件和读取 Excel 2007 文件的库。在尝试读写 OpenXML Word 文档时,您可以了解所涉及的工作。

于 2008-11-05T13:04:35.333 回答
18

这适用于 vs < office 2007 及其纯 PHP,没有 COM 废话,仍在尝试计算 2007

<?php



/*****************************************************************
This approach uses detection of NUL (chr(00)) and end line (chr(13))
to decide where the text is:
- divide the file contents up by chr(13)
- reject any slices containing a NUL
- stitch the rest together again
- clean up with a regular expression
*****************************************************************/

function parseWord($userDoc) 
{
    $fileHandle = fopen($userDoc, "r");
    $line = @fread($fileHandle, filesize($userDoc));   
    $lines = explode(chr(0x0D),$line);
    $outtext = "";
    foreach($lines as $thisline)
      {
        $pos = strpos($thisline, chr(0x00));
        if (($pos !== FALSE)||(strlen($thisline)==0))
          {
          } else {
            $outtext .= $thisline." ";
          }
      }
     $outtext = preg_replace("/[^a-zA-Z0-9\s\,\.\-\n\r\t@\/\_\(\)]/","",$outtext);
    return $outtext;
} 

$userDoc = "cv.doc";

$text = parseWord($userDoc);
echo $text;


?>
于 2008-11-05T12:35:22.663 回答
8

您可以使用 Antiword,它是适用于 Linux 和最流行操作系统的免费 MS Word 阅读器。

$document_file = 'c:\file.doc';
$text_from_doc = shell_exec('/usr/local/bin/antiword '.$document_file);
于 2009-05-23T00:57:12.330 回答
6

我不知道用 PHP 阅读原生 Word 文档,但如果你想用 PHP 编写 Word 文档,WordprocessingML(又名 WordML)可能是一个不错的解决方案。您所要做的就是以正确的格式创建一个 XML 文档。我相信 Word 2003 和 2007 都支持 WordML。

于 2008-10-10T00:23:47.277 回答
6

只是更新代码

<?php

/*****************************************************************
This approach uses detection of NUL (chr(00)) and end line (chr(13))
to decide where the text is:
- divide the file contents up by chr(13)
- reject any slices containing a NUL
- stitch the rest together again
- clean up with a regular expression
*****************************************************************/

function parseWord($userDoc) 
{
    $fileHandle = fopen($userDoc, "r");
    $word_text = @fread($fileHandle, filesize($userDoc));
    $line = "";
    $tam = filesize($userDoc);
    $nulos = 0;
    $caracteres = 0;
    for($i=1536; $i<$tam; $i++)
    {
        $line .= $word_text[$i];

        if( $word_text[$i] == 0)
        {
            $nulos++;
        }
        else
        {
            $nulos=0;
            $caracteres++;
        }

        if( $nulos>1996)
        {   
            break;  
        }
    }

    //echo $caracteres;

    $lines = explode(chr(0x0D),$line);
    //$outtext = "<pre>";

    $outtext = "";
    foreach($lines as $thisline)
    {
        $tam = strlen($thisline);
        if( !$tam )
        {
            continue;
        }

        $new_line = ""; 
        for($i=0; $i<$tam; $i++)
        {
            $onechar = $thisline[$i];
            if( $onechar > chr(240) )
            {
                continue;
            }

            if( $onechar >= chr(0x20) )
            {
                $caracteres++;
                $new_line .= $onechar;
            }

            if( $onechar == chr(0x14) )
            {
                $new_line .= "</a>";
            }

            if( $onechar == chr(0x07) )
            {
                $new_line .= "\t";
                if( isset($thisline[$i+1]) )
                {
                    if( $thisline[$i+1] == chr(0x07) )
                    {
                        $new_line .= "\n";
                    }
                }
            }
        }
        //troca por hiperlink
        $new_line = str_replace("HYPERLINK" ,"<a href=",$new_line); 
        $new_line = str_replace("\o" ,">",$new_line); 
        $new_line .= "\n";

        //link de imagens
        $new_line = str_replace("INCLUDEPICTURE" ,"<br><img src=",$new_line); 
        $new_line = str_replace("\*" ,"><br>",$new_line); 
        $new_line = str_replace("MERGEFORMATINET" ,"",$new_line); 


        $outtext .= nl2br($new_line);
    }

 return $outtext;
} 

$userDoc = "custo.doc";
$userDoc = "Cultura.doc";
$text = parseWord($userDoc);

echo $text;


?>
于 2011-04-04T02:43:44.457 回答
5

如果没有 COM,您很可能无法阅读 Word 文档。

本主题涵盖了写作

于 2008-10-10T02:17:08.297 回答
3

2007 年也可能有点复杂。

.docx 格式是一个 zip 文件,其中包含一些文件夹,其中包含用于格式化和其他内容的其他文件。

将 .docx 文件重命名为 .zip,您就会明白我的意思了。

因此,如果您可以在 PHP 中使用 zip 文件,那么您应该走在正确的道路上。

于 2008-10-10T15:24:10.413 回答
2

www.phplivedocx.org 是一个基于 SOAP 的服务,这意味着您始终需要在线测试文件,也没有足够的示例供其使用。奇怪的是,我在下载 2 天后才发现(也需要额外的 zend 框架)它是一个基于 SOAP 的程序(诅咒我!!!)......我认为没有 COM 它在 Linux 服务器上是不可能的,唯一的想法是将 doc 文件更改为 PHP 可以解析的另一个可用文件...

于 2009-09-13T17:45:58.103 回答
1

Office 2007 .docx 应该是可能的,因为它是 XML 标准。Word 2003 很可能需要 COM 才能读取,即使使用 MS 现在发布的标准也是如此,因为这些标准非常庞大。我还没有看到为匹配它们而编写的许多库。

于 2008-10-10T02:45:48.160 回答
1

我不知道你打算用它做什么,但我需要 .doc 支持搜索索引;我所做的是使用一个名为“catdoc”的小命令行工具;这会将 Word 文档的内容转换为纯文本,以便对其进行索引。如果你需要保持格式和东西,这不是你的工具。

于 2008-10-10T15:25:06.043 回答
1

phpLiveDocx是一个 Zend Framework 组件,可以在 Linux、Windows 和 Mac 上用 PHP 读写 DOC 和 DOCX 文件。

请参阅项目网站:

http://www.phplivedocx.org

于 2009-05-14T07:03:23.423 回答
1

使用 PHP 操作 Word 文件的一种方法是您可能会感兴趣的,那就是借助 PHPDocX。看看它的在线教程,您可能会了解它是如何工作的。您可以插入或提取内容,甚至可以将多个 Word 文件合并为一个文件。

于 2012-09-28T16:44:16.420 回答
0

.rtf 格式是否适合您的目的?.rtf 可以轻松地与 .doc 格式相互转换,但它是以纯文本形式编写的(嵌入了控制命令)。这就是我计划将我的应用程序与 Word 文档集成的方式。

于 2009-01-24T05:09:28.680 回答
0

即使我在做同样的项目 [An Onlinw Word Processor]!但我选择了 c#.net 和 ASP.net。但是通过我所做的调查;我知道了

通过使用 Open XML SDK 和 VSTO [Visual Studio Tools For Office]

我们可以轻松地使用 word 文件来操作它们,甚至可以在内部将它们转换为不同的格式,例如 .odt、.pdf、.docx 等。

因此,转到 msdn.microsoft.com 并彻底了解 Office 开发选项卡。这是最简单的方法,因为我们需要实现的所有功能都已在 .net 中可用!

但是当你想用 PHP 做你的项目时,你可以在 Visual Studio 和 .net 中做,因为 PHP 也是 .net 兼容语言之一!

于 2010-09-05T14:17:51.237 回答
0

我有同样的情况,我想我将使用一个便宜的 50 大型 Windows 主机和免费域来使用它来转换我的文件,用于 PHP 服务器。链接它们很容易。您所需要的只是创建一个 ASP.NET 页面,该页面通过 post 接收 doc 文件并通过 HTTP 回复它,所以简单的 CURL 就可以完成。

于 2010-10-11T19:12:09.240 回答
0

来源获取自

直接使用下面的类来阅读word文档

class DocxConversion{
    private $filename;

    public function __construct($filePath) {
        $this->filename = $filePath;
    }

    private function read_doc() {
        $fileHandle = fopen($this->filename, "r");
        $line = @fread($fileHandle, filesize($this->filename));   
        $lines = explode(chr(0x0D),$line);
        $outtext = "";
        foreach($lines as $thisline)
          {
            $pos = strpos($thisline, chr(0x00));
            if (($pos !== FALSE)||(strlen($thisline)==0))
              {
              } else {
                $outtext .= $thisline." ";
              }
          }
         $outtext = preg_replace("/[^a-zA-Z0-9\s\,\.\-\n\r\t@\/\_\(\)]/","",$outtext);
        return $outtext;
    }

    private function read_docx(){

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

        $zip = zip_open($this->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);
        }// end while

        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;
    }

 /************************excel sheet************************************/

function xlsx_to_text($input_file){
    $xml_filename = "xl/sharedStrings.xml"; //content file name
    $zip_handle = new ZipArchive;
    $output_text = "";
    if(true === $zip_handle->open($input_file)){
        if(($xml_index = $zip_handle->locateName($xml_filename)) !== false){
            $xml_datas = $zip_handle->getFromIndex($xml_index);
            $xml_handle = DOMDocument::loadXML($xml_datas, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
            $output_text = strip_tags($xml_handle->saveXML());
        }else{
            $output_text .="";
        }
        $zip_handle->close();
    }else{
    $output_text .="";
    }
    return $output_text;
}

/*************************power point files*****************************/
function pptx_to_text($input_file){
    $zip_handle = new ZipArchive;
    $output_text = "";
    if(true === $zip_handle->open($input_file)){
        $slide_number = 1; //loop through slide files
        while(($xml_index = $zip_handle->locateName("ppt/slides/slide".$slide_number.".xml")) !== false){
            $xml_datas = $zip_handle->getFromIndex($xml_index);
            $xml_handle = DOMDocument::loadXML($xml_datas, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
            $output_text .= strip_tags($xml_handle->saveXML());
            $slide_number++;
        }
        if($slide_number == 1){
            $output_text .="";
        }
        $zip_handle->close();
    }else{
    $output_text .="";
    }
    return $output_text;
}


    public function convertToText() {

        if(isset($this->filename) && !file_exists($this->filename)) {
            return "File Not exists";
        }

        $fileArray = pathinfo($this->filename);
        $file_ext  = $fileArray['extension'];
        if($file_ext == "doc" || $file_ext == "docx" || $file_ext == "xlsx" || $file_ext == "pptx")
        {
            if($file_ext == "doc") {
                return $this->read_doc();
            } elseif($file_ext == "docx") {
                return $this->read_docx();
            } elseif($file_ext == "xlsx") {
                return $this->xlsx_to_text();
            }elseif($file_ext == "pptx") {
                return $this->pptx_to_text();
            }
        } else {
            return "Invalid File Type";
        }
    }

}

$docObj = new DocxConversion("test.docx"); //replace your document name with correct extension doc or docx 
echo $docText= $docObj->convertToText();
于 2019-07-03T10:25:55.013 回答