За последние 24 часа нас посетили 20684 программиста и 1828 роботов. Сейчас ищет 1001 программист ...

Не могу открыть файл ворда .doc

Тема в разделе "PHP Free-Lance", создана пользователем CraftLawrence, 7 апр 2016.

  1. CraftLawrence

    CraftLawrence Новичок

    С нами с:
    12 ноя 2014
    Сообщения:
    40
    Симпатии:
    0
    Доброй ночи.
    Прошу помощи в том чтобы понять, почему при открытии файла .doc выдается ряд рандомных латинских букв вместо текста.
    При чем пробовал использоваться 3 разных класса для этого, но на выходе получаю одну и ту же строку рандомных букв. Может, дело в кодировке?..
    Вот код этих классов/функций.

    1.
    Код (PHP):
    1. class Doc2Txt {
    2.     private $filename;
    3.     
    4.     public function __construct($filePath) {
    5.         $this->filename = $filePath;
    6.     }
    7.     
    8.     private function read_doc()    {
    9.         $fileHandle = fopen($this->filename, "r");
    10.         $line = @fread($fileHandle, filesize($this->filename));   
    11.         $lines = explode(chr(0x0D),$line);
    12.         $outtext = "";
    13.         foreach($lines as $thisline)
    14.           {
    15.             $pos = strpos($thisline, chr(0x00));
    16.             if (($pos !== FALSE)||(strlen($thisline)==0))
    17.               {
    18.               } else {
    19.                 $outtext .= $thisline." ";
    20.               }
    21.           }
    22.          $outtext = preg_replace("/[^a-zA-Z0-9\s\,\.\-\n\r\t@\/\_\(\)]/","",$outtext);
    23.         return $outtext;
    24.     }
    25.  
    26.     private function read_docx(){
    27.  
    28.         $striped_content = '';
    29.         $content = '';
    30.  
    31.         $zip = zip_open($this->filename);
    32.  
    33.         if (!$zip || is_numeric($zip)) return false;
    34.  
    35.         while ($zip_entry = zip_read($zip)) {
    36.  
    37.             if (zip_entry_open($zip, $zip_entry) == FALSE) continue;
    38.  
    39.             if (zip_entry_name($zip_entry) != "word/document.xml") continue;
    40.  
    41.             $content .= zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
    42.  
    43.             zip_entry_close($zip_entry);
    44.         }// end while
    45.  
    46.         zip_close($zip);
    47.  
    48.         $content = str_replace('</w:r></w:p></w:tc><w:tc>', " ", $content);
    49.         $content = str_replace('</w:r></w:p>', "\r\n", $content);
    50.         $striped_content = strip_tags($content);
    51.  
    52.         return $striped_content;
    53.     }
    54.     
    55.     public function convertToText() {
    56.     
    57.         if(isset($this->filename) && !file_exists($this->filename)) {
    58.             return "File Not exists";
    59.         }
    60.         
    61.         $fileArray = pathinfo($this->filename);
    62.         $file_ext  = $fileArray['extension'];
    63.         if($file_ext == "doc" || $file_ext == "docx")
    64.         {
    65.             if($file_ext == "doc") {
    66.                 return $this->read_doc();
    67.             } else {
    68.                 return $this->read_docx();
    69.             }
    70.         } else {
    71.             return "Invalid File Type";
    72.         }
    73.     }
    74. } 
    2.
    Код (PHP):
    1.  function read_doc($filename)
    2.  {
    3.     $fileHandle = fopen($filename, "r");
    4.     $line = @fread($fileHandle, filesize($filename));
    5.     $lines = explode(chr(0x0D) , $line);
    6.     $outtext = "";
    7.     foreach($lines as $thisline)
    8.         {
    9.         $pos = strpos($thisline, chr(0x00));
    10.         if (($pos !== FALSE) || (strlen($thisline) == 0))
    11.             {
    12.             }
    13.           else
    14.             {
    15.             $outtext.= $thisline . " ";
    16.             }
    17.         }
    18.  
    19.     $outtext = preg_replace("/[^a-zA-Z0-9\s\,\.\-\n\r\t@\/_()]/", "", $outtext);
    20.     return $outtext;
    21.  }
    22.  
    23.  echo read_doc("test.doc");
    3.
    Код (PHP):
    1. class Doc2Txt{public $text;function __construct($f){if(!isset($f)||!file_exists($f))
    2. return $this->text="File path does not exist.";switch(pathinfo($f,PATHINFO_EXTENSION)){
    3. case "doc":return $this->text = $this->read_doc($f);case "docx":return $this->text = $this->read_docx($f);
    4. default: return $this->text = "Invalid File Type";}}function __toString(){return $this->text;}function
    5. read_doc($f){return preg_replace("/[^a-zA-Z0-9\s\,\.\-\n\r\t@\/\_\(\)]/","",
    6. implode(" ",array_filter(explode(chr(0x0D),file_get_contents($f)),function($x){
    7. return strpos($x,chr(0x00))===FALSE&&strlen($x)!=0;})));}function
    8. read_docx($f){
    9. return strip_tags(str_replace(['</w:r></w:p>','</w:r></w:p></w:tc><w:tc>'],[" ","\r\n"],$this->readZippedXML
    10. ($filename,"word/document.xml")));}}/*USAGE: $txt=new Doc2Txt("asdf.doc"); echo $txt; */
    11.  
    12. $txt=new Doc2Txt("test.doc"); 
    13. echo $txt;
    Пример того что получаю на выходе, хотя в файле 7000 символов:
    Код (Text):
    1. Y, 5@ x yRxJ5lU@WbdjijMN1b8nEK CjWOsx_8snt7/asOsV /xOLs2sB2YCDtf(Fr ka37ASA,/bXbE94OBL2AE@ccpn5mT /3ANQxDSTdo t StstDK1fA qcP Dt H(NiY ibya5 HZq_uu_ z3CrU zKQFbuWf_jS 0(MBw6Lh R6NGDM_t1sg8aoh ZTdTOyux)5P4cq6XW 6Q
    p.s. Файлы пробовал разные. И с кириллицей, и с латиннцией. Исход один.
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.589
    Симпатии:
    1.763
  3. CraftLawrence

    CraftLawrence Новичок

    С нами с:
    12 ноя 2014
    Сообщения:
    40
    Симпатии:
    0
    Да я и работаю с готовым, разве не видно? Те классы и функции все с интернета.
    То, что вы скинули, как с ним работать? Мне пишет, что не может найти файл autoload.php
    Если я верно понял написанное на гитхабе, то там нужно на сервер что-то установить? Если так, то как мне это сделать, если у меня выделенный хостинг?)
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Учись или плати.
     
  5. CraftLawrence

    CraftLawrence Новичок

    С нами с:
    12 ноя 2014
    Сообщения:
    40
    Симпатии:
    0
    Ну окей, я готов заплатить если меня научат пользоваться велосипедами.
    Напишите свой скайп.
     
  6. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Ну во первых, - это скорее Вам нужно открыть глаза и посмотреть, что пишет ТС и какой использует формат, прежде чем давать варианты.
    doc - это бинарный файл и не спасет тебя PHPWord, так - как он, не работает с бинарными данными, а только docx - xml.

    CraftLawrence, сколько готов платить?
    За 2к, помог бы, а так, даже не вижу смысла терять свое драгоценное время ;)
    Если что - пиши в лс.
     
  7. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Код (PHP):
    1. function read_doc_file($filename) {
    2.      if(file_exists($filename))
    3.     {
    4.         if(($fh = fopen($filename, 'r')) !== false ) 
    5.         {
    6.            $headers = fread($fh, 0xA00);
    7.  
    8.            // 1 = (ord(n)*1) ; Document has from 0 to 255 characters
    9.            $n1 = ( ord($headers[0x21C]) - 1 );
    10.  
    11.            // 1 = ((ord(n)-8)*256) ; Document has from 256 to 63743 characters
    12.            $n2 = ( ( ord($headers[0x21D]) - 8 ) * 256 );
    13.  
    14.            // 1 = ((ord(n)*256)*256) ; Document has from 63744 to 16775423 characters
    15.            $n3 = ( ( ord($headers[0x21E]) * 256 ) * 256 );
    16.  
    17.            // 1 = (((ord(n)*256)*256)*256) ; Document has from 16775424 to 4294965504 characters
    18.            $n4 = ( ( ( ord($headers[0x21F]) * 256 ) * 256 ) * 256 );
    19.  
    20.            // Total length of text in the document
    21.            $textLength = ($n1 + $n2 + $n3 + $n4);
    22.  
    23.            $extracted_plaintext = fread($fh, $textLength);
    24.  
    25.            // simple print character stream without new lines
    26.            //echo $extracted_plaintext;
    27.  
    28.            // if you want to see your paragraphs in a new line, do this
    29.            return nl2br($extracted_plaintext);
    30.            // need more spacing after each paragraph use another nl2br
    31.         }
    32.     }   
    33.     }
    Добавлено спустя 21 секунду:
    http://stackoverflow.com/questions/7358637/reading-doc-file-in-php
     
  8. CraftLawrence

    CraftLawrence Новичок

    С нами с:
    12 ноя 2014
    Сообщения:
    40
    Симпатии:
    0
    Ухты, спасибо! Приблизился к решению. Только там кириллица превращается в несуразицу какую-то. Сейчас пробую это решить. Пока безуспешно.
     
  9. CraftLawrence

    CraftLawrence Новичок

    С нами с:
    12 ноя 2014
    Сообщения:
    40
    Симпатии:
    0
    Вообще суть в том, что мне нужно не текст получить в его читабельном виде, а всего лишь количество символов в нем с точностью до +/- 1-2%
    Может, можно как-то посчитать количество байт в каком-то его кусочке, отвечающем за текст? Или там идет все вперемешку со стилями и так не получится?
     
  10. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
  11. CraftLawrence

    CraftLawrence Новичок

    С нами с:
    12 ноя 2014
    Сообщения:
    40
    Симпатии:
    0
    Гениально) Но вот перед тем как считать количество символов разве не нужно строку в нормальный вид преобразовать? Сейчас там на выходе всё еще набор символов в 5 раз большего количества, чем нужно.

    Хотя может iconv_strlen это решает. Попробую ночью.
    --- Добавлено ---
    В общем, вопрос открыт.

    Как и ожидалось, iconv_strlen считает не верно т.к. строка имеет следующий вид:
    [​IMG]
    Латинский текст читается норм.