Задать вопрос

Как получить plain text из файла .doc на php?

Приветствую! Уже месяц бьюсь с кодом для чтения текста из файлов разных форматов, сейчас получается доставать чистый текст только из pdf, txt, docx. Сейчас тормозит всю работу формат .doc своим файловым содержанием. Прогуглил сотни запросов и ни одно решение что дают в сети не помогло, есть такое решение:

function parseWord($userDoc) 
{
    $fileHandle = fopen($userDoc, "r");
    $line = @fread($fileHandle, filesize($userDoc));   
    $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;
}

UPD: Код выше вообще неправильно скинул, но даже если в условие парсера пихнуть кириллицу, проблему в нём это не решит, так что в любом случае проблема не в этом, есть ещё один скрипт, вроде он более правильнее разбирает файл .doc, но всё также не поддерживает кириллицу. Почему я говорю правильнее, потому что код выше возвращает неверное количество символов и даже латинские символы неверные, а вот следующий код возвращает верное количество символов, даже абзацы сохраняет, но любые символы кроме латинских букв передаёт как квадратики.

function read_doc_file($filename) {
     if(file_exists($filename))
    {
        if(($fh = fopen($filename, 'r')) !== false ) 
        {
           $headers = fread($fh, 0xA00);

           // 1 = (ord(n)*1) ; Document has from 0 to 255 characters
           $n1 = ( ord($headers[0x21C]) - 1 );

           // 1 = ((ord(n)-8)*256) ; Document has from 256 to 63743 characters
           $n2 = ( ( ord($headers[0x21D]) - 8 ) * 256 );

           // 1 = ((ord(n)*256)*256) ; Document has from 63744 to 16775423 characters
           $n3 = ( ( ord($headers[0x21E]) * 256 ) * 256 );

           // 1 = (((ord(n)*256)*256)*256) ; Document has from 16775424 to 4294965504 characters
           $n4 = ( ( ( ord($headers[0x21F]) * 256 ) * 256 ) * 256 );

           // Total length of text in the document
           $textLength = ($n1 + $n2 + $n3 + $n4);

           $extracted_plaintext = fread($fh, $textLength);

           // simple print character stream without new lines
           //echo $extracted_plaintext;

           // if you want to see your paragraphs in a new line, do this
           return nl2br($extracted_plaintext);
           // need more spacing after each paragraph use another nl2br
        }
    }   
    }


Пробовал phpword, работает только с docx, который можно читать и кодом в 10 строк.
Но кириллицу оно не принимает, а мне нужна поддержка всех языков. Есть ли у кого нибудь решение или хотя бы совет как придти к нему, как получить вообще просто plain text из .doc файлов?
  • Вопрос задан
  • 1753 просмотра
Подписаться 10 Простой 6 комментариев
Решения вопроса 1
cesnokov
@cesnokov
<head>&nbsp;</head>
Тема очень интересная и пришлось разобраться до конца.
До полного счастья вам не хватает этого:
$extracted_plaintext = mb_convert_encoding( $extracted_plaintext, 'UTF-8', 'UTF-16LE' );

И всё вместе будет:
function read_doc_file($filename) {
    if (file_exists($filename)) {
        if (($fh = fopen($filename, 'r')) !== false) {
            $headers = fread($fh, 0xA00);

            // 1 = (ord(n)*1) ; Document has from 0 to 255 characters
            $n1 = ( ord($headers[0x21C]) - 1 );

            // 1 = ((ord(n)-8)*256) ; Document has from 256 to 63743 characters
            $n2 = ( ( ord($headers[0x21D]) - 8 ) * 256 );

            // 1 = ((ord(n)*256)*256) ; Document has from 63744 to 16775423 characters
            $n3 = ( ( ord($headers[0x21E]) * 256 ) * 256 );

            // 1 = (((ord(n)*256)*256)*256) ; Document has from 16775424 to 4294965504 characters
            $n4 = ( ( ( ord($headers[0x21F]) * 256 ) * 256 ) * 256 );

            // Total length of text in the document
            $textLength = ($n1 + $n2 + $n3 + $n4);

            $extracted_plaintext = fread($fh, $textLength);
            $extracted_plaintext = mb_convert_encoding( $extracted_plaintext, 'UTF-8', 'UTF-16LE' );
            return nl2br($extracted_plaintext);

        } else {
            return FALSE;
        }
    } else {
        return FALSE;
    }
}

$text = read_doc_file('test.doc');


А пока изучал, нашёл интересный тест, может пригодиться:
$text = "A strange string ø, æ, å, ж, п, ą, ū, ė, …"; 
foreach(mb_list_encodings() as $chr){ 
    echo mb_convert_encoding( $text, 'UTF-8', $chr ) . " : " . $chr . "<br><br>";    
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@developer007
А если сделать проще и установить catdoc?

catdoc foo.doc > foo.txt
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы