| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > Определение количества строк при печати |
| Автор: Digo 12.4.2012, 10:08 |
| Здравствуйте, столкнулся с проблемой есть 5 потенциально возможных текстовых полей в которых может быть как одна строка так и несколько, нужно так вывести на печать(она из браузера происходит ), чтобы не одно поле не разрывалось(т.е. если не влазиет на прошлый а5 чтобы с самого начала переносилась на новый), формат А5. Т.е. нужно как то анализировать высоту текста в полях, как это определить непонятно можно примерно считать сколько символов в строке (в среднем) но строки могут быть с принудительным переходом на новую (например пару слов) или вообще пустые, а могут быть наоборот длинные. Может кто подскажет что можно сделать с этим?, буду очень признателен) |
| Автор: Sentox 12.4.2012, 19:46 |
| Мне кажется пусть этим занимается сама ОС (всмысле отдавать текст для печати, а сама ОС уже определит драйвер который и будет заниматься комплектацией строк), если я правильно понял 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 | ||||
спасибо за ценные мысли! ситуация немного упростилась, получается может менятся только одно поле в котором может быть текст, размер его фиксирован по ширине, можно как то определить число символов в тексте и число переноса строк? Длину строки понятно как определять а с текстом работать как с массивом строк, как оптимальнее это реализовать можно?
- заполняется все из админки в инете никаких редакторов обычное поле, далее хранится в базе и выводится, проблема с символом переноса на новую строку. или лучше так?
или может можно посчитать число символов не разбивая на строки и не обходя их в цикле как-то? |
| Автор: ksnk 13.4.2012, 14:49 |
| Можно вычислить высоту поля на клиенте. Просто посчитать ее на javascript и быстро-быстро переформатировать документ. Хотя может ли такой финт сработать при выводе на принтер - не пробовал. Каким образом посчитать размер текстового куска, выведенного каким-нибудь шрифтом на сервере, вероятно знает только 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 силен.. |
| Автор: Digo 14.4.2012, 23:45 |
| звучит интересно! Чесно говоря я не совсем понимаю... каким образом узнать размеры? и зачем нужен таймаут? это все через javascript на стороне клиента как понимаю? |
| Автор: ksnk 15.4.2012, 22:16 |
Нужно
что-то вроде этого |
| Автор: Sentox 16.4.2012, 04:02 | ||
ммммм ..... может я чего то не понял, а зачем если можно это всё распарсить страницу (это раз), сделать дополнительный запрос к серверу (фоновый), если уже на то пошло это два. То есть непойму для чего этот див выводить заранннее, впринципе не нагрузка для современных каналов, но и всё же. Кстати, а почему в абсолютной позиции. |
| Автор: Digo 16.4.2012, 09:46 |
| я так подумал если вернутся к прошлым моим мыслям и поставить в этом поле шрифт с одинаковым размером и считать кол символов в строке? т.е. формировать (возможно с запасом) все через php с учетом того что меняется только одно поле и оно может быть только одним шрифтом и одним размером, два вопроса только как можно посчитать длину текста через цикл по строкам или можно сразу определить? и соответственно как лучше разбить на строки (определить /r /n) |
| Автор: ksnk 16.4.2012, 14:54 | ||
Распарсить страницу нет необходимости. ее автор сам собирает.
Я тоже не пойму при чем тут запрос к серверу. Проблема в том, что сильно заполненное текстом поле не влезает на страницу и приходится его выводит в 2-3-X приемов, расставляя в нужных местах теги превода страницы, чтобы оформление не убегало. Нужно просто вычислить высоту поля, после вставки в него некоего текста с TTF шрифтом ( моноширинный шрифт - это неспортивно и некрасиво |
| Автор: Digo 16.4.2012, 15:41 |
| т.е. определяем через js высоту и потом опять загоняем данные в php чтобы он перестроил данные, там просто если не влазиет должны быть на каждой новой странице прописана шапка с различным текстом который генерирует php |
| Автор: ksnk 16.4.2012, 16:06 | ||
Digo, а зачем перестраивать через php? Вычислить размеры и построить текст на javascript.
|