DIV의 내용을 인쇄


336

DIV의 내용을 인쇄하는 가장 좋은 방법은 무엇입니까?


인쇄 요소를 시도 여기
게이브

1
인쇄 란 무엇을 의미합니까? 실제 프린터처럼?
Yuriy Faktorovich

프린터에 "인쇄"하시겠습니까? 또는 문서?
Ed Schembor 2019

지금까지 etimbo에 의해 개발 된 최고의 플러그인을 발견했다 github.com/etimbo/jquery-print-preview-plugin
맥시

3
div 인쇄에 대한이 질문에 대한 해결책을 찾으려고하는 사람을위한 참고 자료입니다. 다음 답변이 매우 유용하다는 것을 알았습니다. stackoverflow.com/a/7532581/405117
Vikram

답변:


518

CHROME에서 테스트 한 이전 버전보다 약간 변경됨

function PrintElem(elem)
{
    var mywindow = window.open('', 'PRINT', 'height=400,width=600');

    mywindow.document.write('<html><head><title>' + document.title  + '</title>');
    mywindow.document.write('</head><body >');
    mywindow.document.write('<h1>' + document.title  + '</h1>');
    mywindow.document.write(document.getElementById(elem).innerHTML);
    mywindow.document.write('</body></html>');

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

    mywindow.print();
    mywindow.close();

    return true;
}

8
이것은 빠른 해결책입니다. 이상적인 솔루션은 인쇄를 위해 별도의 CSS를 사용하는 것입니다. 문제의 세부 사항 (요구 사항)을 자세히 설명 할 수 있습니다.
Bill Paetzke

6
팝업 창에서 스타일 시트를 참조 할 수 있습니다. <head> 태그 사이에 다른 코드 줄을 추가하십시오. mywindow.document.write ( '<link rel = "stylesheet"href = "main.css"type = "text / css"/>');
Bill Paetzke

5
@Rahil 이것을 다음과 같이 변경하십시오 : mywindow.document.close (); mywindow.focus (); mywindow.print (); mywindow.close ();
ROFLwTIME

3
^ newwindow.focus ()를 추가하십시오; 브라우저 간 인쇄를 활성화합니다.
JackMahoney

7
때로는 인쇄 미리보기를로드하지 못하면 인쇄 내용이 상당히 클 때 발생합니다 (Firefox에서는 동일한 페이지가 perfeclty 인 동안 Chrome에서만 표시되지만 Firefox 또는 다른 브라우저에서도 발생할 수 있음을 제외하지는 않습니다). 내가 찾은 가장 좋은 방법은 Windows 가로 드 된 후에 만 ​​인쇄를 실행하고 닫는 것입니다. 그래서 후 : mywindow.document.write(data);이 추가 mywindow.document.write('<script type="text/javascript">$(window).load(function() { window.print(); window.close(); });</script>');및 제거 : mywindow.print();mywindow.close();
파비 위스

164

더 나은 해결책이 있다고 생각합니다. 인쇄 할 때만 전체 문서를 인쇄하도록 div를 만드십시오.

@media print {
    .myDivToPrint {
        background-color: white;
        height: 100%;
        width: 100%;
        position: fixed;
        top: 0;
        left: 0;
        margin: 0;
        padding: 15px;
        font-size: 14px;
        line-height: 18px;
    }
}

팝업보다 완벽하고 훨씬 좋습니다.
GreenWebDev 2012

5
불행하게도, 그것은 IE에없는 일 것 확실히 예상대로이를 참조하십시오 stackoverflow.com/questions/975129/...
jarek.jpa

16
여러 페이지에 넘쳐 야하는 콘텐츠가 Chrome에서 잘린 것 같습니다.
Ishmael Smyrnow 2016 년

IE에서는 나머지 문서를 숨겨야합니다. @media print {body * {display : none; } .myDivToPrint {display : block; 배경색 : 흰색; 높이 : 100 %; 폭 : 100 %; 위치 : 고정; 상단 : 0; 왼쪽 : 0; 여백 : 0; 패딩 : 15px; 글꼴 크기 : 14px; 줄 높이 : 18px; }}
RonnBlack

