Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Определение количества строк при печати


Автор: Digo 12.4.2012, 10:08
Здравствуйте,

столкнулся с проблемой есть 5 потенциально возможных текстовых полей в которых может быть как одна строка так и несколько, нужно так вывести на печать(она из браузера происходит ), чтобы не одно поле не разрывалось(т.е. если не влазиет на прошлый а5 чтобы с самого начала переносилась на новый), формат А5. Т.е.  нужно как то анализировать высоту текста в полях, как это определить непонятно можно примерно считать сколько символов в строке (в среднем) но строки могут быть с принудительным переходом на новую (например пару слов) или вообще пустые, а могут быть наоборот длинные. Может кто подскажет что можно сделать с этим?, буду очень признателен)

Автор: Sentox 12.4.2012, 19:46
Мне кажется пусть этим занимается сама ОС (всмысле отдавать текст для печати, а сама ОС уже определит драйвер который и будет заниматься комплектацией строк), если я правильно понял smile
http://ruseller.com/lessons.php?rub=32&id=925

Автор: skyboy 12.4.2012, 23:57
хм. http://www.w3schools.com/cssref/pr_print_pagebi.asp только опера поддерживает :(
обидно.
и в любом случае, тут на стороне сервера не решить: клиент и масштаб отображение изменить может, и другой размер бумаги для печати выбрать

Автор: Digo 13.4.2012, 14:01
спасибо за ценные мысли! ситуация немного упростилась, получается может менятся только одно поле в котором может быть текст,  размер его фиксирован по ширине, можно как то определить число символов в тексте и число переноса строк? Длину строки понятно как определять а с текстом работать как с массивом строк, как оптимальнее это реализовать можно?

Код

$newtext = explode("\n", $txt);

 - заполняется все из админки в инете никаких редакторов обычное поле, далее хранится в базе и выводится, проблема с символом переноса на новую строку.

или лучше так?
Код

$newtext = preg_split('/\\r\\n?|\\n/', $text);


или может можно посчитать число символов не разбивая на строки и не обходя их в цикле как-то?

Автор: ksnk 13.4.2012, 14:49
Можно вычислить высоту поля на клиенте. Просто посчитать ее на javascript и быстро-быстро переформатировать документ. Хотя может ли такой финт сработать при выводе на принтер - не пробовал.  smile Хотя, ничего не мешает на JS сначала умело посчитать размеры, а потом  с помощью window.open и document.write сформировать "страничку для печати" с переносами страниц в нужных местах.

Каким образом посчитать размер текстового куска, выведенного каким-нибудь шрифтом на сервере, вероятно знает только  imagettfbbox. Нужно только угадать с размером-типом шрифта и окружающих полей-размеров. Понятно, что точно угадать будет сложно, однако приблизительный вариант, imho, тоже подойдет для решения задачи.

Автор: Digo 13.4.2012, 15:09
дело в том что я знаю длину строки стиль шрифта и его размер он всегда один и тот же, идея такая в среднем посчитать сколько символов в строке полностью заполненой (когда она без обрыва на конце) и посчитать количество строк если есть обрыв, таким образом я получу расчетное среднее количество строк если они просто перенеслись не поместившись в размеры поля и число строк если вконце пользователь поставил побрыв(для исключения коротких строк), если обрывов будет больше, тогда принемаем число строк по обрывам, если меньше по среднему расчету символов в строке. Далее я знаю что при постоянных условиях печати 1 стока скажем 0,5см и знаю поле оставшееся 8 см (можно с запасом сделать) и тогда сможно примерно раскидывать, как вы думаете такой алгоритм пойдет? и для этого мне нужно знать как лучше реализовать все эти подсчеты...

Автор: ksnk 13.4.2012, 15:40
Digo, Тонкость в том, что латинская l занимает места существенно меньше, чем латинская w. И привязываться к количеству символов в строке просто неправильно. Единственный вариант, если, конечно, не писать собственный графический рендерер шрифтов, позволить какому-то готовому рендереру посчитать нужные габариты, что я и предлагаю. Точнее всего получится посчитать у Javascript'а.

Автор: Digo 13.4.2012, 15:53
не совсем понял что есть js рендерер чесно говоря я не особо в js силен..

Автор: ksnk 13.4.2012, 16:00
Цитата(Digo @  13.4.2012,  15:53 Найти цитируемый пост)
не совсем понял что есть js рендерер чесно говоря я не особо в js силен..

