jsPDF kann Plugins verwenden. Damit HTML gedruckt werden kann, müssen Sie bestimmte Plugins einschließen und daher Folgendes tun:
- Gehen Sie zu https://github.com/MrRio/jsPDF und laden Sie die neueste Version herunter.
- Fügen Sie die folgenden Skripte in Ihr Projekt ein:
- jspdf.js
- jspdf.plugin.from_html.js
- jspdf.plugin.split_text_to_size.js
- jspdf.plugin.standard_fonts_metrics.js
Wenn Sie bestimmte Elemente ignorieren möchten, müssen Sie sie mit einer ID markieren, die Sie dann in einem speziellen Elementhandler von jsPDF ignorieren können. Daher sollte Ihr HTML folgendermaßen aussehen:
<!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>
Anschließend verwenden Sie den folgenden JavaScript-Code, um das erstellte PDF in einem PopUp zu öffnen:
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");
Für mich wurde ein schönes und ordentliches PDF erstellt, das nur die Zeile "Print to pdf" enthielt.
Bitte beachten Sie, dass die speziellen Element-Handler nur IDs in der aktuellen Version behandeln, die auch in einem GitHub-Problem angegeben ist . Es sagt aus:
Da der Abgleich für jedes Element im Knotenbaum erfolgt, war es mein Wunsch, ihn so schnell wie möglich zu machen. In diesem Fall bedeutete dies "Nur Element-IDs stimmen überein". Die Element-IDs werden weiterhin im jQuery-Stil "#id" erstellt. Dies bedeutet jedoch nicht, dass alle jQuery-Selektoren unterstützt werden.
Daher hat das Ersetzen von '#ignorePDF' durch Klassenselektoren wie '.ignorePDF' bei mir nicht funktioniert. Stattdessen müssen Sie für jedes Element, das Sie ignorieren möchten, denselben Handler hinzufügen:
var elementHandler = {
'#ignoreElement': function (element, renderer) {
return true;
},
'#anotherIdToBeIgnored': function (element, renderer) {
return true;
}
};
Aus den Beispielen geht auch hervor, dass es möglich ist, Tags wie 'a' oder 'li' auszuwählen. Für die meisten Fälle könnte dies jedoch etwas zu uneingeschränkt sein:
Wir unterstützen spezielle Elementhandler. Registrieren Sie sie mit dem ID-Selektor im jQuery-Stil für die ID oder den Knotennamen. ("#iAmID", "div", "span" usw.) Derzeit werden keine anderen Selektortypen (Klasse, Verbindung) unterstützt.
Eine sehr wichtige Sache, die Sie hinzufügen sollten, ist, dass Sie alle Ihre Stilinformationen (CSS) verlieren. Glücklicherweise kann jsPDF h1, h2, h3 usw. gut formatieren, was für meine Zwecke ausreichte. Außerdem wird nur Text innerhalb von Textknoten gedruckt, was bedeutet, dass die Werte von Textbereichen und dergleichen nicht gedruckt werden. Beispiel:
<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>