Использование CSS и / или jQuery для печатных страниц с разрывами страниц - PullRequest
8 голосов
/ 02 февраля 2011

У меня динамически генерируемая html-страница, предназначенная для печати. ​​

Я хотел бы создать разрывы страниц, основанные на разделах div - где любой данный div - если он НЕ полностью помещается на странице, вставьте разрыв страницы перед ним.

Теоретически, на одном печатном листе может поместиться любое число от одного div, до, возможно, 10, поэтому я думаю, что мне нужно будет использовать jQuery для вставки после загрузки страницы.

Если бы это было настольное приложение, я бы подошел к нему примерно так:

  1. Измерение ширины и высоты страницы (используя какой-либо объект принтера).
  2. Измерьте каждую высоту div и вычтите ее из общей оставшейся высоты страницы
  3. if (остальное_пространство - div_height> 0) {// поместить его на страницу} else {// вставить сначала разрыв страницы}

Есть ли способ использовать jQuery, CSS, сырой JavaScript или что-нибудь еще, что могло бы привести меня к этому сценарию?

Ответы [ 5 ]

3 голосов
/ 03 февраля 2011

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

В общем, вот что я сделал.

  1. Сгенерированный вывод как обычно (не предназначен для принтера)
  2. Создано 2 таблицы стилей (одна для принтера и одна для экрана). Измерения были в дюймах (не в пикселях) для всех элементов страницы, которые должны быть преобразованы в вывод на печать.
  3. Используя jQuery, я сделал следующее:

-> вызываемая функция, которая добавляет начальную страницу в DOM - что-то вроде этого

// assumes old_page_id is existing element in DOM, and var page_id = 1;
$j("<div class='page' id='" + page_id + "'><div class='print_area'></div></div>")
.insertAfter('#' + old_page_id);

-> измерить высоту div, которая является страницей (в моем случае, $ ('. Page'). Height ();)

-> запустил функцию для вставки div и новых страниц - что-то вроде этого

$('div_class').each(
 function() {
  // measure height of $(this)
  // add it to running total of used space on existing page
  // if sum total exceeds remaining space, create new page, and add to that one
  // if still room left, add to this one
 }
);

Обратите внимание, что у каждого div страницы (в моем случае class = 'page') в таблице стилей принтера есть это:

разрыв страницы: всегда;

Вот так у меня получилось создать новую страницу на принтере, где я хотел.

После запуска вышеуказанной функции jQuery я скрыл оригинальный раздел, содержащий элементы div, которые я хотел переместить на печатные страницы. Обратите внимание, что я не мог скрыть этот раздел заранее, потому что мои измерения jQuery не дали бы правильных результатов (в моем случае я поместил все div в оболочку div с идентификатором ' hide_me ' и установил стиль в высота: 1px; переполнение: авто; ).

Я понимаю, что это очень 50000-футовая проекция, но, надеюсь, это полезно для вас.

2 голосов
/ 02 февраля 2011

Вы всегда можете вставить пустой тег DIV с атрибутом CSS {pageBreakBefore: 'always'} или {pageBreakAfter: 'always'} в точках вашего HTML, где вы вычислили в jQuery границы страницы, проверяя высота DIVs или что-то еще. Но вам необходимо иметь достаточно глубокие знания о содержании страницы и, возможно, указать размер шрифта и т. Д. Как «pt» вместо «px».

Смотрите похожий запрос здесь:

Принудительно печатать разрывы страниц с помощью CSS

0 голосов
/ 16 августа 2014

Смысл печатной нумерации, на мой взгляд, состоит в том, чтобы не разбивать вещи плохо. И, как правило, чаще всего вам не нужно разбивать таблицы на таблицы. Так что это подход, который предполагает, что вы изменили <div> в форматирование таблицы и сгруппировали наборы строк, которые не следует разбивать на <tbody> группировки.

Мы хотим пометить верхний и нижний колонтитулы для кода, который нужно найти, и мы не обязательно хотим, чтобы они отображались там, где они описаны

Это вызывается при загрузке страницы, но вместо этого может вызываться непосредственно перед печатью.

<script>
    $().ready(function () {
        $('table.paged').each(function (i, o) {
            BreakPages($(o));
        })
    });
    function BreakPages(jSource) {
        $('body').width("7in");
        var perInch = $('body').width() / 7.5;
        var nPageHeight = 9 * perInch;

        var jHeader = null;
        var jFooter = null;
        var jWrapper = jSource.clone().empty();
        var jPage = null;
        var iPage = 0;
        jSource.after("<div></div>");
        var jFixed = jSource.next();

        function substed(jStuff) {
            var jCopy = jStuff.clone();
            jCopy.find('span.pageNo').html(" " + iPage + " ").removeClass('pageNo');
            return jCopy;
        }

        jSource.children().each(
            function (iChunk, oChunk) {
                var jChunk = $(oChunk);
                if (jChunk.hasClass('footer')) {
                    jFooter = jChunk;
                }
                if (jChunk.hasClass('header')) {
                    jHeader = jChunk;
                    jFooter = jChunk.nextUntil('.footer').last().next();
                }
                if (!jChunk.hasClass('sample')) {
                    var nHeight = jChunk.height();
                    if (jPage)
                        nHeight += jPage.height();
                    if (jFooter)
                        nHeight += jFooter.height();
                    if (nHeight > nPageHeight) {
                        if (jFooter)
                            jPage.append(substed(jFooter));
                        jPage.after("<p style='page-break-after:always; height:0; width:0'>&nbsp</p>");
                        jPage = null;
                    }
                    if (!jPage) {
                        iPage++;
                        jPage = jWrapper.clone();
                        jFixed.append(jPage);
                        if (jHeader && jHeader !== jChunk)
                            jPage.append(substed(jHeader));
                    }
                    jPage.append(jChunk);
                }
            }
        );
        jFixed.find('span.pageCount').html(" " + iPage + " ");
        jFixed.find('span.pageNo').html(" " + iPage + " ");
        jSource.remove();
    }
</script>

Мы раскладываем таблицу так, чтобы она была разбита на страницы.

<body>
    <table>
        <tbody class="header">
            PAGE ONE HEADER
        </tbody>
        <tbody class="header sample">
            LATER PAGE HEADER (IF RELEVANT)
        </tbody>
        <tbody class="together">
            ROW GROUP 1
        </tbody>

        <tbody class="together">
            ROW GROUP N
        </tbody>
        <tbody class="footer">
           FOOTER
        </tbody>
    </table>
</body>

Мы просматриваем <tbody> и добавляем нижний колонтитул и верхний колонтитул перед тем, как какой-либо элемент должен оборваться в конце страницы.

Мы помечаем верхние и нижние колонтитулы классами css и отслеживаем возможность изменения верхних и нижних колонтитулов, помещая их в те места в потоке строк, где они должны быть изменены, но оставляя их невидимыми для другого класса css.

К сожалению, некоторые реализации разрыва страниц применяются только к строго «блочным» элементам, поэтому он не определен для tbody. Поэтому я применил его к классу тегов <p>, добавляемому к каждой таблице страниц.

0 голосов
/ 02 февраля 2011

Вы можете попробовать использовать этот плагин для печати элементов страницы.http://www.recoding.it/wp-content/uploads/demos/jqprint-demo.htm

Это может быть полезно, если вы будете следовать той же логике, которую вы предложили для настольного приложения.Вы можете обернуть свои "страницы" в div, и это то, что вы бы сказали jqPrint для печати.Разрывы страниц могут быть другим элементом или элементом div, но с классом, чтобы вы знали, что это разрыв страницы.Например:

<div id="#page1" class="page">
...
</div>
</div id="#break1" class="break"> </div>

и т.д ..

, затем

$('#page1').jqprint(); 

Я не знаю, знакомы ли вы с jQuery.Если вы не дайте нам знать.

0 голосов
/ 02 февраля 2011

Не совсем то, что вы ищете, но взгляните на это http://www.javascriptkit.com/dhtmltutors/pagebreak.shtml

С дополнительной чертой JS может быть возможным то, чего вы хотите достичь.

...