我有以下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>
我想要做的就是将在 div 中找到的任何 id 为“pdf”的内容打印为 pdf。这必须使用 JavaScript 完成。然后应自动下载“pdf”文档,文件名为“foobar.pdf”
我一直在使用 jspdf 来做到这一点,但它唯一的功能是“文本”,它只接受字符串值。我想将 HTML 提交到 jspdf,而不是文本。
jsPDF 能够使用插件。 为了使它能够打印 HTML,您必须包含某些插件,因此必须执行以下操作:
如果你想忽略某些元素,你必须用一个 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 代码在弹出窗口中打开创建的 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 问题中说明。它指出:
因为匹配是针对节点树中的每个元素完成的,所以我的愿望是让它尽可能快。在这种情况下,这意味着“仅匹配元素 ID”。元素 ID 仍然以 jQuery 样式“#id”完成,但这并不意味着支持所有 jQuery 选择器。
因此,用“.ignorePDF”之类的类选择器替换“#ignorePDF”对我不起作用。相反,您必须为每个要忽略的元素添加相同的处理程序,例如:
var elementHandler = { '#ignoreElement': function (element, renderer) { return true; }, '#anotherIdToBeIgnored': function (element, renderer) { return true; } };
从示例中还指出,可以选择像“a”或“li”这样的标签。不过,对于大多数用例来说,这可能有点不受限制:
我们支持特殊的元素处理程序。使用 jQuery 样式的 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>