Модераторы: Illuminaty
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Печать документа. Шапка для всех страниц...??? 
:(
    Опции темы
t77
  Дата 16.9.2010, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 27.7.2008

Репутация: нет
Всего: нет



Доброе время суток.
Надеюсь, что задаю вопрос в правильной категории форума...
Коротко о том, что я делаю:
Имеются два Фрейма расположенные рядом на странице.
В правом фрейме картинка в левом текст(описание картинки). 
Так же над фреймами расположен линк с надписью "Печать".
Фрейм, в котором расположен текст, имеет вертикальную полосу прокрутки.
При нажатии на линк "Печать" необходимо распечатать слева картинку и справа весь текст. 
Одним из условий - это то, что не зависимо от количества листов, необходимо на всех, распечатываемых листах отображать вверху заголовок и под ним слева картинку.
Так как до печати в левом фрейме имеется вертикальная полоса прокрутки, не могу определить каким образом весь текст распределяется на страницы. 
И сколько всего страниц будет...? 
Как это можно узнать? 
Как это сделать?
P.S.
При нажатии на линк "Печать", запрашиваю XML документ относительно ИД картинки и с помощью XSL трансформации вывожу HTML для печати.
ОЧЕНЬ ВАЖНО - Картинка и заголовок всегда разные.

Помогите!
PM MAIL   Вверх
magelan
Дата 18.9.2010, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: 4
Всего: 16



Весьма гнустная задача.

что бы я делал?
1. напечатал бы на принтер текст, тем шрифтом, которым у вас текст должен печататься. Это даст поняние о кол-ве строк и высоте строки на печати (интерлиньяж).
2. при нажатии кнопки принт - формировал бы новый документ, в которым бы уже было необходимое форматирование. А его бы уже отправлял на печать. Здесь вся гнусь то и заключается, скриптом разбирать текст весьма нетривиальная задачка, хотя и кажетсяя не сложной на первый взгляд.
3. подшаманил бы кол-во строк, чтобы при самых невероятных вариантах они всегда влезали, пусть их будет на 2-3 меньше, чем могло бы.
PM MAIL   Вверх
t77
  Дата 18.9.2010, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 27.7.2008

Репутация: нет
Всего: нет



magelan, спасибо за ваш ответ... Попробую именно так и сделать...
Весь текст изначально ввиде НТМЛ находиться в переменной типа стринг(myTxt).
У  меня на страничке имеется div, куда я заливаю все содержимое стринга myTxt.
Допустим я определил, что максимальное кол-во строк на странице = 200 строк...
Можно ли както вычеслить это количество из переменной стинг или после того как все залито все в див обнаружить 201-ую строку и вставить над ней то, что нужно...
Как вы думаете, что делать, чтобы решение выглядело красиво, элегантно и практично...??
Благодарю
PM MAIL   Вверх
magelan
Дата 19.9.2010, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: 4
Всего: 16



ммм. нет со "вставить" вы умаетесь работать с кареткой.

как детать... Брать DIV высотой в 200 строк, ставить ему overflow: hide, плюхать в него DIV cо всем текстом, для следующей страницы - то же самое, только внутреннему диву надо сказать top: -{200 * высота строки * номер страницы}px

как-то так, надеюсь понятно объяснил?
PM MAIL   Вверх
magelan
Дата 19.9.2010, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: 4
Всего: 16



Не знаю работает ли эта байда в мозилообразных, но ослик слопал:

Код

<html>
<head>
<style>
 .content {
   line-height: 16px;
   font-family: Verdana, sans-serif;
   font-size: 12px;
   position: relative;
   top: 0;
   left: 0;
   height: 150px;
   width: 300px;
   overflow: auto;
   border: 1px solid gold;
 }
</style>
</head>
<body>
<script type="text/javascript">
var linesPerPage = 6;
var lineHeight = 16;
var printWidth = 600;
var headerHtml = '<h1>My Firm Name</h1>very cool';
var footerHtml = 'Page page_num of pages_num <div style="font-size: 10px; color: gray">&copy; 2010 My Firm Name.</div>';

var tag = function( id )
{
    return document.getElementById( id );
}
var makeReport = function( obj )
{
    var lines = obj.scrollHeight / lineHeight;
    var pages = Math.round( lines / linesPerPage + 0.49 );
    var outerCSS = 'border: 1px solid red; height: ' + linesPerPage * lineHeight + 'px; width: ' + printWidth + 'px;position: relative; top: 0; left: 0; overflow: hidden;';
    var innerCSS = 'position: relative; left: 0; line-height: 16px; font-family: Verdana, sans-serif; font-size: 12px;';
    var out = '';
    for( var i = 0; i < pages; i++ )
    {
        out += headerHtml;
        out += '<div style="' + outerCSS + '">';
        out += '<div style="' + innerCSS + 'top: -' + i * lineHeight * linesPerPage + 'px;">';
        out += obj.innerHTML;
        out += '</div>';
        out += '</div>';
        out += footerHtml.replace( /page_num/i, ( i + 1 )).replace( /pages_num/i, pages );
        out += '<br style="page-break-after: always;">';
    }
    var printWindow = window.open( 'about:blank', 'print' );
    printWindow.document.title = 'Print Window';
    printWindow.document.body.innerHTML = out;
    printWindow.focus();    
    printWindow.document.execCommand( "print" );
}
</script>
</body>
<div id="cnt" class="content">
1 line<br>
2 line<br>
3 line<br>
4 line<br>
5 line<br>
6 line<br>
7 line<br>
8 line<br>
9 line<br>
10 line<br>
11 line<br>
12 line<br>
13 line<br>
14 line<br>
15 line<br>
</div>
<a href="javascript://" onclick="makeReport( tag('cnt'))">Print it!</a>

</html>


Это сообщение отредактировал(а) magelan - 19.9.2010, 21:03
PM MAIL   Вверх
t77
  Дата 29.9.2010, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 27.7.2008

Репутация: нет
Всего: нет



magelan, Приведенный вами пример интересный, но не все так просто...
Дело в том, что на странице(страницах), которую нужно отправить на принтер, слишком много динамических элементов.
Попробую привести вашему вниманию структуру страницы...
Элементы, которые должны отображаться на всех страницах:
1.В правом-верхнем углу картинка высотой в 55 пикселей.(Статическая)
2.Заголовок1 - фонт 30 пикселей(Динамический)
3.Заголовок2 - фонт 16 пикселей(Динамический)
4.Резиновый див(рамка), высота которого зависит от количества текста.(Динамический)
Сразу под этими элементами, делим всю ширину страницы на две части...
В левой части картинка, высота которой 500 пикселей.(Динамическая)

Все перечисленные мною элементы, за исключением картинки в правом-верхнем углу, динамически могут меняться. Я их получаю последствием трансформации ХМЛ->ХСЛ и строю на лету ЧТМЛ страничку. Тоесть конечная страница ЧТМЛ, строится в ХСЛ.

А теперь самое интересное...
В правой части от картинки, отображается текст, который должен быть разбит на страницы, в случае если не вмещается на одну страницу...
Тоесть именно тот самый текст, который мне необходимо отображать справа от картинки, не должен повторяться на других страничках!!! 
Именно его нужно поделить между страницами а все остальное должно быть на всех страницах.

Должен заметить, что тот самый текст, кототрый мне необходимо отображать справа от картинки, изначально находится в массиве. Каждая ячейка данного массива является строкой, которую нужно отобразить на странице в той самой правой части от картинки.
Вот так вот.
Надеюсь понятно объяснил...
Может есть идеи как это сделать..?

PM MAIL   Вверх
magelan
Дата 29.9.2010, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: 4
Всего: 16



Я как-то не вижу проблемы, все, что лежит в диве cnt будет разбиваться на страницы.
Созданы кишки этого дива динамически или нет - не имеет никакой разницы, если вы "правильно" указываете контейнер при создании динамики.
PM MAIL   Вверх
t77
  Дата 30.9.2010, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 27.7.2008

Репутация: нет
Всего: нет



понимаете имеется ряд деталей, которые хотел обсудить ибо избежать неправильного подхода к задаче.
Если вы заметили, то на распечатываемой страничке имеются тексты разного размера(font-size).
Первый заголовок = 30 пикселям, тогда как второй заголовок = 16 пикселям и основной текст = 12 пикселям.
Так вот, прежде чем приступать к решению моей задачи я посчитал, что на стандартный лист бумаги(А 4), вмещаются 55 строк текста, размером в 14 пикселей. Также мною было обнаружено, что эта площадь = 950 пикселей. Соответственно 950/55= 17,27.
Относительно вашего примера, мне не совсем понятны вычисления в вашем коде...
Код

var linesPerPage = 6; // это значение не может быть одинаковым для всех страниц
var lineHeight = 16; // здесь я могу задать свои 17,27 ??
var lines = obj.scrollHeight / lineHeight;// количество строк в общем диве ??
var pages = Math.round( lines / linesPerPage + 0.49 );// не понимаю откуда взялось это волшебное число 0,49 ??


Благодарю

PM MAIL   Вверх
magelan
Дата 30.9.2010, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял 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 но это уже параноя.
PM MAIL   Вверх
ksnk
Дата 1.10.2010, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 48
Всего: 386



Задача решается не с того конца, imho... Разбивка на страницы динамического контента - на стороне клиента - явно скриптовая задача.

если есть четкая и твёрдая уверенность, что на страницу помещается именно див с размером в столько px на столько px - его и надо брать за эталон страницы. Если весь контент представляет собой картинки, к которым в нужных местах нужно приписать описание (достаточно простой контент, несложно разбиваемый на куски) - с ним и надо работать.
Поставить обрамляющему диву overflow:auto и забивать контентом, пока не будет появляться этот самый overflow. как только появился - немножко убавить контента, чтобы overflow пропал и начать забивать следующую страницу оставшимся контентом. Предварительно страницу можно украсить хидерами и футерами. 
Хотя, если они представляют собой как-то заполненные прямоугольные области - достаточно просто нарисовать поля побольше в "эталонном" диве. иначе придется немного повыпендриваться... 




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
magelan
Дата 4.10.2010, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: 4
Всего: 16



с динамическими элементами - прокатит +див - див, никто не умрет, что делать, когда я встречаю параграф, который вызывает скрол, т.к контента в нем больше, чем на страницу, и разметки нет, тупо стена текста?
PM MAIL   Вверх
ksnk
Дата 4.10.2010, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 48
Всего: 386



magelan, вот для этого и нужно. чтобы контент был предсказуемой структуры. От параграфа можно откусывать по слову, пока не будет влезать. Получится 2 блока текста.

А вообще, почему бы не генерировать pdf? Как бы и проблем должно стать на порядок меньше и голова будет болеть уже не в том месте...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Вёрстка веб-сайтов | Следующая тема »


 




[ Время генерации скрипта: 0.0740 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.