Обновить

Комментарии 43

Кстати, MHT — отличное решение для сокращения количества запросов к высоконагруженному серверу. Увы, разработчики как хрома, так и файрфокса не удосужились за 11 лет реализовать RFC, опубликованный в 1999-ом году.
Надо mod_mht к Апачу сделать чтобы он на ходу страницы в .mht собирал и отдавал.
Я для аналогичной задачи использовал AbiWord:

abiword -t doc document.html -o document.doc

Была тонкость. На девелоперской машинке AbiWord подтягивал картинки по http, а на продакшн почему-то нет. Пришлось в html вписать путь к картинкам не http:// ...., а полный путь к файлу file:///… и на выходе получался настоящий doc-файл с картинками, который везде открывался.
Спасибо! Будет время, попробую и этот вариант.
Кстати по поводу openoffice и преобразования. Eсть использующий openoffice преобразователь документов unoconv
Благодарю, возьму на заметку!

У описанного мною метода по сравнению с внешними утилитами всё-таки есть ещё один плюс — вышеописанный скрипт можно выполнить и на shared хостинге, без каких-либо дополнительных утилит.
Да, безусловно, это большой плюс.
Пример сконвертированного файла.

Скачал, попытался открыть в LibreOffice 3.4 — открывается как текстовый файл с кракозябрами вместо картинок и отсутствием форматирования.
Так что решение пойдёт, наверно, только для пользователей MS Office :-(
Честно, не догадался проверить результат в LibreOffice/OpenOffice, только в Word XP/2003 и старше. Значит не такой уж и красивый способ вышел. Воистину, не очень честный.
Pages из пакета iWork и вовсе файл не открывает.
MS Word for Mac — плохо всё
Второй вариант решения можно с помощью вот этого инструменат реализовать: code.google.com/p/wkhtmltopdf/
Пардон, там html в rtf надо, не доглядел.
Зато для меня в самый раз — спасибо
А в случае сохранения в обычный html нельзя ли картинки интегрировать с помощью конструкции data:image/gif;base64? :)
Такой метод пробовал, увы Word 2003 вставленные таким образом картинки нне отображал.
Я для PDF когда-то использовал класс что-то типа HTML->PDF.

Думаю должен такой и для ворда быть :)
На будущее.
OpenXML, docx ваши друзья. Ну и так к слову. В java с этим лучше ;)
Как вовремя вы подоспели с этой статьёй! Неделю назад задавал такой же вопрос в Q&A на хабре, один из ответов был как раз использовать mht. Не успел ещё взяться за дело, как вы уже даёте всё разложили по полочкам, спасибо :)
НЛО прилетело и опубликовало эту надпись здесь
для простых таблиц вроде же можна юзать обычный csv с расширением xls
CSV — далеко не таблица, а скорее список значений, крайне ограниченный по возможностям
Для openoffic-а такие костыли просто не нужны. Сгенерил XML, припаковал zip-ом, и готов OO-файл :)
Тоже поделюсь phpword.codeplex.com/
Колонтитулы, нумерация страниц, объединение ячеек(строк) в таблицах ну и прочее…
Ой, извиняюсь. Не подходит это под вашу задачу, тут «страаашное» форматирование текста, просто html скормить не получится
PHPRtfLite хорошая библиотечка для создания правда RTF документа, а не DOC, но создает достаточно исправно *.rtf) sourceforge.net/projects/phprtf/ сам ей пользуюсь, доросла до релиза и многофункциональна, есть документация.
А еще можно в офисе подготовить шаблон документа в формате rtf и расставить по нему переменные какие-нибудь. Например, %var%. Потом просто открыть rtf как строку и заменить переменные на нужные данные.

Пока только не разобрался можно ли таким способом дополнительные строки в таблицах создавать. Но всякие платежки создаются на-ура!
В моём случае внутрь %var% должны автоматически попасть таблицы, рисунки, и т.д. Т.е., преобразование не такое тривиальное, увы.
У вас конечно всё портят картинки.
Но вообще, ещё есть «самый джедайский» путь — сделать правильный html без какого-либо мусора в DOM-структуре (вся верстка на CSS). Если мусора в верстке нет, то и Word, и Excel, и куча другого софта нормально открывают такие html файлы и без всякой конвертации в другие форматы.
К сожалению, это не DOC. Если JPG переименовать в PNG, то картинка всё равно откроется, но прозрачность от этого не появится. И у вас то же.
А давайте все проблемы решать так? Windows переименуем в Linux, ie6 переименуем в chrome, icq в jabber, mp3 в ogg и т. д.
По делу — не кому не советую делать то, что описано в статье. Это конечно хорошо, что всё откроется, но представьте теперь что может делать пользователь с этим файлом дальше? Возьмёт попытается отправить в Google Docs — косяк, или захочет открыть в какой-нибудь специфичной программе. Естественно у него ничего не получится, пользователь будет ругать разработчиков. Из таких идей и получается у нас потом неразбериха и путаница, когда разработчику приходится проверять, а действительно ли пользователь загрузил JPG, или это переименованная BMP…
Если задача только открыть файл — ну и отправляйте html/mht, всё откроется прекрасно.
Согласен, решение не очень прямое, потому и метод назван «не очень честным». Уточню в статье, что получившийся файл открывается только в семействе продуктов «Microsoft Word».

Если задача только открыть файл — ну и отправляйте html/mht, всё откроется прекрасно.


Не всегда есть возможность решить задачу правильно. Требовалось получить именно «файл с раширением doc, открывающийся в Microsoft Word'е». В будущем, без сомнения, задача будет решена прямее, но при отсутствии достаточного количества времени на решение это было лучшее, что пришло мне в голову.
Программа Просмотр на маке отказалась открывать этот файл, а LibreOffice открыл кракозябры исходного текста.
регулярка:
preg_match_all('@
Если уж обманывать то я бы из PDF'ка генерировал бы картинку и вставлял бы ее в любой формат XLS, DOC или еще куда :) или просто отдавал бы в виде картинки

плюсы:
1. кросс платформенность.
2. при таком решении не нужны вообще никакие форматы, картинка она и в африке картинка, откроется везде хоть на мобильнике!
3. правильная печать.

минусы:
1 не возможность редактирования.
2. в зависимости от содержимого страницы, размер итогового файла может быть не приемлимо большим

Все зависит от целей и задач.
Да, с картинкой неплохая идея, если редактирование не требуется.
Насколько я понимаю, автор создает некие офлайн-версии сайтов. Но там ведь нужна кликабельность ссылок!
А почему нельзя взять конвертор написаный на другом языке и просто с его помощью уже получить нармальный файл необходимого формата. Есть например очень хороший JODConverter, написаный на джаве.
Кстате там же есть реализация на питоне.
/<img\b[^>]+src=([\'\"])(.*)\\1/iU
Унылое говно.

Народ, да забудьте наконец вы этот проприетарный DOC как страшный сон! Иначе мы так ещё десяток лет будем писать всевозможные генераторы (генерирующие при том в большинстве случаев далеко не настоящий DOC, а RTF или чего похуже) и парсеры для него.
Сейчас стандартами являются OpenDocument, Office Open XML, PDF. Вот и ориентируйтесь.
OO документ не откроется с помощью Microsoft Word'а 2003 например. Если уж требуется кроссплатформенность и универсальность, идеальным вариантом будет RTF или MHT (или HTML с base64 интегрированными картинками).

Но повторюсь, мне требовалось решить конкретную, жестко заданную в ТЗ задачу: файлы DOC, открываемые Word 2003 и выше.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации