14

我想知道如何阅读 doc 或 docx 的内容。我正在使用 Linux VPS 和 PHP,但如果有使用其他语言的更简单的解决方案,请告诉我,只要它在 linux 网络服务器下工作即可。

4

9 回答 9

15

这只是一个 .DOCX 解决方案。对于 .DOC 或 .PDF,您需要使用其他内容,例如pdf2text.php用于 PDF

function docx2text($filename) {
   return readZippedXML($filename, "word/document.xml");
 }

function readZippedXML($archiveFile, $dataFile) {
// Create new ZIP archive
$zip = new ZipArchive;

// Open received archive file
if (true === $zip->open($archiveFile)) {
    // If done, search for the data file in the archive
    if (($index = $zip->locateName($dataFile)) !== false) {
        // If found, read it to the string
        $data = $zip->getFromIndex($index);
        // Close archive file
        $zip->close();
        // Load XML from a string
        // Skip errors and warnings
        $xml = new DOMDocument();
    $xml->loadXML($data, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
        // Return data without XML formatting tags
        return strip_tags($xml->saveXML());
    }
    $zip->close();
}

// In case of failure return empty string
return "";
}

echo docx2text("test.docx"); // Save this contents to file
于 2011-09-10T11:12:18.170 回答
14

在这里,我添加了从.doc、.docx单词文件中获取文本的解决方案

如何从word文件.doc,docx php中提取文本

对于 .doc

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

对于 .docx

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;
    }
于 2013-10-22T20:10:03.287 回答
7

解析 .docx、.odt、.doc 和 .rtf 文档

我编写了一个库,可以根据此处和其他地方的答案解析 docx、odt 和 rtf 文档。

我对 .docx 和 .odt 解析所做的主要改进是该库处理描述文档的 XML 并尝试使其符合 HTML 标记,即emstrong标记。这意味着如果您将库用于 CMS,文本格式不会丢失

你可以在这里得到

于 2016-04-05T14:58:50.697 回答
6

我的解决方案是.doc的Antiword和 .docx的docx2txt

假设您控制一台 linux 服务器,下载每个服务器,解压缩然后安装。我在系统范围内安装了每一个:

反词:make global_install
docx2txt:make install

然后使用这些工具将文本提取到 php 中的字符串中:

//for .doc
$text = shell_exec('/usr/local/bin/antiword -w 0 ' . 
    escapeshellarg($docFilePath));

//for .docx
$text = shell_exec('/usr/local/bin/docx2txt.pl ' . 
    escapeshellarg($docxFilePath) . ' -');

docx2txt 需要 perl

no_freedom 的解决方案确实从 docx 文件中提取文本,但它可以删除空格。我测试的大多数文件都有一些实例,其中应该分隔的单词之间没有空格。当您想要全文搜索您正在处理的文档时,这不是很好。

于 2013-01-15T22:54:42.463 回答
1

试试ApachePOI。它适用于 Java。我想你在 Linux 上安装 Java 不会有任何困难。

于 2011-05-05T07:35:33.907 回答
1

I would suggest, Extract text using apache Tika, you can extract multiple type of file content like .doc/.docx and pdf and many other.

于 2020-07-05T08:37:38.673 回答
0

我使用 docxtotxt 来提取 docx 文件内容。我的代码如下:

if($extention == "docx")
{   
    $docxFilePath = "/var/www/vhosts/abc.com/httpdocs/writers/filename.docx";
    $content = shell_exec('/var/www/vhosts/abc.com/httpdocs/docx2txt/docx2txt.pl     
    '.escapeshellarg($docxFilePath) . ' -');
}
于 2014-03-01T15:21:58.670 回答
0

我在 doc to txt 转换器功能中插入了一些改进

private function read_doc() {
    $line_array = array();
    $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 )  {

        } else {
            $line_array[] = preg_replace( "/[^a-zA-Z0-9\s\,\.\-\n\r\t@\/\_\(\)]/", "", $thisline );

        }
    }

    return implode("\n",$line_array);
}

现在它保存空行,txt 文件逐行查找。

于 2016-01-30T05:28:42.303 回答
0

您可以使用Apache Tika作为提供 REST API 的完整解决方案。

另一个不错的库是RawText,因为它可以对图像进行 OCR,并从任何文档中提取文本。它是非免费的,它通过 REST API 工作。

使用 RawText 提取文件的示例代码:

$result = $rawText->extract($your_file)
于 2017-05-16T07:32:42.603 回答