从doc和docx中提取文本

我想知道如何阅读文档或docx的内容。 我正在使用Linux VPS和PHP,但是如果使用其他语言的解决scheme更简单,请让我知道,只要它在Linux Web服务器下工作。

这只是一个.DOCX解决scheme。 对于.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 

在这里,我已经添加了解决scheme,从.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; } 

我的解决scheme是.doc和docx2txt的.docx反词

假设您控制的是一个linux服务器,请下载每个服务器,解压然后安装。 我安装了每一个系统:

Antiword: make global_install
docx2txt: make install

然后使用这些工具在php中将文本解压缩为string:

 //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的解决scheme从docx文件中提取文本,但它可以屠杀空白。 我testing过的大多数文件都有应该被分开的单词在它们之间没有空格的情况。 当你想全文search你正在处理的文档时,这并不好。

parsing.docx,.odt,.doc和.rtf文件

我写了一个基于这里和其他地方的答案parsingdocx,odt和rtf文档的库。

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

你可以在这里得到它

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

我用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) . ' -'); } 

我在文档中插入一些改进到TXT转换器function

 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文件。

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

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

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

 $result = $rawText->extract($your_file)