Коллеги добрый день. Помогите решить проблему с чтением DOC файлов. Именно DOC а не DOCX (некоторые путаю) ну то есть это не архив XML Вот код который я использую: Код (Text): 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); fclose($fh); } else { return FALSE; } } else { return FALSE; } } $text = read_doc_file($filename_doc); $text = str_replace('<', "<", $text); $text = str_replace('>', ">", $text); echo "\$extracted_plaintext => ".$text."<br><br><br><br>"; Он работает, но иногда попадаются козявки и кубики, и при этом из разметки остался только тег переноса строки <br /> Мне бы хотелось бы обработать документ с разбором и анализом содержания таблиц. Для этого нужны теги, но я не совсем могу правильно понимать, так как документации по DOC у меня нет. Думал использовать PHPword Но во первых у меня версия PHP 5.4 А во вторых это тяжёлая библиотека которая при массовой обработки документов, будет очень медленно это делать. Мне бы всё-таки хотелось справиться базовыми возможностями PHP Подскажите пожалуйста кто сталкивался с подобной задачей. Я прикрепил файл для тестирования, поправьте расширение в DOC так как сюда нельзя было подцепить иначе. Файл начинается с символов РП, то есть это наверное ODG формат. Но при этом Zip_ом он не читается.
Хорошо, вы можете показать мастер класс, напишите пожалуйста реализацию на PHP 7 или PHP 8 Консольный режим ни кто не отменял, поэтому shell_exec() мне в помощь для PHP 7 или 8, которые сделают парсинг и загрузят данные в БД, или в файл, или socket, да куда угодно. Я в любом случае парсиг буду запускать в параллельном режиме через proc_open(). Чтобы ускорить выполнение разбора большого кол-ва документов. Так что коллега, просьба напишите решение как вы это видите. Я вам Спасибо скажу Только, как я выше написал, просьба, не надо мне грузить библиотеку PHPword, так как мочить воробьёв ракетами это через чур!
"Мой дом на той стороне реки, но я обойду пешком до конца ее, чем воспользуюсь мостом. (с)" Религия "непринятия" лечится временем.
Добрый день! К сожалению, могу помочь только этим https://www.loc.gov/preservation/di...97-2007BinaryFileFormat(doc)Specification.pdf Удачи!
Я так понимаю что PHPword что-то тоже не очень. PHP: $phpWord = new \PhpOffice\PhpWord\PhpWord(); $docReader = \PhpOffice\PhpWord\IOFactory::createReader('MsDoc'); $doc = $docReader->load($filename); foreach ($doc->getSections() as $section) { $phpWord->addSection($section); } $xmlWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007'); $xmlWriter->save($t_file."My_".$n_file.".docx"); Записывает чистый файл и всё. Может кто-то подсказать что не правильно. --- Добавлено --- Сп Спасибо огромное, здесь хоть понятны откуда взять разделители для анализа текста.
Попробовал через COM Вроде должно работать, но, по не понятным для меня причинам, Open не возвращает объект для дальнейшей работы. PHP: try { @com_load_typelib('Word.Application'); @$word = new COM("word.application") or die("Unable to instantiate Word"); $word->Visible = 0; $word->DisplayAlerts = 0; $docPath = $filename_utf8_doc; $t_file=strrev(substr(strrev($docPath),strpos(strrev($docPath),"/"))); $n_file=strrev(substr(strrev($docPath),0,strpos(strrev($docPath),"/"))); $n_file=strrev(substr(strrev($n_file),strpos(strrev($n_file),".")+1)); $docxPath = $t_file."My_".$n_file.".docx"; echo "\$docPath => ".$docPath."<br>\$docxPath => ".$docxPath."<br>"; $doc = $word->Documents->Open(realpath(to_code($docPath,"utf-8","cp1251"))); if ($doc) { $doc->SaveAs(realpath($docxPath), 16); // 16 is the value for saving as DOCX format $doc->Close(); } else { die("Unable to open the document."); } $word->Quit(); unset($word); } catch (com_exception $e) { echo '<pre>'; print_r(to_code($e,"cp1251","utf-8")); echo '</pre>'; }