我有以下html代码:

 <!DOCTYPE html>
<html>
    <body>
        <p>don't print this to pdf</p>
        <div id="pdf">
            <p><font size="3" color="red">print this to pdf</font></p>
        </div>
    </body>
</html>
 


我要做的就是打印到pdf,无论在div中找到的ID为“ pdf”的任何内容。这必须使用JavaScript来完成。然后应使用“ foobar.pdf”的文件名自动下载“ pdf”文档。

我一直在使用jspdf来执行此操作,但是它唯一具有的功能是“文本”,仅接受字符串值。我想将HTML提交给jspdf,而不是文本。

评论

如上所述,我不想使用“文本”功能。我想给它HTML。您的链接仅处理纯文本,而不处理html

jsPDF确实具有fromHTML函数;请参见以下网址的“ HTML Renderer”示例:mrrio.github.io/jsPDF

在此处尝试jsPDF教程freakyjolly.com/create-multipage-html-pdf-jspdf-html2canvas

#1 楼

jsPDF可以使用插件。为了使其能够打印HTML,您必须包括某些插件,因此必须执行以下操作:


转到https://github.com/MrRio/jsPDF并下载最新版本。
在您的项目中包含以下脚本:


jspdf.js
jspdf.plugin.from_html.js
jspdf.plugin。 split_text_to_size.js
jspdf.plugin.standard_fonts_metrics.js



如果要忽略某些元素,则必须用ID标记它们,您可以然后在jsPDF的特殊元素处理程序中忽略。因此,您的HTML应该如下所示:

 <!DOCTYPE html>
<html>
  <body>
    <p id="ignorePDF">don't print this to pdf</p>
    <div>
      <p><font size="3" color="red">print this to pdf</font></p>
    </div>
  </body>
</html>
 


然后,您使用以下JavaScript代码来在PopUp中打开创建的PDF:

var doc = new jsPDF();          
var elementHandler = {
  '#ignorePDF': function (element, renderer) {
    return true;
  }
};
var source = window.document.getElementsByTagName("body")[0];
doc.fromHTML(
    source,
    15,
    15,
    {
      'width': 180,'elementHandlers': elementHandler
    });

doc.output("dataurlnewwindow");


对我来说,这创建了一个漂亮而整洁的PDF,其中仅包含“将其打印为pdf”行。
请注意,特殊元素处理程序仅处理当前版本中的ID,这在GitHub Issue中也有说明。它指出:


因为对节点树中的每个元素都进行了匹配,所以我希望尽可能快地进行匹配。在这种情况下,这意味着“仅元素ID匹配”。元素ID仍以jQuery样式“ #id”完成,但这并不意味着支持所有jQuery选择器。


因此,用类选择器(例如.ignorePDF)代替'#ignorePDF'对我不起作用。相反,您必须为每个要忽略的元素添加相同的处理程序,例如:

var elementHandler = {
  '#ignoreElement': function (element, renderer) {
    return true;
  },
  '#anotherIdToBeIgnored': function (element, renderer) {
    return true;
  }
};


从示例还可以看出选择“ a”或“ li”之类的标签。不过,对于大多数用例来说,这可能是无限制的:


