создание docx файла средствами php, вставка неразрывного пробела

RO
На сайте с 13.07.2009
Offline
88
2306

создаю шаблон из готовго документа, выделяя нужные фрагменты в которые буду подставлять значения из php. проблема в том что нужно указывать цифры в некоторых местах, ипри этом «красиво» их форматировать с помощью

number_format($summ,0,0,' ');

так вот нужно чтобы в документе числа разделялись не прбелом, а неразрывным пробелом. так как если чисто ставить где-то в конце строки то оно криво «ломается» и часть переходить на следующую строку.

пробовал

number_format($summ,0,0,' '); 
ставит обычный пробел

пробовал

number_format($summ,0,0,chr(160)) 
документ вообще битый получается

в исходник вставляется

2\A0880 
а должно быть
2неразрывный_пробел880

сталкивался ли кто-то с таким? как решить?

IL
На сайте с 20.04.2007
Offline
435
#1

попробуйте создать в ворде и подсмотреть, какой символ ставится в нужную позицию..

<w:t xml:space="preserve"> {тут пробелов - сколько нужно} </w:t>
... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
RO
На сайте с 13.07.2009
Offline
88
#2
ivan-lev:
попробуйте создать в ворде и подсмотреть, какой символ ставится в нужную позицию..

чем смотреть? я открываю document.xml обычным gedit ищу место где заведомо известно что стоит неразрывный пробел, а там пустое место, то есть обычный пробел 😕

IL
На сайте с 20.04.2007
Offline
435
#3

Если делать так: <w:t xml:space="preserve">пробелы будут неразрывны</w:t>

* не.. не совсем так.

0xC2 0xA0 = символ неразрывного пробела, который в docx используется..

RO
На сайте с 13.07.2009
Offline
88
#4
ivan-lev:
попробуйте создать в ворде и подсмотреть, какой символ ставится в нужную позицию..

<w:t xml:space="preserve"> {тут пробелов - сколько нужно} </w:t>

этот вариант как-то вообще обрезает пол документа, то есть после вставки этого кода в нужное место весь дальнейший контент просто не отображается, хотя в исходник его видно. видимо как-то структура самого xml рушится.

IL
На сайте с 20.04.2007
Offline
435
#5
ivan-lev:
0xC2 0xA0 = символ неразрывного пробела, который в docx используется..

Поправил выше.. у меня такой вариант отработал нормально

RedOK:
видимо как-то структура самого xml рушится.

Насчёт разрушения - не исключено..

RO
На сайте с 13.07.2009
Offline
88
#6
ivan-lev:
Поправил выше.. у меня такой вариант отработал нормально

Насчёт разрушения - не исключено..

0xC2 0xA0 выводится текстом

судя по всему

<w:t xml:space="preserve">

и есть решение, осталось понять почему оно считается невалидным..

IL
На сайте с 20.04.2007
Offline
435
#7
RedOK:
0xC2 0xA0 выводится текстом

Эм..


$str = 'часть'.chr(0xC2).chr(0xA0).'часть2';
RO
На сайте с 13.07.2009
Offline
88
#8
ivan-lev:
Поправил выше.. у меня такой вариант отработал нормально

у меня вызов chr() делает файл битым. я об этом написал в первом посте. 160 это тот же A0, а вместе с chr(0xC2) получаю не 2\A0880 а 2\C2880

для генерации по шаблону я использую вот это https://github.com/djpate/docxgen может он как-то способствует тому что пробел не ставится?

и ещё он обрезает пробелы так что около 10% всех слов тупо слипаются. в основном слипаются слова с разным форматированием, но есть и случаю слипшихся одинаковых слов.

может подскажите что-то более толковое. до этого ещё использовал livedocx.com, но потом понял что это не совсем соответствует политике безопасности конторы, для которой это делается.

---------- Добавлено 16.03.2013 в 20:22 ----------

капец. причина оказалась в функции number_format

Версия Описание
5.4.0 Функция поддерживает многобайтную строку в качестве параметров dec_point и thousands_sep. В предыдущих версиях в качестве разделителя использовался только первый байт из каждого параметра.

тем не менее вопрос по поводу слипания слов всё ещё актуален..

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий