打印网页的特定部分


73

我正在尝试打印应用程序的特定部分。

该应用程序有一个用户列表,显示他们的名字和姓氏。单击用户时,我会弹出一个窗口,其中包含有关他们的更多详细信息。

我该如何只为我单击的用户打印弹出窗口?弹出窗口如下所示:

 <div id="user<?=$user->id;?>" class="popup">
      <div class="details">
           User details...
      </div>
      <a href="#print">Print</a>
 </div>

打印按钮仍然无法使用。


Answers:


153

您可以使用简单的JavaScript从页面上打印特定的div。

var prtContent = document.getElementById("your div id");
var WinPrint = window.open('', '', 'left=0,top=0,width=800,height=900,toolbar=0,scrollbars=0,status=0');
WinPrint.document.write(prtContent.innerHTML);
WinPrint.document.close();
WinPrint.focus();
WinPrint.print();
WinPrint.close();

34
如果使用此代码打印的div需要任何CSS来呈现所需的样式,请小心。如果确实如此,则必须确保也使用将其添加到页面中WinPrint.document.write(cssLinkTag)
Wally Lawless 2014年

如果我想改变方向怎么办?
2014年

这不起作用打印div时div包含从服务器端获取的数据:stackoverflow.com/questions/34206638/...
Core_Dumped

7
基于此答案的小提琴:jsfiddle.net/jdavidzapatab/6sctvg2z
David

@WallyLawless您能否提供一个示例,说明如何派生css标签?
卡恩斯

13

我做了这个jQuery扩展来打印所选元素的HTML: $('#div2').print();

$.fn.extend({
    print: function() {
        var frameName = 'printIframe';
        var doc = window.frames[frameName];
        if (!doc) {
            $('<iframe>').hide().attr('name', frameName).appendTo(document.body);
            doc = window.frames[frameName];
        }
        doc.document.body.innerHTML = this.html();
        doc.window.print();
        return this;
    }
});

看到它在这里行动。


Chrome不适用于我。另外,您应该尝试在答案中此处发布代码。
迈克,

7
我认为,作为一个社区,我们作为一个社区,实际上可以尝试通过注释并仅将这些该死的代码复制到我们自己身上,而不是吓跑他们,而不是疯狂地投票否定他们v_v不要指望每个人都如此熟悉StackOverflow礼节的复杂性……
fresskoma

谢谢,但是为什么不能添加CSS文件?
哈米德·雷扎

11

您将不得不打开一个仅包含您希望用户能够打印的信息的新窗口(或导航到新页面)

字幕:

function printInfo(ele) {
    var openWindow = window.open("", "title", "attributes");
    openWindow.document.write(ele.previousSibling.innerHTML);
    openWindow.document.close();
    openWindow.focus();
    openWindow.print();
    openWindow.close();
}

HTML:

<div id="....">
    <div>
        content to print
    </div><a href="#" onclick="printInfo(this)">Print</a>
</div>

这里有一些注意事项:锚点和包含要打印内容的div之间不得有空格


这太棒了!当然,如果您不希望在项目后添加打印链接,或者您希望它更漂亮,则会遇到一些挑战。我通过给href提供一个ID,将Print更改为不间断空格,并在其他地方使用getElementById引用click()事件来解决了这一难题。谢谢!!
Mmm

10

代替所有复杂的JavaScript,您实际上可以用以下简单的方法实现此目的CSS:只需使用两个CSS文件,一个用于常规屏幕显示,另一个用于显示您希望打印的内容。在后一个文件中,隐藏所有不需要打印的内容,仅显示弹出窗口。

记住要定义media两个CSS文件的属性:

<link rel="stylesheet" href="screen-css.css" media="all" />
<link rel="stylesheet" href="print-css.css" media="print" />

1
之所以制作复杂的JavaScript,是因为我有1个以上的按钮来选择要打印的区域。我使用css“ @media print {”隐藏按钮。
亚历山德罗·莱蒂埃里

5

只需使用CSS即可隐藏您不想打印的内容。当用户选择打印时-页面将查找“ media =“ print” CSS上查找有关页面布局的说明。

媒体=“打印” CSS按指示来隐藏我们不希望打印的内容。

<!-- CSS for the things we want to print (print view) -->
<style type="text/css" media="print">

#SCREEN_VIEW_CONTAINER{
        display: none;
    }
.other_print_layout{
        background-color:#FFF;
    }
</style>

<!-- CSS for the things we DO NOT want to print (web view) -->
<style type="text/css" media="screen">

   #PRINT_VIEW{
      display: none;
   }
.other_web_layout{
        background-color:#E0E0E0;
    }
</style>

<div id="SCREEN_VIEW_CONTAINER">
     the stuff I DO NOT want printed is here and will be hidden - 
     and not printed when the user selects print.
</div>

<div id="PRINT_VIEW">
     the stuff I DO want printed is here.
</div>

1
效果很好-非常简单明了-谢谢!:)
TV-C-15

3

这是我的增强版本,当我们要加载css文件或要打印的零件中有图像参考时。

在这些情况下,我们必须等到css文件或图像完全加载后才能调用print()函数。因此,我们最好将print()和close()函数调用移到html中。以下是代码示例:

var prtContent = document.getElementById("order-to-print");
var WinPrint = window.open('', '', 'left=0,top=0,width=384,height=900,toolbar=0,scrollbars=0,status=0');
WinPrint.document.write('<html><head>');
WinPrint.document.write('<link rel="stylesheet" href="assets/css/print/normalize.css">');
WinPrint.document.write('<link rel="stylesheet" href="assets/css/print/receipt.css">');
WinPrint.document.write('</head><body onload="print();close();">');
WinPrint.document.write(prtContent.innerHTML);
WinPrint.document.write('</body></html>');
WinPrint.document.close();
WinPrint.focus();

1

我有一个更好的选择,

首先按类别名称或ID分隔可打印和不可打印部分

window.onafterprint = onAfterPrint;

function print(){
  //hide the nonPrintable div  
}

function onAfterPrint(){
  // Visible the nonPrintable div
}
<input type="button" onclick="print()" value="Print"/>

就这样


我不会说更好,您应该明确地分享一个小例子。但这看起来是一种非常不错的方法。.printable例如可能有一个类。但是,这会与CSS混乱(例如固定位置)。
Ulysse BN

1

款式

 @media print {

       .no-print{
               display : none !important;
                }
              }

jQuery的

    function printInvoice()
 {
     printDiv = "#printDiv"; // id of the div you want to print
     $("*").addClass("no-print");
     $(printDiv+" *").removeClass("no-print");
     $(printDiv).removeClass("no-print");

     parent =  $(printDiv).parent();
     while($(parent).length)
     {
         $(parent).removeClass("no-print");
         parent =  $(parent).parent();
     }
     window.print();

 }

打印按钮HTML

<input type="button" onclick="printInvoice();" value="Print">

1

尝试这个:

  1. 将容器的innerHTML转储到iFrame中(加上所有特定于打印的CSS
  2. 打印iFrame内容。

JSFiddle中尝试一下(iframe在StackOverflow的预览中似乎不起作用)

您可以在此处看到代码,但由于StackOverflow渲染器中可能存在安全限制,因此无法使用。

const printButton = document.getElementById('print-button');

printButton.addEventListener('click', event => {
  // build the new HTML page
  const content = document.getElementById('name-card').innerHTML;
  const printHtml = `<html>
      <head>
          <meta charset="utf-8">
          <title>Name Card</title>
      </head>
      <body>${content}</body>
  </html>`;
      
  // get the iframe
  let iFrame = document.getElementById('print-iframe');
  
  // set the iFrame contents and print
  iFrame.contentDocument.body.innerHTML = printHtml;
  iFrame.focus();
    iFrame.contentWindow.print();
  
});
<h1>Print your name badge</h1>
<div id="name-card" class="card">
  <p>Hello my name is</p>
  <h2>Max Powers</h2>
</div>
<p>You will be required to wear your name badge at all times</p>
<a id="print-button" class="btn btn-primary">Print</a>

<iframe id="print-iframe" width="0" height="0"></iframe>



0

printPageArea()功能上,传递要打印的特定div ID。我从codexworld.com找到了这个JavaScript代码。

function printPageArea(areaID){
    var printContent = document.getElementById(areaID);
    var WinPrint = window.open('', '', 'width=900,height=650');
    WinPrint.document.write(printContent.innerHTML);
    WinPrint.document.close();
    WinPrint.focus();
    WinPrint.print();
    WinPrint.close();
}

完整的代码和教程可以在这里找到-如何使用JavaScript打印页面区域


0

我编写了一个名为PrintElements的微型JavaScript模块用于动态打印网页的各个部分。

它通过迭代选定的节点元素来工作,并且对于每个节点,它遍历DOM树直到BODY元素。在每个级别,包括初始级别(这是要打印的节点级别),它都将标记类(pe-preserve-print)附加到当前节点。然后,将另一个标记类(pe-no-print)附加到当前节点的所有同级上,但前提是pe-preserve-print它们上没有任何同级。作为第三步,它还将另一个类附加到保留的祖先元素上pe-preserve-ancestor

一个非常简单的补充性仅打印css将隐藏并显示各个元素。这种方法的优点是保留了所有样式,不会打开新窗口,不需要在许多DOM元素之间移动,并且通常对原始文档无害。

请参阅演示,或阅读相关文章以获取更多详细信息


0

这对我有用

使用jQuery和https://developer.mozilla.org/zh-CN/docs/Web/API/Window/open

  var $linkToOpenPrintDialog = $('#tvcPrintThisLinkId');
  var windowObjectReference = null;
  var windowFeatures = 'left=0,top=0,width=800,height=900,menubar=no,toolbar=no,location=yes,resizable=no,scrollbars=no,status=no';
  var windowFeaturesStyles = '<link rel="stylesheet" media="print" href="https://stackoverflow.com/wp-content/themes/salient-child/dist/css/app-print.css">';

  $linkToOpenPrintDialog.on('click', function(event) {
    openPrintDialog(this.href, this.target, 'tvcInnerCalculatorDivId', event);    
    return false;
  });

  function openPrintDialog(url, windowName, elementToOpen, event) {

    var elementContent = document.getElementById(elementToOpen);

    if(windowObjectReference == null || windowObjectReference.closed) {

      windowObjectReference = window.open( url, windowName, windowFeatures);
      windowObjectReference.document.write(windowFeaturesStyles);
      windowObjectReference.document.write(elementContent.innerHTML);
      windowObjectReference.document.close();
      windowObjectReference.focus();
      windowObjectReference.print();
      windowObjectReference.close();

    } else {
      windowObjectReference.focus();
    };

    event.preventDefault();
  }

app-print.css

@media print { 

  body { 
    margin: 0; 
    color: black; 
    background-color: white;
  } 

}

0

试试这个。

export function printSectionOfWebpage(sectionSelector) {
    const $body = jquery('body');
    const $sectionToPrint = jquery(sectionSelector);
    const $sectionToPrintParent = $sectionToPrint.parent();
    const $printContainer = jquery('<div style="position:relative;">');

    $printContainer.height($sectionToPrint.height()).append($sectionToPrint).prependTo($body);

    const $content = $body.children().not($printContainer).not('script').detach();

    /**
     * Needed for those who use Bootstrap 3.x, because some of
     * its `@media print` styles ain't play nicely when printing.
     */
    const $patchedStyle = jquery('<style media="print">')
        .text(
            `
          img { max-width: none !important; }
          a[href]:after { content: ""; }
        `
        )
        .appendTo('head');

    window.print();

    $body.prepend($content);
    $sectionToPrintParent.prepend($sectionToPrint);

    $printContainer.remove();
    $patchedStyle.remove();
}

请解释您的代码。这将帮助其他人了解您所做的事情。
刚在

-1

试试这个很棒的ink-html

import print from 'ink-html'
// const print = require('ink-html').default

// js
print(window.querySelector('#printable'))
// Vue.js
print(this.$refs.printable.$el)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.