我们支持特殊的元素处理程序。使用jQuery-style
ID选择器注册ID或节点名称。 (“ #iAmID”,“ div”,“ span”等)
目前不支持任何其他类型的选择器(
复合的类)。


要添加的一个非常重要的事情是您丢失了所有样式信息(CSS)。幸运的是,jsPDF能够很好地格式化h1,h2,h3等格式,这足以满足我的目的。另外,它将仅打印文本节点内的文本,这意味着它将不打印textareas等的值。示例:

 <body>
  <ul>
    <!-- This is printed as the element contains a textnode -->        
    <li>Print me!</li>
  </ul>
  <div>
    <!-- This is not printed because jsPDF doesn't deal with the value attribute -->
    <input type="textarea" value="Please print me, too!">
  </div>
</body>
 


评论


我猜元素处理程序可以是一个类吗?从语义上讲,这将更符合HTML5标准。 ID不仅在CSS中具有过多的特殊性,而且还必须是唯一的。

–紧急
2015年1月3日,7:28

不,据我所知,类目前不是有效的选择器,如它们的示例所述:“我们支持特殊的元素处理程序。请使用jQuery样式的ID选择器为ID或节点名称注册它们。(“#iAmID”, “”(“ div”,“ span”等)。目前不支持任何其他类型的选择器(类,复合类)。不过,如果标签名称与您的用例相符并且没有在页面上隐藏其他重要元素,则仍可以使用标签名称。

–snrlx
2015年1月6日在9:02



他们在其页面parall.ax/products/jspdf上声明通过垫片支持IE6 +。我自己还没有尝试过。

–snrlx
15年3月6日在10:41

@snrlx我得到空白的pdf并出现此错误:renderer.pdf.sHashCode不是函数

–莉萨·所罗门(Lisa Solomon)
16 Mar 23 '16 at 3:39

“如果要忽略某些元素,则必须用ID标记它们”-一个很棒的库,被倒置的需求毁坏了。 OP希望打印单个
,它可能是数百个之一-因此他必须标记所有不需要的DOM元素?

–莫格说要恢复莫妮卡
17年1月24日,19:13



#2 楼

这是简单的解决方案。这对我有用。您可以使用javascript打印概念并将其简单保存为pdf。

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
    <script type="text/javascript">
        $("#btnPrint").live("click", function () {
            var divContents = $("#dvContainer").html();
            var printWindow = window.open('', '', 'height=400,width=800');
            printWindow.document.write('<html><head><title>DIV Contents</title>');
            printWindow.document.write('</head><body >');
            printWindow.document.write(divContents);
            printWindow.document.write('</body></html>');
            printWindow.document.close();
            printWindow.print();
        });
    </script>
</head>
<body>
    <form id="form1">
    <div id="dvContainer">
        This content needs to be printed.
    </div>
    <input type="button" value="Print Div Contents" id="btnPrint" />
    </form>
</body>
</html>


评论


“并且简单地将其另存为pdf”-我错过了这一部分。你怎么做呢?

–莫格说要恢复莫妮卡
17年1月24日在19:16

这对我有用,为了解决CSS样式问题,我创建了另一个名为printPDF.css的css文件,并使用链接标记添加了上述示例中的代码:printWindow.document.write(' DIV内容</ title>'); printWindow.document.write('<link rel =“ stylesheet” href =“ ../ css / printPDF.css” />');; printWindow.document.write('</ head> <body>'); <br /> <br /> –Prime_Coder <br /> 17年2月16日在6:43 <br /><hr />一些评论:1)您不需要特定的样式表即可进行打印。在您当前的样式表中,执行以下操作:@media print {.pageBreak {page-break-before:always; } .labelPdf {font-weight:bold; font-size:20px; } .noPrintPdf {display:none;并根据需要使用这些类。 2).live(“ click”,...)对我不起作用,因此我改用.on(“ click”,...)。 <br /> <br /> – Davidson Lima <br /> 17年9月13日14:19 <br /> <br /> <br /><hr />@DavidsonLima此代码创建一个新窗口,该窗口将看不到旧窗口的CSS。这就是为什么它“忽略” css,而不忽略,只是在新窗口中没有加载。只需将其加载到头部,它将被渲染。 <br /> <br /> –卢卡斯·里西斯(Lukas Liesis) <br /> 18年5月6日在13:40 <br /><hr />万一有人尝试使用Angular做到这一点,请将CSS文件放在资产文件夹中。 <br /> <br /> – rgantla <br /> 19年3月14日在16:34 <br /><hr /></div></div><div class='answer'><h3 style='font-size: 16px;background: #434a54;color: #fff;padding: 10px;margin: 10px 0;'> #3 楼</h3>您可以使用autoPrint()并将输出设置为'dataurlnewwindow',如下所示:<br /> <br /> <pre><code>function printPDF() { var printDoc = new jsPDF(); printDoc.fromHTML($('#pdf').get(0), 10, 10, {'width': 180}); printDoc.autoPrint(); printDoc.output("dataurlnewwindow"); // this opens a new popup, after this the PDF opens the print window view but there are browser inconsistencies with how this is handled } </code></pre> <br /><br /><div class='comment'><h4 style='font-size: 14px;background: #f5f5f5;color: #2fa4e7;padding: 10px;margin: 10px 0;'>评论</h4><hr />我很好奇,这对OP以外的其他人有作用吗?通过阅读代码,我似乎了解到它仅适用于具有ID的元素。无论如何,我可能不知道如何完成这项工作,这可能比这还要复杂。 <br /> <br /> –迈克尔 <br /> 2014年4月25日在15:31 <br /><hr />从我观察到的,非常讽刺的是,fromHTML仅在作为参数发送的元素不包含任何HTML时才起作用:仅支持纯文本。 Kinda杀死了imo整个事情的目的。 <br /> <br /> –迈克尔 <br /> 2014-4-25 15:40 <br /> <br /> <br /><hr />为我完美地工作。您不需要传入的元素具有ID。这就是复制者找到他想要传递的节点的方式。此外,该解决方案也可以在没有“ printDoc.autoPrint()”的情况下使用。如果要在代码中保留此特定行,则需要包括autoPrint-Plugin。 <br /> <br /> –snrlx <br /> 14年7月18日在11:52 <br /><hr /></div></div><div class='answer'><h3 style='font-size: 16px;background: #434a54;color: #fff;padding: 10px;margin: 10px 0;'> #4 楼</h3>如果您需要下载特定页面的pdf文件,只需添加这样的按钮<br /> <br /> <pre><code><h4 onclick="window.print();"> Print </h4> </code></pre> <br /> <br />使用window.print()打印所有页面,而不仅仅是div <br / ><br /><div class='comment'><h4 style='font-size: 14px;background: #f5f5f5;color: #2fa4e7;padding: 10px;margin: 10px 0;'>评论</h4><hr />如果要创建iframe的可下载pdf文件,请添加一个简单的补充,然后使用开发人员控制台:document.querySelector(“#myIframe”)。contentWindow.print() <br /> <br /> – ioCron <br /> 19-3-14在12:32 <br /> <br /> <br /><hr /></div></div><div class='answer'><h3 style='font-size: 16px;background: #434a54;color: #fff;padding: 10px;margin: 10px 0;'> #5 楼</h3>如前所述,您应该使用jsPDF和html2canvas。我还在jsPDF问题中发现了一个函数,该函数可自动将pdf拆分为多个页面(源)。<br /> <br /> <pre><code>function makePDF() { var quotes = document.getElementById('container-fluid'); html2canvas(quotes, { onrendered: function(canvas) { //! MAKE YOUR PDF var pdf = new jsPDF('p', 'pt', 'letter'); for (var i = 0; i <= quotes.clientHeight/980; i++) { //! This is all just html2canvas stuff var srcImg = canvas; var sX = 0; var sY = 980*i; // start 980 pixels down for every new page var sWidth = 900; var sHeight = 980; var dX = 0; var dY = 0; var dWidth = 900; var dHeight = 980; window.onePageCanvas = document.createElement("canvas"); onePageCanvas.setAttribute('width', 900); onePageCanvas.setAttribute('height', 980); var ctx = onePageCanvas.getContext('2d'); // details on this usage of this function: // https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Using_images#Slicing ctx.drawImage(srcImg,sX,sY,sWidth,sHeight,dX,dY,dWidth,dHeight); // document.body.appendChild(canvas); var canvasDataURL = onePageCanvas.toDataURL("image/png", 1.0); var width = onePageCanvas.width; var height = onePageCanvas.clientHeight; //! If we're on anything other than the first page, // add another page if (i > 0) { pdf.addPage(612, 791); //8.5" x 11" in pts (in*72) } //! now we declare that we're working on that page pdf.setPage(i+1); //! now we add content to that page! pdf.addImage(canvasDataURL, 'PNG', 20, 40, (width*.62), (height*.62)); } //! after the for loop is finished running, we save the pdf. pdf.save('test.pdf'); } }); } </code></pre> <br /><br /><div class='comment'><h4 style='font-size: 14px;background: #f5f5f5;color: #2fa4e7;padding: 10px;margin: 10px 0;'>评论</h4><hr />它不会转换图像 <br /> <br /> – Probosckie <br /> 17 Mar 4 '17 at 9:11 <br /><hr />感谢您的回答,您能否提供有关如何将其转换为A4页面格式的任何提示? <br /> <br /> –约翰内斯·马特沃索扬(Johannes Matevosyan) <br /> 18年5月14日上午10:16 <br /><hr />这实际上并不是一个好的矢量pdf,它使用画布制作了很多位图,并将它们堆叠为图像。结果有很多缺点-大,低质量,无法从PDF复制和粘贴等。 <br /> <br /> –罗马Zenka <br /> 19年1月4日在19:10 <br /><hr />jsfiddle.net/jfr34mgL我写了这个例子来覆盖多页图像 <br /> <br /> – Ryan Loggerythm <br /> 9月21日21:15 <br /><hr /></div></div><div class='answer'><h3 style='font-size: 16px;background: #434a54;color: #fff;padding: 10px;margin: 10px 0;'> #6 楼</h3><br />没有依赖关系,纯JS <br />要添加CSS或图像-不要使用相对URL,请使用完整URL <code>http://...domain.../path.css</code>左右。它创建了单独的HTML文档,没有主要内容。<br />您还可以将图像作为base64嵌入<br /> <br />这为我服务了很多年:<br /> <br /> <pre><code>export default function printDiv({divId, title}) { let mywindow = window.open('', 'PRINT', 'height=650,width=900,top=100,left=150'); mywindow.document.write(`<html><head><title>${title}</title>`); mywindow.document.write('</head><body >'); mywindow.document.write(document.getElementById(divId).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; } </code></pre> <br /><br /><div class='comment'><h4 style='font-size: 14px;background: #f5f5f5;color: #2fa4e7;padding: 10px;margin: 10px 0;'>评论</h4><hr />这样做的问题是pdf中不会包含任何CSS效果。 <br /> <br /> –Shadab Faiz <br /> 18年5月7日在9:38 <br /><hr />@ShadabFaiz它将但可能与主窗口不同。您仍然可以在此html中添加自定义CSS。 <br /> <br /> –卢卡斯·里西斯(Lukas Liesis) <br /> 18年5月7日在19:26 <br /> <br /> <br /><hr />是的同意您可以在窗口中添加CSS,但是如何在pdf文件中打印结果? <br /> <br /> – Mirko Cianfarani <br /> 18年5月29日在16:25 <br /><hr />但是不渲染图像。 <br /> <br /> –简Pi <br /> 18-09-26在10:56 <br /><hr />我喜欢这个!在这里和那里进行一些调整,看起来不错。还有一件小事不要去除<body>处的多余间距,它需要这个:P <br /> <br /> – phrogg <br /> 2月18日上午10:17 <br /><hr /></div></div><div class='answer'><h3 style='font-size: 16px;background: #434a54;color: #fff;padding: 10px;margin: 10px 0;'> #7 楼</h3>一种方法是使用window.print()函数。不需要任何库<br /> <br />专业版<br /> <br /> 1.不需要外部库。<br /> <br /> 2.我们也只能打印选定的身体部位。 <br /> <br /> 3.没有css冲突和js问题。<br /> <br /> 4.Core html / js功能<br /> <br /> ---只需在下面添加代码<br / > <br /> CSS到<br /> <br /> <pre><code>@media print { body * { visibility: hidden; // part to hide at the time of print -webkit-print-color-adjust: exact !important; // not necessary use if colors not visible } #printBtn { visibility: hidden !important; // To hide } #page-wrapper * { visibility: visible; // Print only required part text-align: left; -webkit-print-color-adjust: exact !important; } } </code></pre> <br /> <br /> JS代码-在btn click上调用bewlow函数<br /> <br /> <pre><code>$scope.printWindow = function () { window.print() } </code></pre> <br /> <br />注意:在每个CSS对象中使用!important <br /> <br />示例-<br /> <br /> <pre><code>.legend { background: #9DD2E2 !important; } </code></pre> <br /><br /><div class='comment'><h4 style='font-size: 14px;background: #f5f5f5;color: #2fa4e7;padding: 10px;margin: 10px 0;'>评论</h4><hr />浏览器的打印功能存在问题。用户通常为“打印”视图选择默认选项(页边距,页面大小等)。因此,在没有培训用户的情况下很难生成具有所需样式的所需PDF,这更加困难并且几乎不可能... <br /> <br /> –拉赫玛特·阿里(Rahmat Ali) <br /> 19-09-27在10:59 <br /><hr /></div></div><div class='answer'><h3 style='font-size: 16px;background: #434a54;color: #fff;padding: 10px;margin: 10px 0;'> #8 楼</h3>我使用jspdf和html2canvas进行css渲染,并导出特定div的内容,因为这是我的代码<br /> <br /> <pre><code>$(document).ready(function () { let btn=$('#c-oreder-preview'); btn.text('download'); btn.on('click',()=> { $('#c-invoice').modal('show'); setTimeout(function () { html2canvas(document.querySelector("#c-print")).then(canvas => { //$("#previewBeforeDownload").html(canvas); var imgData = canvas.toDataURL("image/jpeg",1); var pdf = new jsPDF("p", "mm", "a4"); var pageWidth = pdf.internal.pageSize.getWidth(); var pageHeight = pdf.internal.pageSize.getHeight(); var imageWidth = canvas.width; var imageHeight = canvas.height; var ratio = imageWidth/imageHeight >= pageWidth/pageHeight ? pageWidth/imageWidth : pageHeight/imageHeight; //pdf = new jsPDF(this.state.orientation, undefined, format); pdf.addImage(imgData, 'JPEG', 0, 0, imageWidth * ratio, imageHeight * ratio); pdf.save("invoice.pdf"); //$("#previewBeforeDownload").hide(); $('#c-invoice').modal('hide'); }); },500); }); }); </code></pre> <br /><br /><div class='comment'><h4 style='font-size: 14px;background: #f5f5f5;color: #2fa4e7;padding: 10px;margin: 10px 0;'>评论</h4><hr />这项工作,但它将内容转换为图像 <br /> <br /> – Samad <br /> 19年8月17日在8:13 <br /><hr />另外,如何设置分页符,以便如果内容/图像不适合当前页面,则将其打印在新页面上? <br /> <br /> –SHEKHAR SHETE <br /> 3月5日5:53 <br /><hr /></div></div><div class='answer'><h3 style='font-size: 16px;background: #434a54;color: #fff;padding: 10px;margin: 10px 0;'> #9 楼</h3>使用pdfMake.js和此要点。 <br /> <br />(我在这里找到了Gist以及指向html-to-pdfmake软件包的链接,但最终我暂时不使用它。)<br /> <br />在<code>npm install pdfmake</code>之后保存了<code>htmlToPdf.js</code>中的要点我是这样使用的:<br /> <br /> <pre class =“ lang-js prettyprint-override”> <code>const pdfMakeX = require('pdfmake/build/pdfmake.js'); const pdfFontsX = require('pdfmake-unicode/dist/pdfmake-unicode.js'); pdfMakeX.vfs = pdfFontsX.pdfMake.vfs; import * as pdfMake from 'pdfmake/build/pdfmake'; import htmlToPdf from './htmlToPdf.js'; var docDef = htmlToPdf(`<b>Sample</b>`); pdfMake.createPdf({content:docDef}).download('sample.pdf'); </code> </pre> <br /> <br />备注:<br /> <br /> <br />我的用例是从markdown文档(带有markdown-it)创建相关的html,然后生成pdf,然后上传其二进制内容(可以通过<code>pdfMake</code>的<code>getBuffer()</code>函数获得),全部来自浏览器。生成的pdf证明比使用我尝试过的其他解决方案的这种html更好。<br />我对我接受的答案中从<code>jsPDF.fromHTML()</code>得到的结果不满意,因为该解决方案很容易与特殊字符混淆在我的HTML中显然被解释为一种标记,并且完全弄乱了生成的PDF。<br />使用基于画布的解决方案(例如已弃用的<code>jsPDF.from_html()</code>函数,不要与接受的答案相混淆)不是对我来说是一个选项,因为我希望生成的PDF中的文本是可粘贴的,而基于画布的解决方案则生成基于位图的PDF。<br />直接降价到md到pdf之类的pdf转换器仅在服务器端使用,不适用于我。<br />对我来说,使用浏览器的打印功能将不起作用,因为我不想显示生成的PDF,而是上传其二进制内容。 <br /> <br /><br /><div class='comment'><h4 style='font-size: 14px;background: #f5f5f5;color: #2fa4e7;padding: 10px;margin: 10px 0;'>评论</h4><hr />如果我正确阅读了代码,这不支持CSS边框样式(例如在表格上),对吗? <br /> <br /> – ninjagecko <br /> 19-10-26在4:16 <br /><hr />不在主题上,我使用pdfmake来创建内容不是来自html的pdf。我的问题是:当使用其方法pdfMake.createPdf(docDefinition).open()时,如何提供自己的特定文件名而不是随机文件名? <br /> <br /> – Lex Soft <br /> 7月22日15:31 <br /><hr />现在成为主题,您提到的要点不存在。您说最终没有使用html-to-pdfmake的问题是什么?我在github中看到它最近仍在维护。 <br /> <br /> – Lex Soft <br /> 7月22日15:50 <br /><hr /></div></div><div class='answer'><h3 style='font-size: 16px;background: #434a54;color: #fff;padding: 10px;margin: 10px 0;'> #10 楼</h3>如果要导出表,可以查看Shield UI Grid小部件提供的此导出示例。<br /> <br />通过扩展如下配置来完成:<br /> <br / > <pre><code>... exportOptions: { proxy: "/filesaver/save", pdf: { fileName: "shieldui-export", author: "John Smith", dataSource: { data: gridData }, readDataSource: true, header: { cells: [ { field: "id", title: "ID", width: 50 }, { field: "name", title: "Person Name", width: 100 }, { field: "company", title: "Company Name", width: 100 }, { field: "email", title: "Email Address" } ] } } } ... </code></pre> <br /><br /><div class='comment'><h4 style='font-size: 14px;background: #f5f5f5;color: #2fa4e7;padding: 10px;margin: 10px 0;'>评论</h4><hr />“导出为PDF”功能导致PDF文档为空。 <br /> <br /> –理查德·纳莱辛斯基(Richard Nalezynski) <br /> 16-11-10在2:46 <br /> <br /> <br /><hr />您的终端上的配置可能有误...如果需要,请发布带有shieldui标签的问题 <br /> <br /> –弗拉基米尔·乔治(Vladimir Georgiev) <br /> 17年8月21日在9:59 <br /><hr /></div></div><div class='answer'><h3 style='font-size: 16px;background: #434a54;color: #fff;padding: 10px;margin: 10px 0;'> #11 楼</h3>我能够获得jsPDF来从div打印动态创建的表。<br /> <br /> <pre><code>$(document).ready(function() { $("#pdfDiv").click(function() { var pdf = new jsPDF('p','pt','letter'); var specialElementHandlers = { '#rentalListCan': function (element, renderer) { return true; } }; pdf.addHTML($('#rentalListCan').first(), function() { pdf.save("caravan.pdf"); }); }); }); </code></pre> <br /> <br />与Chrome和Firefox兼容...在IE中格式化全部失败。<br /> <br />我还包括这些:<br /> <br /> <pre><code><script src="js/jspdf.js"></script> <script src="js/jspdf.plugin.from_html.js"></script> <script src="js/jspdf.plugin.addhtml.js"></script> <script src="//mrrio.github.io/jsPDF/dist/jspdf.debug.js"></script> <script src="http://html2canvas.hertzen.com/build/html2canvas.js"></script> <script type="text/javascript" src="./libs/FileSaver.js/FileSaver.js"></script> <script type="text/javascript" src="./libs/Blob.js/Blob.js"></script> <script type="text/javascript" src="./libs/deflate.js"></script> <script type="text/javascript" src="./libs/adler32cs.js/adler32cs.js"></script> <script type="text/javascript" src="js/jspdf.plugin.addimage.js"></script> <script type="text/javascript" src="js/jspdf.plugin.sillysvgrenderer.js"></script> <script type="text/javascript" src="js/jspdf.plugin.split_text_to_size.js"></script> <script type="text/javascript" src="js/jspdf.plugin.standard_fonts_metrics.js"></script> </code></pre> <br /><br /><div class='comment'><h4 style='font-size: 14px;background: #f5f5f5;color: #2fa4e7;padding: 10px;margin: 10px 0;'>评论</h4><hr />您能发表例子吗,您如何通过html <br /> <br /> – Erum <br /> 15年4月15日在11:50 <br /><hr />但是您的代码是<script src =“ html2canvas.hertzen.com/build/html2canvas.js”> </…>,这意味着它需要互联网吗? <br /> <br /> – Erum <br /> 15年4月15日在12:00 <br /><hr />@Erum,您可以下载文件。 <br /> <br /> –爱德华多·库莫(Eduardo Cuomo) <br /> 16年6月26日在22:52 <br /><hr /></div></div><div class='answer'><h3 style='font-size: 16px;background: #434a54;color: #fff;padding: 10px;margin: 10px 0;'> #12 楼</h3>要将div捕获为PDF,可以使用https://grabz.it解决方案。它具有一个简单,灵活的JavaScript API,可让您捕获div或span等单个HTML元素的内容。<br /> <br />要实现它,您首先需要获取一个应用密钥和机密,然后下载(免费)SDK。 <br /> <br />再举一个例子。<br /> <br />假设您拥有HTML:<br /> <br /> <pre><code><div id="features"> <h4>Acme Camera</h4> <label>Price</label>9<br /> <label>Rating</label>4.5 out of 5 </div> <p>Cras ut velit sed purus porttitor aliquam. Nulla tristique magna ac libero tempor, ac vestibulum felisvulput ate. Nam ut velit eget risus porttitor tristique at ac diam. Sed nisi risus, rutrum a metus suscipit, euismod tristique nulla. Etiam venenatis rutrum risus at blandit. In hac habitasse platea dictumst. Suspendisse potenti. Phasellus eget vehicula felis.</p> </code></pre> <br /> <br />捕获下面的内容您将需要的功能ID:<br /> <br /> <pre><code>//add the sdk <script type="text/javascript" src="grabzit.min.js"></script> <script type="text/javascript"> //login with your key and secret. GrabzIt("KEY", "SECRET").ConvertURL("http://www.example.com/my-page.html", {"target": "#features", "format": "pdf"}).Create(); </script> </code></pre> <br /> <br />请注意<code>target: #feature</code>。 <code>#feature</code>是您的CSS选择器,就像前面的示例一样。现在,在加载页面时,现在将在与脚本标签相同的位置创建图像屏幕快照,其中将包含功能div的所有内容,仅包含其他内容。<br /> <br />其他配置和您可以对div屏幕截图机制进行的自定义,请在此处查看它们<br /><br /></div><div class='answer'><h3 style='font-size: 16px;background: #434a54;color: #fff;padding: 10px;margin: 10px 0;'> #13 楼</h3>此示例非常有用。<br /> <pre><code><button onclick="genPDF()">Generate PDF</button> <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.min.js"></script> <script> function genPDF() { var doc = new jsPDF(); doc.text(20, 20, 'Hello world!'); doc.text(20, 30, 'This is client-side Javascript, pumping out a PDF.'); doc.addPage(); doc.text(20, 20, 'Do you like that?'); doc.save('Test.pdf'); } </script> </code></pre> <br /><br /></div> </div> <div class="post-footer"><b>本文标签:</b> <a href="http://129.226.226.195/tags/javascript/" target="_blank"> javascript </a> </div> </div> <div class="box boxmt nearbypost"> <div class="alignleft"><a href="http://129.226.226.195/post/11307.html" >信任库与密钥库-使用keytool创建</a></div> <div class="alignright"><a href="http://129.226.226.195/post/11309.html">C中的char数组和char指针有什么区别?</a></div> </div> </div> <div class="aside"> <div class="box widget" id="divTags"> <div class="title">标签列表</div><ul><li><a href="http://129.226.226.195/tags/java/">java<span class="tag-count"> (11)</span></a></li> <li><a href="http://129.226.226.195/tags/r/">r<span class="tag-count"> (3)</span></a></li> <li><a href="http://129.226.226.195/tags/r-faq/">r-faq<span class="tag-count"> (3)</span></a></li> <li><a href="http://129.226.226.195/tags/javascript/">javascript<span class="tag-count"> (17)</span></a></li> <li><a href="http://129.226.226.195/tags/jquery/">jquery<span class="tag-count"> (3)</span></a></li> <li><a href="http://129.226.226.195/tags/asynchronous/">asynchronous<span class="tag-count"> (2)</span></a></li> <li><a href="http://129.226.226.195/tags/php/">php<span class="tag-count"> (17)</span></a></li> <li><a href="http://129.226.226.195/tags/mysql/">mysql<span class="tag-count"> (7)</span></a></li> <li><a href="http://129.226.226.195/tags/sql/">sql<span class="tag-count"> (3)</span></a></li> <li><a href="http://129.226.226.195/tags/html/">html<span class="tag-count"> (2)</span></a></li> <li><a href="http://129.226.226.195/tags/regex/">regex<span class="tag-count"> (2)</span></a></li> <li><a href="http://129.226.226.195/tags/arrays/">arrays<span class="tag-count"> (2)</span></a></li> <li><a href="http://129.226.226.195/tags/variables/">variables<span class="tag-count"> (3)</span></a></li> <li><a href="http://129.226.226.195/tags/warnings/">warnings<span class="tag-count"> (2)</span></a></li> <li><a href="http://129.226.226.195/tags/language-agnostic/">language-agnostic<span class="tag-count"> (2)</span></a></li> <li><a href="http://129.226.226.195/tags/c%2B%2B/">c++<span class="tag-count"> (9)</span></a></li> <li><a href="http://129.226.226.195/tags/c%2B%2B-faq/">c++-faq<span class="tag-count"> (8)</span></a></li> <li><a href="http://129.226.226.195/tags/parsing/">parsing<span class="tag-count"> (2)</span></a></li> <li><a href="http://129.226.226.195/tags/debugging/">debugging<span class="tag-count"> (5)</span></a></li> <li><a href="http://129.226.226.195/tags/c/">c<span class="tag-count"> (3)</span></a></li> <li><a href="http://129.226.226.195/tags/error-handling/">error-handling<span class="tag-count"> (3)</span></a></li> <li><a href="http://129.226.226.195/tags/python/">python<span class="tag-count"> (10)</span></a></li> <li><a href="http://129.226.226.195/tags/pandas/">pandas<span class="tag-count"> (3)</span></a></li> <li><a href="http://129.226.226.195/tags/android/">android<span class="tag-count"> (3)</span></a></li> <li><a href="http://129.226.226.195/tags/list/">list<span class="tag-count"> (3)</span></a></li> </ul> </div><div class="box widget" id="divPrevious"> <div class="title">最近发表</div><ul><li><a href="http://129.226.226.195/post/18326.html">IP地址错误的错误掩码</a></li> <li><a href="http://129.226.226.195/post/18325.html">在Cisco IOS中自动进行配置备份(每分钟)</a></li> <li><a href="http://129.226.226.195/post/18324.html">VRRP和HSRP有什么区别?</a></li> <li><a href="http://129.226.226.195/post/18323.html">IP地址如何映射到MAC地址?</a></li> <li><a href="http://129.226.226.195/post/18322.html">网站可以识别我的MAC地址吗?</a></li> <li><a href="http://129.226.226.195/post/18321.html">在STP中如何选择根桥?</a></li> <li><a href="http://129.226.226.195/post/18320.html">为什么要使用三根以太网电缆将交换机连接到路由器?</a></li> <li><a href="http://129.226.226.195/post/18319.html">为什么10.1.255.255是无效的广播地址?</a></li> <li><a href="http://129.226.226.195/post/18318.html">为什么将IP地址分配给每个接口而不是设备?这将意味着什么?</a></li> <li><a href="http://129.226.226.195/post/18317.html">为什么Visual Studio 2013不愿意运行我的Web性能/负载测试?</a></li> <li><a href="http://129.226.226.195/post/18316.html">对测试代码了解太多会不利吗?</a></li> <li><a href="http://129.226.226.195/post/18315.html">如何隔离错误?</a></li> <li><a href="http://129.226.226.195/post/18314.html">如何使用Selenium和WebDriver清除localStorage</a></li> <li><a href="http://129.226.226.195/post/18313.html">评估测试项目</a></li> <li><a href="http://129.226.226.195/post/18312.html">我如何说服管理层我们需要一个正式的质量保证部门?</a></li> <li><a href="http://129.226.226.195/post/18311.html">FluentWait与WebDriverWait有何不同?</a></li> <li><a href="http://129.226.226.195/post/18310.html">简历和求职建议-从开发到测试的职业转变</a></li> <li><a href="http://129.226.226.195/post/18309.html">您如何等待Selenium 2中的jQuery Ajax调用完成</a></li> <li><a href="http://129.226.226.195/post/18308.html">在持续开发下测试应用程序</a></li> <li><a href="http://129.226.226.195/post/18307.html">Selenium的页面加载默认超时是多少?</a></li> <li><a href="http://129.226.226.195/post/18306.html">IT项目中软件测试的真正商业价值是什么?</a></li> <li><a href="http://129.226.226.195/post/18305.html">系统测试与系统集成测试(SIT)有何不同?</a></li> <li><a href="http://129.226.226.195/post/18304.html">如何找到我们的“质量保证流程”的弱点?</a></li> <li><a href="http://129.226.226.195/post/18303.html">测试人员应如何处理生产中发现的错误?</a></li> <li><a href="http://129.226.226.195/post/18302.html">如果我不使用TDD但想过渡到敏捷,那我应该回去创建那些单元测试吗?</a></li> <li><a href="http://129.226.226.195/post/18301.html">代码覆盖率和测试覆盖率有什么区别?</a></li> <li><a href="http://129.226.226.195/post/18300.html">当团队想要忽略关键但难以重现的错误时,我应该如何应对</a></li> <li><a href="http://129.226.226.195/post/18299.html">测试人员应该修复错误吗?</a></li> <li><a href="http://129.226.226.195/post/18298.html">审核测试自动化代码的良好实践</a></li> <li><a href="http://129.226.226.195/post/18297.html">质量检查人员应该能够编写测试代码吗?</a></li> </ul> </div> <div class="box widget" > <div class="title">随机文章</div> <ul> <li><a href="http://129.226.226.195/post/11492.html">如何对齐复选框及其标签始终跨浏览器</a></li> <li><a href="http://129.226.226.195/post/11630.html">我可以在ASP.NET MVC中指定一个自定义位置来“搜索视图”吗?</a></li> <li><a href="http://129.226.226.195/post/11981.html">是否有针对Safari的CSS hack(仅适用于Chrome)?</a></li> <li><a href="http://129.226.226.195/post/12644.html">逆向工程Devolo固件</a></li> <li><a href="http://129.226.226.195/post/12667.html">选择指令时设置IDA(python)回调</a></li> <li><a href="http://129.226.226.195/post/12817.html">如何使用Hopper查找所有子例程调用?</a></li> <li><a href="http://129.226.226.195/post/12917.html">导入包含奇怪字符的符号</a></li> <li><a href="http://129.226.226.195/post/14096.html">删除多边形之间的小空间(条形)? [关闭]</a></li> <li><a href="http://129.226.226.195/post/14941.html">为什么傅立叶变换如此重要?</a></li> <li><a href="http://129.226.226.195/post/15287.html">如何检测步进电机何时失速?</a></li> </ul> </div> </div> </div> <style> code{ padding: 2px 4px; color: #242729; background-color: #e4e6e8; border-radius: 3px; } pre{ padding: 12px; color: #242729; background-color: #e4e6e8; border-radius: 5px; overflow: auto; max-height: 600px; } pre code{ padding:0; } </style><footer class="footer"> <div class="global-width footer-box"> <div class="copyright" id="copyr"><span>声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。</span> <script type="text/javascript" src="https://s9.cnzz.com/z_stat.php?id=1279522828&web_id=1279522828"></script> </div> </div> <span id="go-to-top"></span> </footer> </body> </html><!--39.00 ms , 11 query , 1528kb memory , 0 error-->