Извлечение текста из документов и документов

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

14

Решение

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

Другие решения

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

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

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

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

Ты можешь его достать Вот

7

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

6

Пытаться ApachePOI. Это хорошо работает для Java. Я полагаю, у вас не возникнет никаких проблем с установкой Java на Linux.

1

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

Я вставляю небольшие улучшения в функцию преобразования 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);
}

Теперь он сохраняет пустые строки, а текстовый файл выглядит построчно.

0

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

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

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

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