2
z- 색인을 넣어야 할 수도 있습니다 : 9999999; 다른 요소가 더 높은 곳에 배치 된 경우
Adam M.

43

이것은 @gabe 에 의해 언급 되었지만 jQuery를 사용하는 경우 내 printElement플러그인을 사용할 수 있습니다 .

여기에 샘플이 있으며 여기 에 플러그인에 대한 자세한 정보가 있습니다 .

사용법은 다소 간단합니다. jQuery 선택기로 요소를 가져 와서 인쇄하십시오.

$("#myDiv").printElement();

도움이 되길 바랍니다!


14
팔년 후,이는 .browser 호출이 JQuery와 1.9에서 제거 되었기 때문에 "a.browser이 정의되지"생산합니다
KingsInnerSoul

1
@KingsInnerSoul은 jQuery 사용자들에게는 무례하지 않습니다.이 시대는 그들에게 충분히 가혹합니다. p
Alexandre Daubricourt

22

Jquery를 사용하여이 함수를 사용하십시오.

<script>
function printContent(el){
var restorepage = $('body').html();
var printcontent = $('#' + el).clone();
$('body').empty().html(printcontent);
window.print();
$('body').html(restorepage);
}
</script>

인쇄 버튼은 다음과 같습니다.

<button id="print" onclick="printContent('id name of your div');" >Print</button>

편집 : 보관해야 할 양식 데이터가있는 경우 clone은 해당 사본을 복사하지 않으므로 모든 양식 데이터를 가져 와서 복원 후 교체해야합니다.

<script>
function printContent(el){
var restorepage = $('body').html();
var printcontent = $('#' + el).clone();
var enteredtext = $('#text').val();
$('body').empty().html(printcontent);
window.print();
$('body').html(restorepage);
$('#text').html(enteredtext);
}
</script>
<textarea id="text"></textarea>

$ ( 'body'). html (복원 페이지); 사용 가능한 body 요소가 없기 때문에 작동하지 않습니다. 따라서 location.reload ()로 바꾸는 것이 좋습니다.
디버거

아니요. 페이지를 다시로드하면 양식의 정보 나 기타 필요한 설정이 삭제됩니다. 완벽하게 작동합니다. 코드를 살펴 보는 데 시간이 걸리면 var restorepage에 교체 할 수있는 모든 페이지 정보가 있음을 알 수 있습니다. 코드 편집을 중단하고 직접 테스트하거나 함수의 각 부분이 수행하는 작업을 배우십시오.
게리 헤이스

이게 낫다. 헤더 등에서 CSS 링크를 넣어야하는 위에서 언급 한 것과 달리 인쇄하는 동안 페이지 디자인이 포함됩니다. 감사합니다!
Jorz

el특히 jQ를 사용했기 때문에 전달한 방식 이 끔찍합니다. 간단히 전달하고 selector하드 코딩 된 코드를 제거 하는 것이 훨씬 좋습니다.#
RozzA

나는 항상 오늘이 방법을 사용했는데 안드로이드 장치 (Google Chrome)에서 제대로 작동하지 않는 것으로 나타났습니다. 페이지의 인쇄 가능 영역은 매번 변경되며에서 일부 추가 부품이 포함되어 있습니다 el. 본문이 복원 될 때 인쇄 명령이 전송되는 것 같습니다.
Ali Sheikhpour

18

여기에서 http://forums.asp.net/t/1261525.aspx

<html>

<head>
    <script language="javascript">
        function printdiv(printpage) {
            var headstr = "<html><head><title></title></head><body>";
            var footstr = "</body>";
            var newstr = document.all.item(printpage).innerHTML;
            var oldstr = document.body.innerHTML;
            document.body.innerHTML = headstr + newstr + footstr;
            window.print();
            document.body.innerHTML = oldstr;
            return false;
        }
    </script>
    <title>div print</title>
</head>

<body>
    //HTML Page //Other content you wouldn't like to print
    <input name="b_print" type="button" class="ipt" onClick="printdiv('div_print');" value=" Print ">

    <div id="div_print">

        <h1 style="Color:Red">The Div content which you want to print</h1>

    </div>
    //Other content you wouldn't like to print //Other content you wouldn't like to print
</body>

</html>

1
footerStr을 2 개의 부분으로 나누려면 수정이 필요합니다. brwoser는 "</ body>"를 현재 페이지의 기본 끝으로 사용하기 때문입니다. var footstr1 = "</"; var footstr2 = "본문" "; var footerstr = footstr1 + footstr12;
mirzaei

13

Bill Paetzkediv 포함 이미지를 인쇄하기 위해 답변을 사용 했지만 Google 크롬에서는 작동하지 않습니다.

나는이 줄을 추가 myWindow.onload=function(){하여 작동 시켰으며 여기에 전체 코드가 있습니다.

<html>
<head>
    <script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.1.min.js"> </script>
    <script type="text/javascript">
        function PrintElem(elem) {
            Popup($(elem).html());
        }

        function Popup(data) {
            var myWindow = window.open('', 'my div', 'height=400,width=600');
            myWindow.document.write('<html><head><title>my div</title>');
            /*optional stylesheet*/ //myWindow.document.write('<link rel="stylesheet" href="main.css" type="text/css" />');
            myWindow.document.write('</head><body >');
            myWindow.document.write(data);
            myWindow.document.write('</body></html>');
            myWindow.document.close(); // necessary for IE >= 10

            myWindow.onload=function(){ // necessary if the div contain images

                myWindow.focus(); // necessary for IE >= 10
                myWindow.print();
                myWindow.close();
            };
        }
    </script>
</head>
<body>
    <div id="myDiv">
        This will be printed.
        <img src="image.jpg"/>
    </div>
    <div>
        This will not be printed.
    </div>
    <div id="anotherDiv">
        Nor will this.
    </div>
    <input type="button" value="Print Div" onclick="PrintElem('#myDiv')" />
</body>
</html>

또한 누군가가 ID로 div를 인쇄 해야하는 경우 jquery를로드 할 필요가 없습니다.

여기에 순수한 자바 스크립트 코드가 있습니다.

<html>
<head>
    <script type="text/javascript">
        function PrintDiv(id) {
            var data=document.getElementById(id).innerHTML;
            var myWindow = window.open('', 'my div', 'height=400,width=600');
            myWindow.document.write('<html><head><title>my div</title>');
            /*optional stylesheet*/ //myWindow.document.write('<link rel="stylesheet" href="main.css" type="text/css" />');
            myWindow.document.write('</head><body >');
            myWindow.document.write(data);
            myWindow.document.write('</body></html>');
            myWindow.document.close(); // necessary for IE >= 10

            myWindow.onload=function(){ // necessary if the div contain images

                myWindow.focus(); // necessary for IE >= 10
                myWindow.print();
                myWindow.close();
            };
        }
    </script>
</head>
<body>
    <div id="myDiv">
        This will be printed.
        <img src="image.jpg"/>
    </div>
    <div>
        This will not be printed.
    </div>
    <div id="anotherDiv">
        Nor will this.
    </div>
    <input type="button" value="Print Div" onclick="PrintDiv('myDiv')" />
</body>
</html>

나는 이것이 누군가를 도울 수 있기를 바랍니다.


이것은 나를 위해 일했다! 원래의 대답이 "mywindow"대 "myWindow"를 사용함에 따라 낙타가 나를 물었습니다. 감사!
opcode

12
function printdiv(printdivname) {
    var headstr = "<html><head><title>Booking Details</title></head><body>";
    var footstr = "</body>";
    var newstr = document.getElementById(printdivname).innerHTML;
    var oldstr = document.body.innerHTML;
    document.body.innerHTML = headstr+newstr+footstr;
    window.print();
    document.body.innerHTML = oldstr;
    return false;
}

div원하는 영역을 인쇄하고 내용을 원래대로 되돌립니다. printdivname는 IS div인쇄하려면.


footerStr을 2 개의 부분으로 나누려면 수정이 필요합니다. brwoser는 "</ body>"를 현재 페이지의 기본 끝으로 사용하기 때문입니다. var footstr1 = "</"; var footstr2 = "본문" "; var footerstr = footstr1 + footstr12;
mirzaei

독창적이야! 그러나 네, mirzaei의 해킹이 필요합니다. 그렇지 않으면 body 태그가 깨지고 형식이 손상됩니다. 핵과 함께, 이것은 잘 작동합니다! 특수한 인쇄 스타일을 위해 자체 내부 포장지를 추가 할 수도 있습니다. 이것은 정답입니다.
user2662680

9

인쇄 할 내용을 제외한 다른 모든 요소를 ​​숨기는 별도의 인쇄 스타일 시트를 만듭니다. 'media="print"당신이 그것을로드 할 때 사용하여 플래그 :

<link rel="stylesheet" type="text/css" media="print" href="print.css" />

이렇게하면 출력물에 대해 완전히 다른 스타일 시트를로드 할 수 있습니다.

브라우저의 인쇄 대화 상자가 페이지에 나타나도록하려면 JQuery를 사용하여로드시 다음과 같이 할 수 있습니다.

$(function() { window.print(); });

또는 사용자가 버튼을 클릭하는 등 원하는 다른 이벤트가 발생했을 때 트리거됩니다.


2
그렇습니다. 시나리오가 무엇인지 정확히 아는 것은 어렵습니다.
Pointy

별도의 CSS가 이상적인 솔루션이라는 데 동의합니다. 그리고 div의 내용을 새 창으로 복사하는 것이 빠른 해결책입니다.
Bill Paetzke

9

지금까지 제안 된 솔루션에는 다음과 같은 단점이 있다고 생각합니다.

  1. CSS 미디어 쿼리 솔루션은 인쇄 할 div가 하나만 있다고 가정합니다.
  2. 자바 스크립트 솔루션은 특정 브라우저에서만 작동합니다.
  3. 부모 창 내용을 삭제하고 다시 작성하면 혼란이 발생합니다.

위의 솔루션을 개선했습니다. 다음은 다음과 같은 이점으로 실제로 작동하는 테스트 한 것입니다.

  1. IE, Chrome, Safari 및 firefox를 포함한 모든 브라우저에서 작동합니다.
  2. 부모 창을 파괴하고 다시로드하지 않습니다.
  3. 한 페이지에 여러 개의 DIV를 인쇄 할 수 있습니다.
  4. 오류가 발생하기 쉬운 문자열 연결을 피하기 위해 html 템플릿을 사용합니다.

요점 :

  1. 새로 만든 창에 onload = "window.print ()"가 있어야합니다.
  2. 부모로부터 targetwindow.close () 또는 targetwindow.print ()를 호출하지 마십시오.
  3. targetwindow.document.close () 및 target.focus ()를 수행하십시오.
  4. jquery를 사용하고 있지만 일반 자바 스크립트를 사용하여 동일한 기술을 수행 할 수 있습니다.
  5. http://math.tools/table/multiplication 여기에서 이것을 볼 수 있습니다 . 상자 머리글에서 인쇄 버튼을 클릭하여 각 테이블을 개별적으로 인쇄 할 수 있습니다.

<script id="print-header" type="text/x-jquery-tmpl">
   <html>
   <header>
       <title>Printing Para {num}</title>
       <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
       <style>
          body {
            max-width: 300px;
          }
       </style>
   </header>
   <body onload="window.print()">
   <h2>Printing Para {num} </h2>
   <h4>http://math.tools</h4>
</script>
<script id="print-footer" type="text/x-jquery-tmpl">
    </body>
    </html>
</script>
<script>
$('.printthis').click(function() {
   num = $(this).attr("data-id");
   w = window.open();
   w.document.write(
                   $("#print-header").html().replace("{num}",num)  +
                   $("#para-" + num).html() +
                   $("#print-footer").html() 
                   );
   w.document.close();
   w.focus();
   //w.print(); Don't do this otherwise chrome won't work. Look at the onload on the body of the newly created window.
   ///w.close(); Don't do this otherwise chrome won't work
});
</script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<a class="btn printthis" data-id="1" href="#" title="Print Para 1"><i class="fa fa-print"></i> Print Para 1</a>
<a class="btn printthis" data-id="2" href="#" title="Print Para 2"><i class="fa fa-print"></i> Print Para 2</a>
  
<p class="para" id="para-1">
  Para 1 : Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
  

<p class="para" id="para-2">
  Para 2 : Lorem 2 ipsum 2 dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
  


이것은 훌륭하고 크로스 브라우저를 허용 된 결과보다 훨씬 잘 작동했습니다!
dama_do_bling

7

이 시나리오를 해결하기 위해 플러그인을 작성했습니다. 플러그인이 마음에 들지 않아서 더 광범위하고 구성 가능한 것을 만들었습니다.

https://github.com/jasonday/printThis


1
노력해 주셔서 감사합니다 Jason ..... !! 더 많은 프로젝트에서 실제로 사용할 것입니다. 무슨 플러그인을 불고 남자 ... Speechless .....

6

승인 된 솔루션이 작동하지 않았습니다. 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;
    }

4

나는 이것이 오래된 질문이라는 것을 알고 있지만 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;
    }
  }

3

@BC 답변이 한 페이지를 인쇄하는 것이 가장 좋지만.

그러나 Ctrl + P를 사용하여 A4 크기의 여러 페이지를 동시에 인쇄하면 다음 해결책이 도움이 될 수 있습니다.

@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;
}}

2
  • 새 창을 엽니 다
  • 새 창의 문서 객체를 열고 가지고있는 div와 필요한 html 헤더 등을 포함하는 간단한 문서를 작성하십시오. 콘텐츠에 따라 문서를 스타일 시트로 가져 오십시오.
  • 새 페이지에 스크립트를 넣어 window.print ()
  • 스크립트를 트리거

2

여기 내 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);

2

원본 문서의 모든 스타일 (인라인 스타일 포함)을 원한다면이 방법을 사용할 수 있습니다.

  1. 완전한 문서를 복사하십시오
  2. 본문을 인쇄하려는 요소로 교체하십시오.

이행:

class PrintUtil {
  static printDiv(elementId) {
    let printElement = document.getElementById(elementId);
    var printWindow = window.open('', 'PRINT');
    printWindow.document.write(document.documentElement.innerHTML);
    setTimeout(() => { // Needed for large documents
      printWindow.document.body.style.margin = '0 0';
      printWindow.document.body.innerHTML = printElement.outerHTML;
      printWindow.document.close(); // necessary for IE >= 10
      printWindow.focus(); // necessary for IE >= 10*/
      printWindow.print();
      printWindow.close();
    }, 1000)
  }   
}

2
이것이 최선의 해결책이라는 것을 모르겠지만 완벽하게 작동했습니다. 감사!
BRogers

2

참고 : 이것은 jQuery 사용 사이트에서만 작동합니다

이 멋진 트릭으로 매우 간단합니다. Chrome 브라우저 에서 나를 위해 일했습니다 . Firefox에서는 플러그인없이 PDF로 인쇄 할 수 없습니다.

  1. 먼저 (Ctrl + Shift + I) / (Cmd + Option + I)을 사용하여 관리자를 엽니 다.
  2. 콘솔에이 코드를 입력하십시오 :

var jqchild = document.createElement('script');
jqchild.src = "https://cdnjs.cloudflare.com/ajax/libs/jQuery.print/1.5.1/jQuery.print.min.js";
document.getElementsByTagName('body')[0].appendChild(jqchild);
$("#myDivWithStyles").print(); // Replace ID with yours
  1. 인쇄 대화 상자가 시작됩니다. 실제 인쇄를하거나 PDF (chrome)로 저장하십시오. 끝난!

논리는 간단합니다. 새 스크립트 태그를 작성하고 닫는 body 태그 앞에 첨부합니다. HTML에 jQuery 인쇄 확장 프로그램을 삽입했습니다. 자신의 Div 태그 ID로 myDivWithStyles 를 변경하십시오 . 이제 인쇄 가능한 가상 창을 준비합니다.

어느 사이트에서나 사용해보십시오. 주의해야 할 점은 가끔 까다로운 CSS만으로 스타일이 누락 될 수 있다는 것입니다. 그러나 우리는 내용을 대부분 얻습니다.


1

Opera에서 다음을 시도하십시오.

    print_win.document.write('</body></html>');
    print_win.document.close(); // This bit is important
    print_win.print();
    print_win.close();

1

IE 및 Chrome에서 작동하는 IFrame 솔루션은 다음과 같습니다.

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

모든 HTML 요소에서 사용할 수있는 일반적인 것을 만들었습니다.

HTMLElement.prototype.printMe = printMe;
function printMe(query){             
     var myframe = document.createElement('IFRAME');
     myframe.domain = document.domain;
     myframe.style.position = "absolute";
     myframe.style.top = "-10000px";
     document.body.appendChild(myframe);
     myframe.contentDocument.write(this.innerHTML) ;
     setTimeout(function(){
        myframe.focus();
        myframe.contentWindow.print();
        myframe.parentNode.removeChild(myframe) ;// remove frame
     },3000); // wait for images to load inside iframe
     window.focus();
}
//usage
document.getElementById('xyz').printMe();
document.getElementsByClassName('xyz')[0].printMe();

도움이 되었기를 바랍니다.


1

querySelector를 사용하고 선택적 CSS를 추가하고 강제 H1 태그를 제거하고 제목을 선택적으로 지정하거나 창에서 가져 오도록 @BillPaetski 응답을 수정했습니다. 또한 더 이상 자동 인쇄하지 않으며 내부를 노출하므로 래퍼 기능이나 원하는대로 전환 할 수 있습니다.

제목, css 및 elem 액세스가 다를 수 있지만 모든 함수 인수가 개인 것으로 가정해야한다고 생각하지만 유일한 두 개인 변수는 tmpWindow 및 tmpDoc입니다.

암호:
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();

또한 <input>요소 의 값을 복사하지 않습니다 . 사용자가 입력 한 내용을 포함하여 이것을 어떻게 사용할 수 있습니까?
Malcolm Salvador

@ Malky.Kid 당신이 요구하는 것에 대해 생각하십시오. 당신이 양식을 인쇄 할 경우, 폼 요소에 흐림 이벤트를 연결하고, 속성 값, 선택, 기본 및 innerText와를 설정해야합니다 <input>, <select>, <textarea>compontents는 런타임 값이 될 수 있습니다. 대안이 있지만이 스크립트에는 문제가 없지만 브라우저 작동 방식에 문제가 innerHTML있고 입력, 캔버스 등이있는 문서의 속성을 얻는 데 문제가 있습니다 .
MrMesees

를 통해 이미 솔루션에 도착했습니다 .attr('value',). 텍스트 영역 (추가)과 확인란 ( .attr('checked',))에 대해서도 수행했습니다 . 내가 요구 한 것에 대해 충분히 생각하지 않으면 유감 입니다.
말콤 살바도르

반 친구들과 나누고 싶으세요? 의견에 요점이나 무언가가있을 수 있습니다. 나는 그것을 공표 할 것이다.
MrMesees

0

아래 코드는 CSS 선택기를 타겟팅하는 데 사용되는 많은 상위 요소가 없기 때문에 쿼리 선택자가 대상으로하는 모든 관련 노드를 복사하고 화면에 표시된대로 해당 스타일을 복사합니다. 스타일이 많은 자식 노드가 많으면 약간의 지연이 발생합니다.

인쇄 스타일 시트가 준비되어있는 것이 이상적이지만, 삽입 할 인쇄 스타일 시트가없고 화면에 표시된대로 인쇄하려는 사용 사례를위한 것입니다.

이 페이지의 브라우저 콘솔에서 아래 항목을 복사하면이 페이지의 모든 코드 스 니펫이 인쇄됩니다.

+function() {
    /**
     * copied from  /programming/19784064/set-javascript-computed-style-from-one-element-to-another
     * @author Adi Darachi https://stackoverflow.com/users/2318881/adi-darachi
     */
    var copyComputedStyle = function(from,to){
        var computed_style_object = false;
        //trying to figure out which style object we need to use depense on the browser support
        //so we try until we have one
        computed_style_object = from.currentStyle || document.defaultView.getComputedStyle(from,null);

        //if the browser dose not support both methods we will return null
        if(!computed_style_object) return null;

            var stylePropertyValid = function(name,value){
                        //checking that the value is not a undefined
                return typeof value !== 'undefined' &&
                        //checking that the value is not a object
                        typeof value !== 'object' &&
                        //checking that the value is not a function
                        typeof value !== 'function' &&
                        //checking that we dosent have empty string
                        value.length > 0 &&
                        //checking that the property is not int index ( happens on some browser
                        value != parseInt(value)

            };

        //we iterating the computed style object and compy the style props and the values
        for(property in computed_style_object)
        {
            //checking if the property and value we get are valid sinse browser have different implementations
                if(stylePropertyValid(property,computed_style_object[property]))
                {
                    //applying the style property to the target element
                        to.style[property] = computed_style_object[property];

                }   
        }   

    };


    // Copy over all relevant styles to preserve styling, work the way down the children tree.
    var buildChild = function(masterList, childList) {
        for(c=0; c<masterList.length; c++) {
           var master = masterList[c];
           var child = childList[c];
           copyComputedStyle(master, child);
           if(master.children && master.children.length > 0) {
               buildChild(master.children, child.children);
           }
        }
    }

    /** select elements to print with query selector **/
    var printSelection = function(querySelector) {
        // Create an iframe to make sure everything is clean and ordered.
        var iframe = document.createElement('iframe');
        // Give it enough dimension so you can visually check when modifying.
        iframe.width = document.width;
        iframe.height = document.height;
        // Add it to the current document to be sure it has the internal objects set up.
        document.body.append(iframe);

        var nodes = document.querySelectorAll(querySelector);
        if(!nodes || nodes.length == 0) {
           console.error('Printing Faillure: Nothing to print. Please check your querySelector');
           return;
        }

        for(i=0; i < nodes.length; i++) {

            // Get the node you wish to print.
            var origNode = nodes[i];

            // Clone it and all it's children
            var node = origNode.cloneNode(true);

            // Copy the base style.
            copyComputedStyle(origNode, node);

            if(origNode.children && origNode.children.length > 0) {
                buildChild(origNode.children, node.children);
            }

            // Add the styled clone to the iframe. using contentWindow.document since it seems the be the most widely supported version.

            iframe.contentWindow.document.body.append(node);
        }
        // Print the window
        iframe.contentWindow.print();

        // Give the browser a second to gather the data then remove the iframe.
        window.setTimeout(function() {iframe.parentNode.removeChild(iframe)}, 1000);
    }
window.printSelection = printSelection;
}();
printSelection('.default.prettyprint.prettyprinted')

0

이것은 실제로 오래된 게시물이지만 여기에 정답을 사용하여 만든 내용이 있습니다. 내 솔루션은 jQuery도 사용합니다.

요점은 올바른 인쇄보기를 사용하고 올바른 서식을위한 모든 스타일 시트를 포함하며 대부분의 브라우저에서 지원되는 것입니다.

function PrintElem(elem, title, offset)
{
    // Title constructor
    title = title || $('title').text();
    // Offset for the print
    offset = offset || 0;

    // Loading start
    var dStart = Math.round(new Date().getTime()/1000),
        $html = $('html');
        i = 0;

    // Start building HTML
    var HTML = '<html';

    if(typeof ($html.attr('lang')) !== 'undefined') {
        HTML+=' lang=' + $html.attr('lang');
    }

    if(typeof ($html.attr('id')) !== 'undefined') {
        HTML+=' id=' + $html.attr('id');
    }

    if(typeof ($html.attr('xmlns')) !== 'undefined') {
        HTML+=' xmlns=' + $html.attr('xmlns');
    }

    // Close HTML and start build HEAD
    HTML+='><head>';

    // Get all meta tags
    $('head > meta').each(function(){
        var $this = $(this),
            $meta = '<meta';

        if(typeof ($this.attr('charset')) !== 'undefined') {
            $meta+=' charset=' + $this.attr('charset');
        }

        if(typeof ($this.attr('name')) !== 'undefined') {
            $meta+=' name=' + $this.attr('name');
        }

        if(typeof ($this.attr('http-equiv')) !== 'undefined') {
            $meta+=' http-equiv=' + $this.attr('http-equiv');
        }

        if(typeof ($this.attr('content')) !== 'undefined') {
            $meta+=' content=' + $this.attr('content');
        }

        $meta+=' />';

        HTML+= $meta;
        i++;

    }).promise().done(function(){

        // Insert title
        HTML+= '<title>' + title  + '</title>';

        // Let's pickup all CSS files for the formatting
        $('head > link[rel="stylesheet"]').each(function(){
            HTML+= '<link rel="stylesheet" href="' + $(this).attr('href') + '" />';
            i++;
        }).promise().done(function(){
            // Print setup
            HTML+= '<style>body{display:none;}@media print{body{display:block;}}</style>';

            // Finish HTML
            HTML+= '</head><body>';
            HTML+= '<h1 class="text-center mb-3">' + title  + '</h1>';
            HTML+= elem.html();
            HTML+= '</body></html>';

            // Open new window
            var printWindow = window.open('', 'PRINT', 'height=' + $(window).height() + ',width=' + $(window).width());
            // Append new window HTML
            printWindow.document.write(HTML);

            printWindow.document.close(); // necessary for IE >= 10
            printWindow.focus(); // necessary for IE >= 10*/
console.log(printWindow.document);
            /* Make sure that page is loaded correctly */
            $(printWindow).on('load', function(){                   
                setTimeout(function(){
                    // Open print
                    printWindow.print();

                    // Close on print
                    setTimeout(function(){
                        printWindow.close();
                        return true;
                    }, 3);

                }, (Math.round(new Date().getTime()/1000) - dStart)+i+offset);
            });
        });
    });
}

나중에 간단하게 다음과 같은 것이 필요합니다.

$(document).on('click', '.some-print', function() {
    PrintElem($(this), 'My Print Title');
    return false;
});

시도 해봐.


-1

내가 한 것처럼 이미지를 인쇄 해야하는 경우를 대비하여 최상의 답변과 동일합니다.

이미지를 인쇄하려는 경우 :

function printElem(elem)
    {
        Popup(jQuery(elem).attr('src'));
    }

    function Popup(data) 
    {
        var mywindow = window.open('', 'my div', 'height=400,width=600');
        mywindow.document.write('<html><head><title>my div</title>');
        mywindow.document.write('</head><body >');
        mywindow.document.write('<img src="'+data+'" />');
        mywindow.document.write('</body></html>');

        mywindow.print();
        mywindow.close();

        return true;
    }

load팝업에 이벤트 가 없습니다 . 그렇지 않으면 이미지가로드되지 않아 빈 페이지가 인쇄됩니다. =>$(popup).load(function(){ popup.focus(); popup.print(); });
Tim Vermaelen

-4

가장 좋은 방법은 div의 내용을 서버에 제출하고 서버가 해당 내용을 새 창에 넣을 수있는 새 창을 여는 것입니다.

이것이 옵션이 아닌 경우 javascript와 같은 클라이언트 측 언어를 사용하여 해당 div를 제외한 페이지의 모든 것을 숨기고 페이지를 인쇄하십시오.


1
서버로 반송 할 필요가 없습니다. 브라우저 창을 열고 내용을 설정하고 인쇄 명령을 호출 할 수 있습니다.
Jonathon Faust

클라이언트에서 새 창을 만들 수 있습니다.
Pointy

1
Jonathon : 그 솔루션이 마음에 듭니다. 예제 코드가 있습니까?
usertest
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.