Распечатать содержимое DIV - PullRequest
301 голосов
/ 13 февраля 2010

Как лучше всего распечатать содержимое DIV?

Ответы [ 25 ]

4 голосов
/ 03 ноября 2016

Принятое решение не работает. Chrome печатал пустую страницу, потому что не загружал изображение вовремя. Этот подход работает:

Редактировать: Похоже, что принятое решение было изменено после моего сообщения. Почему отрицательный голос? Это решение также работает.

    function printDiv(divName) {

        var printContents = document.getElementById(divName).innerHTML;
        w = window.open();

        w.document.write(printContents);
        w.document.write('<scr' + 'ipt type="text/javascript">' + 'window.onload = function() { window.print(); window.close(); };' + '</sc' + 'ript>');

        w.document.close(); // necessary for IE >= 10
        w.focus(); // necessary for IE >= 10

        return true;
    }
3 голосов
/ 19 января 2014

Хотя ответ @BC лучше всего распечатать на одной странице.

Но Для одновременной печати нескольких страниц формата A4 с помощью Ctrl + P может помочь следующее решение.

@media print{
html *{
    height:0px!important;
    width:0px !important;
    margin: 0px !important;
    padding: 0px !important;
    min-height: 0px !important;
    line-height: 0px !important;
    overflow: visible !important;
    visibility: hidden ;


}


/*assing myPagesClass to every div you want to print on single separate A4 page*/

 body .myPagesClass {
    z-index: 100 !important;
    visibility: visible !important;
    position: relative !important;
    display: block !important;
    background-color: lightgray !important;
    height: 297mm !important;
    width: 211mm !important;
    position: relative !important;

    padding: 0px;
    top: 0 !important;
    left: 0 !important;
    margin: 0 !important;
    orphans: 0!important;
    widows: 0!important;
    overflow: visible !important;
    page-break-after: always;

}
@page{
    size: A4;
    margin: 0mm ;
    orphans: 0!important;
    widows: 0!important;
}}
3 голосов
/ 07 января 2013

Я знаю, что это старый вопрос, но я решил эту проблему с помощью jQuery.

function printContents(id)
{
    var contents = $("#"+id).html();

    if ($("#printDiv").length == 0)
    {
    var printDiv = null;
    printDiv = document.createElement('div');
    printDiv.setAttribute('id','printDiv');
    printDiv.setAttribute('class','printable');
    $(printDiv).appendTo('body');
    }

    $("#printDiv").html(contents);

    window.print();

    $("#printDiv").remove();


}

CSS

  @media print {
    .non-printable, .fancybox-outer { display: none; }
    .printable, #printDiv { 
        display: block; 
        font-size: 26pt;
    }
  }
2 голосов
/ 13 февраля 2010
  • Открыть в новом окне
  • Откройте объект документа нового окна и запишите в него простой документ, в котором нет ничего, кроме полученного элемента div, необходимого заголовка html и т. Д. - вы также можете захотеть, чтобы документ извлекался в таблице стилей в зависимости от вашего содержимого есть
  • Поместите скрипт на новой странице для вызова window.print ()
  • Запустить скрипт
2 голосов
/ 27 июля 2012

Вот мой плагин для печати jquery

(function ($) {

$.fn.printme = function () {
    return this.each(function () {
        var container = $(this);

        var hidden_IFrame = $('<iframe></iframe>').attr({
            width: '1px',
            height: '1px',
            display: 'none'
        }).appendTo(container);

        var myIframe = hidden_IFrame.get(0);

        var script_tag = myIframe.contentWindow.document.createElement("script");
        script_tag.type = "text/javascript";
        script = myIframe.contentWindow.document.createTextNode('function Print(){ window.print(); }');
        script_tag.appendChild(script);

        myIframe.contentWindow.document.body.innerHTML = container.html();
        myIframe.contentWindow.document.body.appendChild(script_tag);

        myIframe.contentWindow.Print();
        hidden_IFrame.remove();

    });
};
})(jQuery);
1 голос
/ 19 мая 2014

Вот решение IFrame, которое работает для IE и Chrome:

function printHTML(htmlString) {
    var newIframe = document.createElement('iframe');
    newIframe.width = '1px';
    newIframe.height = '1px';
    newIframe.src = 'about:blank';

    // for IE wait for the IFrame to load so we can access contentWindow.document.body
    newIframe.onload = function() {
        var script_tag = newIframe.contentWindow.document.createElement("script");
        script_tag.type = "text/javascript";
        var script = newIframe.contentWindow.document.createTextNode('function Print(){ window.focus(); window.print(); }');
        script_tag.appendChild(script);

        newIframe.contentWindow.document.body.innerHTML = htmlString;
        newIframe.contentWindow.document.body.appendChild(script_tag);

        // for chrome, a timeout for loading large amounts of content
        setTimeout(function() {
            newIframe.contentWindow.Print();
            newIframe.contentWindow.document.body.removeChild(script_tag);
            newIframe.parentElement.removeChild(newIframe);
        }, 200);
    };
    document.body.appendChild(newIframe);
}
1 голос
/ 19 февраля 2013

В Opera попробуйте:

    print_win.document.write('</body></html>');
    print_win.document.close(); // This bit is important
    print_win.print();
    print_win.close();
1 голос
/ 15 марта 2018

Если вы хотите получить все стили из исходного документа (включая встроенные стили), вы можете использовать этот подход.

  1. Скопируйте полный документ
  2. Замените тело на элемент, который хотите напечатать.
1 голос
/ 07 декабря 2017

Примечание: Работает только с сайтами с поддержкой jQuery

С этим классным трюком все очень просто. У меня это работало в браузере Google Chrome . Firefox не позволяет печатать в PDF без плагина.

  1. Сначала откройте инспектор, используя (Ctrl + Shift + I) / (Cmd + Option + I).
  2. Введите этот код в консоли

var jq = document.createElement('script');

jq.src = "https://cdnjs.cloudflare.com/ajax/libs/jQuery.print/1.5.1/jQuery.print.min.js";

document.getElementsByTagName('body')[0].appendChild(jq)

$("#myDivWithStyles").print() // Replace ID with yours
  1. Запускает диалог печати. Возьмите физический отпечаток или сохраните его в PDF (в хром). Готово!

Логика проста. Мы создаем новый тег сценария и прикрепляем его перед закрывающим тегом тела. Мы ввели расширение для печати jQuery в HTML. Измените myDivWithStyles на свой собственный идентификатор тега Div. Теперь он занимается подготовкой печатного виртуального окна.

Попробуйте на любом сайте. Только предостережение иногда хитро написанного CSS может привести к отсутствию стилей. Но мы получаем контент в большинстве случаев.

1 голос
/ 15 февраля 2017

Я изменил ответ @BillPaetski, чтобы использовать querySelector, добавить необязательный CSS, удалить принудительный тег H1 и сделать заголовок необязательно указанным или извлеченным из окна. Кроме того, он больше не выполняет автоматическую печать и предоставляет доступ к внутренним компонентам, чтобы их можно было переключать в функции-обертки или по своему усмотрению.

Единственными двумя частными переменными являются tmpWindow и tmpDoc, хотя я полагаю, что доступ title, css и elem может различаться, следует предполагать, что все аргументы функции являются частными.

Код:
function PrintElem(elem, title, css) {
    var tmpWindow = window.open('', 'PRINT', 'height=400,width=600');
    var tmpDoc = tmpWindow.document;

    title = title || document.title;
    css = css || "";

    this.setTitle = function(newTitle) {
        title = newTitle || document.title;
    };

    this.setCSS = function(newCSS) {
        css = newCSS || "";
    };

    this.basicHtml5 = function(innerHTML) {
        return '<!doctype html><html>'+(innerHTML || "")+'</html>';
    };

    this.htmlHead = function(innerHTML) {
        return '<head>'+(innerHTML || "")+'</head>';
    };

    this.htmlTitle = function(title) {
        return '<title>'+(title || "")+'</title>';
    };

    this.styleTag = function(innerHTML) {
        return '<style>'+(innerHTML || "")+'</style>';
    };

    this.htmlBody = function(innerHTML) {
        return '<body>'+(innerHTML || "")+'</body>';
    };

    this.build = function() {
        tmpDoc.write(
            this.basicHtml5(
                this.htmlHead(
                    this.htmlTitle(title) + this.styleTag(css)
                ) + this.htmlBody(
                    document.querySelector(elem).innerHTML
                )
            )
        );
        tmpDoc.close(); // necessary for IE >= 10
    };

    this.print = function() {
        tmpWindow.focus(); // necessary for IE >= 10*/
        tmpWindow.print();
        tmpWindow.close();
    };

    this.build();
    return this;
}
Использование:
DOMPrinter = PrintElem('#app-container');
DOMPrinter.print();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...