Просто вставить нужный текст в div со все ми нужными стилями и стилем vizibility:hidden и через небольшой таймаут узнать его размеры. Сам броузер, который и будет в последствии печатать странички, правильно посчитает размеры.

Автор: Digo 14.4.2012, 23:45
звучит интересно! Чесно говоря я не совсем понимаю... каким образом узнать размеры? и зачем нужен таймаут? это все через javascript на стороне клиента как понимаю?

Автор: ksnk 15.4.2012, 22:16
Нужно
  •  организовать тестовый div в абсолютной позиции и правилом visibility:hidden
  •  обеспечить наследование всех правил css от дива, размер которого нужно регулировать этим дивом. для простоты - узнать  реальные значения css свойств и вручную присвоить их тестовому диву.
  •  вставить в тестовый див нужны текст
  •  выставить маленький таймаут. Во многих (всех?) броузерах перерисовка экрана происходит на парралельно с javascript, а после прекращения его работы. Таймаут и вызывает это самое прекращение.
  •  после таймаута можно получить значение высоты тестового дива. (width)
  •  Если нужно точнее подогнать нужный размер текста к нужной высоте - можно методом двоичного деления (пропорционального ;) ) подгонять размер текста, пока не наступит полное удовлетворение.

что-то вроде этого

Автор: Sentox 16.4.2012, 04:02
Цитата(ksnk @ 15.4.2012,  22:16)
Нужно


  •  организовать тестовый div в абсолютной позиции и правилом visibility:hidden

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

  •  вставить в тестовый див нужны текст

  •  выставить маленький таймаут. Во многих (всех?) броузерах перерисовка экрана происходит на парралельно с javascript, а после прекращения его работы. Таймаут и вызывает это самое прекращение.

  •  после таймаута можно получить значение высоты тестового дива. (width)

  •  Если нужно точнее подогнать нужный размер текста к нужной высоте - можно методом двоичного деления (пропорционального ;) ) подгонять размер текста, пока не наступит полное удовлетворение.


что-то вроде этого

ммммм ..... может я чего то не понял, а зачем если можно это всё распарсить страницу (это раз), сделать дополнительный запрос к серверу (фоновый), если уже на то пошло это два. То есть непойму для чего этот див выводить заранннее, впринципе не нагрузка для современных каналов, но и всё же.

Кстати, а почему в абсолютной позиции.

Автор: Digo 16.4.2012, 09:46
я так подумал если вернутся к прошлым моим мыслям и поставить в этом поле шрифт  с одинаковым размером и считать кол символов в строке? т.е. формировать (возможно с запасом) все через php с учетом того что меняется только одно поле и оно может быть только одним шрифтом и одним размером, два вопроса только как можно посчитать длину текста через цикл по строкам или можно сразу определить? и соответственно как лучше разбить на строки (определить /r /n)

Автор: ksnk 16.4.2012, 14:54
Цитата(Sentox @  16.4.2012,  04:02 Найти цитируемый пост)
 это всё распарсить страницу (это раз)

Распарсить страницу нет необходимости. ее автор сам собирает.
Цитата(Sentox @  16.4.2012,  04:02 Найти цитируемый пост)
сделать дополнительный запрос к серверу (фоновый), если уже на то пошло это два

Я тоже не пойму при чем тут запрос к серверу.  smile 

Проблема в том, что сильно заполненное текстом поле не влезает на страницу и приходится его выводит в 2-3-X приемов, расставляя в нужных местах теги превода страницы, чтобы оформление не убегало. Нужно просто вычислить высоту поля, после вставки в него некоего текста с TTF шрифтом ( моноширинный шрифт - это неспортивно и некрасиво  smile  ) Метод вычисления высоты поля с определенной шириной и неопределенным наполнением я и предлагаю.

Автор: Digo 16.4.2012, 15:41
т.е.  определяем через js высоту и потом опять загоняем данные в php чтобы он перестроил данные, там просто если не влазиет должны быть на каждой новой странице прописана шапка с различным текстом который генерирует php

Автор: ksnk 16.4.2012, 16:06
Digo, а зачем перестраивать через php? Вычислить размеры и построить текст на javascript.

Цитата(ksnk @  13.4.2012,  14:49 Найти цитируемый пост)
с помощью window.open и document.write сформировать "страничку для печати" с переносами страниц в нужных местах.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)