Как стать автором
Обновить

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

$handle = fopen("document.xml", "r");

Подразумевается, что document.xml уже распакован и лежит в одной директории с скриптом PHP?
Upd: перечитал, так и есть. Лучше это делать скриптом, извлекая содержимое прямо из docx. Так будет намного практичнее.

Касаемо задачи — видел несколько поделок, работающих следующим образом:
— рисуем шаблон .docx, вместо того, что будет изменяться пишем заготовки, вроде _content_, _recipient_, _signature_ и т.д.;
— описанным вами способом заменяем шаблоны на новое содержимое;
— отдаем пользователю содержимое, при выставлении правильного header'а можно как инициировать скачивание файла, так и его отображение в браузере (если в ОС есть, чем просматривать .docx).

Такая-же схема работает и для других офисных приложений.
Согласен, что можно извлекать содержимое прямо из docx, заменять его, отправлять пользователю и затем снова заменять на исходный шаблон. Таким образом можно не хранить файл отдельно.
Можно попробовать использовать копию архива на виртуальной php://temp или php://memory и редактировать его там.
Если поделка не выглядывает на просторы славной сети, то решение будет вполне себе.


а если серьезно — глупо отказываться от готовых решений.
Есть навскидку несколько готовых решений?
например, www.phpdocx.com
Спс, за наводку
phpword.codeplex.com/ вот бесплатно
Да знают все про нее. Fri Jul 8, 2011 beta — встала она и все. То о чем писал автор статьи эта либа не умеет. А вот аналог от excell хорош.
Расскажите, почему выбрали docx? Документ должен редактироваться?

Из вашего описания выходит, что нужно только распечатать. Почему не PDF?

Спрашиваю, потому-то делаем примерно такие же задачи. И выбрали генерацию PDF на лету. PDF рисуем mPDF. Бланк изначально нарисовал дизайнер, куски сверстали, остальное рисуем.
Безусловно, какие-то вещи пользователи будут корректировать. До этого мы печатали простые одно-страничные бланки, в которых можно было редактировать только определенные поля. Все это делалось средствами HTML и javascript.

Возможно в дальнейшем договоры, которые нельзя будет изменять будут в PDF, избежать этого не удастся.

Если я правильно понимаю то генерация PDF ресурсоемкая задача.
Я для этого использовал (и использую) wkhtmltopdf.
Если не хочется/нет возможности возиться с расширениями PHP, можно почитать например habrahabr.ru/post/111979/

Этот пост был прочитан одним из первых, проблема в том, что на каждой странице должен стоять колонтитул, и это не просто надпись внизу страницы, а целый абзац, который должен находится слева от основного текста.

Псмотрел
www.phpdocx.com
упомянутый выше, возможно это, как раз то, что было нужно. Поскольку там все колонтитулы импортируются из уже созданных ранее в отдельном docx.
Не удалось сделать шаблон в ворде а через php подменять только переменные?
Попробуйте в своем шаблоне в ворде написать

Иванов Иван Иванович

и удалить букву какую-нибудь и напечатать ее заново.
В xml вы увидите что- то типа

Иванов Ива<tag history id="34234"/>н Иванович


Это означает что стрингреплейсом уже ничего не получится сделать, если только не расставлять переменные руками в xml, что крайне неудобно. Либо стараться сделать в ворде крайне чистое написание слов, что сложно из за ненаглядности.
Чтобы не дай бог какой тег вылез стиля или еще чего. Проблему эту решили у себя. Так что любые переменные в любом месте в документе легко заменяются без проблем с тегами от ворда.
Все верно, при редактировании в Word, в document.xml сохраняется последовательность изменений, но если мы заменяем строки в xml с помощью php ничего подобного не происходит.
А почему бы через xpath не брать нужную ноду с текстом и заменять содержимое?

p.s. имелось в виду, что при редактировании шаблона документа будут вставляться дополнительные ноды, str_replace для этого не слишком надежно использовать.
А вы знаете какую ноду брать?) Документ пляшет как хочет структурой. Мы делали 100% рабочий вариант с поиском и замены переменных в xml-ке ворда. Может написать статейку. Это улучшенный способ, чем автор предложил. Но судя по спросу… не знаю стоит ли.
Напишите пожалуйста, если будет время и настроение.
Хотелось бы посмотреть на улучшенный способ, особенно если он не требует установки дополнительных компонент.
Буду признателен)
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории