Извлечение текста из doc и docx
Я хотел бы знать, как я могу прочитать содержимое документа или docx. Я использую Linux VPS и PHP, но если есть более простое решение с использованием другого языка, сообщите мне, если он работает под веб-сервером linux.
Ответы
Ответ 1
Это только решение .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
Ответ 2
Здесь я добавил решение, чтобы получить текст из .doc,.docx файлов слов
Для .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\[email protected]\/\_\(\)]/","",$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;
}
Ответ 3
Я написал библиотеку, которая анализирует документы docx, odt и rtf на основе ответов здесь и в других местах.
Основным усовершенствованием, которое я сделал для анализа .docx и .odt, является то, что библиотека обрабатывает XML, который описывает документ, и пытается сопоставить его с тегами HTML, то есть em и strong, Это означает, что если вы используете библиотеку для CMS, форматирование текста не теряется
Вы можете получить здесь
Ответ 4
Мое решение 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, но может обрабатывать пробелы. В большинстве файлов, которые я тестировал, были экземпляры, где слова, которые должны быть разделены, не имели между ними пробелов. Нехорошо, когда вы хотите полнотекстовый поиск документов, которые вы обрабатываете.
Ответ 5
Попробуйте ApachePOI. Он хорошо работает для Java. Я полагаю, что у вас не будет никаких трудностей с установкой Java в Linux.
Ответ 6
Я использовал 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) . ' -');
}
Ответ 7
Я вставляю небольшие улучшения в 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\[email protected]\/\_\(\)]/", "", $thisline );
}
}
return implode("\n",$line_array);
}
Теперь он сохраняет пустые строки, а файл txt выглядит по строкам.
Ответ 8
Вы можете использовать Apache Tika в качестве полного решения, которое предоставляет API REST.
Другая хорошая библиотека RawText, поскольку она может делать OCR над изображениями и извлекать текст из любого док. Он несвободен и работает над REST API.
Пример кода, извлекающего ваш файл с помощью RawText:
$result = $rawText->extract($your_file)