Извлечение текста из документов и документов - PullRequest
14 голосов
/ 04 апреля 2011

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

Ответы [ 8 ]

15 голосов
/ 10 сентября 2011

Это только решение .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
13 голосов
/ 23 октября 2013

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

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

Анализ документов .docx, .odt, .doc и .rtf

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

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

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

6 голосов
/ 16 января 2013

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

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

1 голос
/ 05 мая 2011

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

0 голосов
/ 16 мая 2017

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

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

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

$result = $rawText->extract($your_file)
0 голосов
/ 30 января 2016

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

0 голосов
/ 01 марта 2014

Я использовал 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) . ' -');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...