![]() |
Модераторы: Illuminaty |
![]() ![]() ![]() |
|
t77 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 27.7.2008 Репутация: нет Всего: нет |
Доброе время суток.
Надеюсь, что задаю вопрос в правильной категории форума... Коротко о том, что я делаю: Имеются два Фрейма расположенные рядом на странице. В правом фрейме картинка в левом текст(описание картинки). Так же над фреймами расположен линк с надписью "Печать". Фрейм, в котором расположен текст, имеет вертикальную полосу прокрутки. При нажатии на линк "Печать" необходимо распечатать слева картинку и справа весь текст. Одним из условий - это то, что не зависимо от количества листов, необходимо на всех, распечатываемых листах отображать вверху заголовок и под ним слева картинку. Так как до печати в левом фрейме имеется вертикальная полоса прокрутки, не могу определить каким образом весь текст распределяется на страницы. И сколько всего страниц будет...? Как это можно узнать? Как это сделать? P.S. При нажатии на линк "Печать", запрашиваю XML документ относительно ИД картинки и с помощью XSL трансформации вывожу HTML для печати. ОЧЕНЬ ВАЖНО - Картинка и заголовок всегда разные. Помогите! |
|||
|
||||
magelan |
|
|||
![]() потерял xPath ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 5.4.2010 Репутация: 4 Всего: 16 |
Весьма гнустная задача.
что бы я делал? 1. напечатал бы на принтер текст, тем шрифтом, которым у вас текст должен печататься. Это даст поняние о кол-ве строк и высоте строки на печати (интерлиньяж). 2. при нажатии кнопки принт - формировал бы новый документ, в которым бы уже было необходимое форматирование. А его бы уже отправлял на печать. Здесь вся гнусь то и заключается, скриптом разбирать текст весьма нетривиальная задачка, хотя и кажетсяя не сложной на первый взгляд. 3. подшаманил бы кол-во строк, чтобы при самых невероятных вариантах они всегда влезали, пусть их будет на 2-3 меньше, чем могло бы. |
|||
|
||||
t77 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 27.7.2008 Репутация: нет Всего: нет |
magelan, спасибо за ваш ответ... Попробую именно так и сделать...
Весь текст изначально ввиде НТМЛ находиться в переменной типа стринг(myTxt). У меня на страничке имеется div, куда я заливаю все содержимое стринга myTxt. Допустим я определил, что максимальное кол-во строк на странице = 200 строк... Можно ли както вычеслить это количество из переменной стинг или после того как все залито все в див обнаружить 201-ую строку и вставить над ней то, что нужно... Как вы думаете, что делать, чтобы решение выглядело красиво, элегантно и практично...?? Благодарю |
|||
|
||||
magelan |
|
|||
![]() потерял xPath ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 5.4.2010 Репутация: 4 Всего: 16 |
ммм. нет со "вставить" вы умаетесь работать с кареткой.
как детать... Брать DIV высотой в 200 строк, ставить ему overflow: hide, плюхать в него DIV cо всем текстом, для следующей страницы - то же самое, только внутреннему диву надо сказать top: -{200 * высота строки * номер страницы}px как-то так, надеюсь понятно объяснил? |
|||
|
||||
magelan |
|
|||
![]() потерял xPath ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 5.4.2010 Репутация: 4 Всего: 16 |
Не знаю работает ли эта байда в мозилообразных, но ослик слопал:
Это сообщение отредактировал(а) magelan - 19.9.2010, 21:03 |
|||
|
||||
t77 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 27.7.2008 Репутация: нет Всего: нет |
magelan, Приведенный вами пример интересный, но не все так просто...
Дело в том, что на странице(страницах), которую нужно отправить на принтер, слишком много динамических элементов. Попробую привести вашему вниманию структуру страницы... Элементы, которые должны отображаться на всех страницах: 1.В правом-верхнем углу картинка высотой в 55 пикселей.(Статическая) 2.Заголовок1 - фонт 30 пикселей(Динамический) 3.Заголовок2 - фонт 16 пикселей(Динамический) 4.Резиновый див(рамка), высота которого зависит от количества текста.(Динамический) Сразу под этими элементами, делим всю ширину страницы на две части... В левой части картинка, высота которой 500 пикселей.(Динамическая) Все перечисленные мною элементы, за исключением картинки в правом-верхнем углу, динамически могут меняться. Я их получаю последствием трансформации ХМЛ->ХСЛ и строю на лету ЧТМЛ страничку. Тоесть конечная страница ЧТМЛ, строится в ХСЛ. А теперь самое интересное... В правой части от картинки, отображается текст, который должен быть разбит на страницы, в случае если не вмещается на одну страницу... Тоесть именно тот самый текст, который мне необходимо отображать справа от картинки, не должен повторяться на других страничках!!! Именно его нужно поделить между страницами а все остальное должно быть на всех страницах. Должен заметить, что тот самый текст, кототрый мне необходимо отображать справа от картинки, изначально находится в массиве. Каждая ячейка данного массива является строкой, которую нужно отобразить на странице в той самой правой части от картинки. Вот так вот. Надеюсь понятно объяснил... Может есть идеи как это сделать..? |
|||
|
||||
magelan |
|
|||
![]() потерял xPath ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 5.4.2010 Репутация: 4 Всего: 16 |
Я как-то не вижу проблемы, все, что лежит в диве cnt будет разбиваться на страницы.
Созданы кишки этого дива динамически или нет - не имеет никакой разницы, если вы "правильно" указываете контейнер при создании динамики. |
|||
|
||||
t77 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 27.7.2008 Репутация: нет Всего: нет |
понимаете имеется ряд деталей, которые хотел обсудить ибо избежать неправильного подхода к задаче.
Если вы заметили, то на распечатываемой страничке имеются тексты разного размера(font-size). Первый заголовок = 30 пикселям, тогда как второй заголовок = 16 пикселям и основной текст = 12 пикселям. Так вот, прежде чем приступать к решению моей задачи я посчитал, что на стандартный лист бумаги(А 4), вмещаются 55 строк текста, размером в 14 пикселей. Также мною было обнаружено, что эта площадь = 950 пикселей. Соответственно 950/55= 17,27. Относительно вашего примера, мне не совсем понятны вычисления в вашем коде...
Благодарю |
|||
|
||||
magelan |
|
|||
![]() потерял xPath ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 5.4.2010 Репутация: 4 Всего: 16 |
С разной высоотой шрифтов в контейнере - вы в беде, у JS нет нормальных средств работы с текстом, как например у ворда.
Я бы перед печатью привел все к 14му кеглю, оставив заголовкам болд, более важному церный цвет, менее важному - серый. linesPerPage - сколько строк из блока должно быть выведено на одной странице. lineHeight - высота линии в точках, обычно это на 2-4 пикселя больше высоты шрифта, тот самый интерлиньяж. lines - всего строк на печать pages = Math.round( lines / linesPerPage + 0.49 ); - это классический обход проверки на остаток от деления. если мне вернут 4.9 + 0.49, round округлит до 5, т.к. за 5.5 я не перескачу. если мне вернут 4.01 + 0.49, round так же округлит мне до 5. т.е. в любом случае я получаю реальное число страниц иногда пишут 0.4999999 но это уже параноя. |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 48 Всего: 386 |
Задача решается не с того конца, imho... Разбивка на страницы динамического контента - на стороне клиента - явно скриптовая задача.
если есть четкая и твёрдая уверенность, что на страницу помещается именно див с размером в столько px на столько px - его и надо брать за эталон страницы. Если весь контент представляет собой картинки, к которым в нужных местах нужно приписать описание (достаточно простой контент, несложно разбиваемый на куски) - с ним и надо работать. Поставить обрамляющему диву overflow:auto и забивать контентом, пока не будет появляться этот самый overflow. как только появился - немножко убавить контента, чтобы overflow пропал и начать забивать следующую страницу оставшимся контентом. Предварительно страницу можно украсить хидерами и футерами. Хотя, если они представляют собой как-то заполненные прямоугольные области - достаточно просто нарисовать поля побольше в "эталонном" диве. иначе придется немного повыпендриваться... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
magelan |
|
|||
![]() потерял xPath ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 5.4.2010 Репутация: 4 Всего: 16 |
с динамическими элементами - прокатит +див - див, никто не умрет, что делать, когда я встречаю параграф, который вызывает скрол, т.к контента в нем больше, чем на страницу, и разметки нет, тупо стена текста?
|
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 48 Всего: 386 |
magelan, вот для этого и нужно. чтобы контент был предсказуемой структуры. От параграфа можно откусывать по слову, пока не будет влезать. Получится 2 блока текста.
А вообще, почему бы не генерировать pdf? Как бы и проблем должно стать на порядок меньше и голова будет болеть уже не в том месте... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Вёрстка веб-сайтов | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |