Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Открыть .docx для чтения
Форумы портала PHP.SU » » Вопросы новичков » Открыть .docx для чтения

Страниц (3): [1] 2 3 »
 

1. TheRealKos - 15 Апреля, 2014 - 16:03:08 - перейти к сообщению
Доброго времени суток. Нужно открыть .docx для чтения. Нашел, что сначала его нужно разархивировать и уже потом считывать файл /word/document.xml. Так же нашел на хабре небольшой скрипт, который это все делает. Но почему-то в результате вместо текста все равно "кракозябры".

PHP:
скопировать код в буфер обмена
  1.  
  2. $filename=$_FILES["filename"]["tmp_name"];
  3. function docx2text($filename) {
  4.     return getTextFromZippedXML($filename, "word/document.xml");
  5. }
  6. function getTextFromZippedXML($archiveFile, $contentFile) {
  7.     // Создаёт "реинкарнацию" zip-архива...
  8.     $zip = new ZipArchive;
  9.     // И пытаемся открыть переданный zip-файл
  10.     if ($zip->open($archiveFile)) {
  11.         // В случае успеха ищем в архиве файл с данными
  12.         if (($index = $zip->locateName($contentFile)) !== false) {
  13.             // Если находим, то читаем его в строку
  14.             $content = $zip->getFromIndex($index);
  15.             // Закрываем zip-архив, он нам больше не нужен
  16.             $zip->close();
  17.  
  18.             // После этого подгружаем все entity и по возможности include'ы других файлов
  19.             // Проглатываем ошибки и предупреждения
  20.             $xml = DOMDocument::loadXML($content, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
  21.             // После чего возвращаем данные без XML-тегов форматирования
  22.  
  23.             return strip_tags($xml->saveXML());
  24.         }
  25.         $zip->close();
  26.     }
  27.     // Если что-то пошло не так, возвращаем пустую строку
  28.     return "";
  29. }
  30. echo function docx2text($filename);
  31.  
2. peters - 15 Апреля, 2014 - 16:59:06 - перейти к сообщению
У меня Ваш скрипт отлично работает
кракозябры - это с кодировкой проблемы
3. TheRealKos - 15 Апреля, 2014 - 17:12:26 - перейти к сообщению
peters пишет:
У меня Ваш скрипт отлично работает
кракозябры - это с кодировкой проблемы

Хм...пробовал и windows-1251 и utf-8, результат один
4. peters - 15 Апреля, 2014 - 18:40:22 - перейти к сообщению
Конкретнее, КАК пробовал?
5. TheRealKos - 15 Апреля, 2014 - 19:08:10 - перейти к сообщению
Уже сделал, вместо последней строчки:
PHP:
скопировать код в буфер обмена
  1.  
  2. $open = iconv("UTF-8", "Windows-1251",  docx2text($filename));
  3. echo "<br>".$open."<br><br><br><br>";
  4.  


Теперь другой вопрос. Текст появится то появился, но без переносов строк. Огорчение Можно ли как то их восстановить?
6. IllusionMH - 15 Апреля, 2014 - 19:21:01 - перейти к сообщению
TheRealKos, попробуйте nl2br если там есть символы переноса строк.
7. TheRealKos - 15 Апреля, 2014 - 19:27:09 - перейти к сообщению
IllusionMH пишет:
попробуйте nl2br если там есть символы переноса строк.

Попробовал, но безрезультатно
PHP:
скопировать код в буфер обмена
  1. $open = iconv("UTF-8", "Windows-1251",  docx2text($filename));
  2. $open_result=nl2br($open);
  3. echo "<br>".$open_result."<br><br><br><br>";

(Добавление)
Вот отрывок текста как должно быть (перенос строки):
...так и по произвольным текстовым запросам.
Задачи автоматически
...

А вот как выдает скрипт (без переноса):
...так и по произвольным текстовым запросам.Задачи автоматически...
8. IllusionMH - 15 Апреля, 2014 - 19:53:27 - перейти к сообщению
TheRealKos, какие символы идут после точки? в функции перед strip_tags попробуйте добавить переносы самостоятельно, в конце соответствующих тегов.
9. TheRealKos - 15 Апреля, 2014 - 19:58:17 - перейти к сообщению
IllusionMH пишет:
какие символы идут после точки? в функции перед strip_tags попробуйте добавить переносы самостоятельно, в конце соответствующих тегов.

В исходном тексте ни каких (я же загружаю docx и потом с помощью скрипта открываю /word/document.xml)
10. IllusionMH - 15 Апреля, 2014 - 20:05:58 - перейти к сообщению
TheRealKos, а как по вашему строки в документе разделяются?
В документе 1 строка и соержимое лежит в соответствующих тегах. Поэтому перед удалением этих тегов(у абзаца кажется </w:p>, а мягкий переноса строки <w:br/>) следует самостоятельно поставить символы переноса строки, а потом уже удалять теги.
11. TheRealKos - 15 Апреля, 2014 - 20:13:38 - перейти к сообщению
IllusionMH пишет:
Поэтому перед удалением этих тегов(у абзаца кажется </w:p>, а мягкий переноса строки <w:br/>) следует самостоятельно поставить символы переноса строки, а потом уже удалять теги.

А как это реализовать?
12. IllusionMH - 15 Апреля, 2014 - 21:21:10 - перейти к сообщению
TheRealKos, заменой.
13. TheRealKos - 15 Апреля, 2014 - 21:29:44 - перейти к сообщению
IllusionMH пишет:
заменой.

Ну вот этой строкой удаляются все теги: return strip_tags($xml->saveXML()). И перед это строкой как то нужно заменить </w:p> и <w:br/> на <br />?
Хотя strip_tags и html теги удаляет...
14. IllusionMH - 15 Апреля, 2014 - 21:34:45 - перейти к сообщению
TheRealKos, описаине функции внимательней почитайте ;) Там еще есть второй параметр.
15. TheRealKos - 15 Апреля, 2014 - 21:37:22 - перейти к сообщению
IllusionMH пишет:
описаине функции внимательней почитайте ;) Там еще есть второй параметр.

Точно, увидел). А как тогда правильно замену сделать?
А не будет ли тогда текст иметь такой вид:
...так и по произвольным текстовым запросам.<br />Задачи автоматически...
(Добавление)
Хотя nl2br должен сделать что-то такое...
...так и по произвольным текстовым запросам.<br />
Задачи автоматически...

 

Powered by ExBB FM 1.0 RC1