Извлечение текста из doc и docx

Я хотел бы знать, как я могу прочитать содержимое документа или docx. Я использую Linux VPS и PHP, но если есть более простое решение с использованием другого языка, сообщите мне, если он работает под Linux-сервером.

Это только решение .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 

Здесь я добавил решение, чтобы получить текст из .doc, .docx word files

Как извлечь текст из текстового файла .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; } 

Мое решение – Antiword для .doc и docx2txt для .docx

Предположим, что сервер linux, который вы контролируете, загружайте каждый, извлеките и установите. Я установил каждую из системных систем:

Antiword: 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, но оно может уничтожать пробелы. В большинстве файлов, которые я тестировал, были экземпляры, где слова, которые должны быть разделены, не имели между ними пробелов. Нехорошо, когда вы хотите полнотекстовый поиск документов, которые вы обрабатываете.

Документы .docx, .odt, .doc и .rtf.

Я написал библиотеку, которая анализирует документы docx, odt и rtf на основе ответов здесь и в других местах.

Основное улучшение, которое я сделал для анализа .docx и .odt, – это то, что библиотека обрабатывает XML, который описывает документ, и пытается его согласовать с тегами HTML, то есть em и сильными тегами. Это означает, что если вы используете библиотеку для CMS, форматирование текста не теряется

Вы можете получить его здесь

Попробуйте ApachePOI . Он хорошо работает для Java. Полагаю, что у вас не будет никаких трудностей с установкой Java на Linux.

Я использовал 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) . ' -'); } 

Я вставляю небольшие улучшения в doc в 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 выглядит по строкам подряд.

Вы можете использовать Apache Tika в качестве полного решения, которое предоставляет REST API.

Другая хорошая библиотека – RawText , поскольку она может делать OCR над изображениями и извлекать текст из любого документа. Он несвободен и работает над REST API.

Пример кода, извлекая ваш файл с помощью RawText:

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