Доброй ночи. Прошу помощи в том чтобы понять, почему при открытии файла .doc выдается ряд рандомных латинских букв вместо текста. При чем пробовал использоваться 3 разных класса для этого, но на выходе получаю одну и ту же строку рандомных букв. Может, дело в кодировке?.. Вот код этих классов/функций. 1. Код (PHP): class Doc2Txt { private $filename; public function __construct($filePath) { $this->filename = $filePath; } 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; } 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; } public function convertToText() { if(isset($this->filename) && !file_exists($this->filename)) { return "File Not exists"; } $fileArray = pathinfo($this->filename); $file_ext = $fileArray['extension']; if($file_ext == "doc" || $file_ext == "docx") { if($file_ext == "doc") { return $this->read_doc(); } else { return $this->read_docx(); } } else { return "Invalid File Type"; } } } 2. Код (PHP): function read_doc($filename) { $fileHandle = fopen($filename, "r"); $line = @fread($fileHandle, filesize($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; } echo read_doc("test.doc"); 3. Код (PHP): class Doc2Txt{public $text;function __construct($f){if(!isset($f)||!file_exists($f)) return $this->text="File path does not exist.";switch(pathinfo($f,PATHINFO_EXTENSION)){ case "doc":return $this->text = $this->read_doc($f);case "docx":return $this->text = $this->read_docx($f); default: return $this->text = "Invalid File Type";}}function __toString(){return $this->text;}function read_doc($f){return preg_replace("/[^a-zA-Z0-9\s\,\.\-\n\r\t@\/\_\(\)]/","", implode(" ",array_filter(explode(chr(0x0D),file_get_contents($f)),function($x){ return strpos($x,chr(0x00))===FALSE&&strlen($x)!=0;})));}function read_docx($f){ return strip_tags(str_replace(['</w:r></w:p>','</w:r></w:p></w:tc><w:tc>'],[" ","\r\n"],$this->readZippedXML ($filename,"word/document.xml")));}}/*USAGE: $txt=new Doc2Txt("asdf.doc"); echo $txt; */ $txt=new Doc2Txt("test.doc"); echo $txt; Пример того что получаю на выходе, хотя в файле 7000 символов: Код (Text): Y, 5@ x yRxJ5lU@WbdjijMN1b8nEK CjWOsx_8snt7/asOsV/xOLs2sB2YCDtf(Fr ka37ASA,/bXbE94OBL2AE@ccpn5mT /3ANQxDSTdotStstDK1fA qcP Dt H(NiY ibya5HZq_uu_ z3CrUzKQFbuWf_jS 0(MBw6Lh R6NGDM_t1sg8aoh ZTdTOyux)5P4cq6XW 6Q p.s. Файлы пробовал разные. И с кириллицей, и с латиннцией. Исход один.
Да я и работаю с готовым, разве не видно? Те классы и функции все с интернета. То, что вы скинули, как с ним работать? Мне пишет, что не может найти файл autoload.php Если я верно понял написанное на гитхабе, то там нужно на сервер что-то установить? Если так, то как мне это сделать, если у меня выделенный хостинг?)
Ну во первых, - это скорее Вам нужно открыть глаза и посмотреть, что пишет ТС и какой использует формат, прежде чем давать варианты. doc - это бинарный файл и не спасет тебя PHPWord, так - как он, не работает с бинарными данными, а только docx - xml. CraftLawrence, сколько готов платить? За 2к, помог бы, а так, даже не вижу смысла терять свое драгоценное время Если что - пиши в лс.
Код (PHP): 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 } } } Добавлено спустя 21 секунду: http://stackoverflow.com/questions/7358637/reading-doc-file-in-php
Ухты, спасибо! Приблизился к решению. Только там кириллица превращается в несуразицу какую-то. Сейчас пробую это решить. Пока безуспешно.
Вообще суть в том, что мне нужно не текст получить в его читабельном виде, а всего лишь количество символов в нем с точностью до +/- 1-2% Может, можно как-то посчитать количество байт в каком-то его кусочке, отвечающем за текст? Или там идет все вперемешку со стилями и так не получится?
Гениально) Но вот перед тем как считать количество символов разве не нужно строку в нормальный вид преобразовать? Сейчас там на выходе всё еще набор символов в 5 раз большего количества, чем нужно. Хотя может iconv_strlen это решает. Попробую ночью. --- Добавлено --- В общем, вопрос открыт. Как и ожидалось, iconv_strlen считает не верно т.к. строка имеет следующий вид: Латинский текст читается норм.