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でマークする必要があります。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を作成しました。
特別な要素ハンドラーは、GitHub Issueにも記載されている現在のバージョンのIDのみを処理することに注意してください。それは述べています:
マッチングはノードツリーのすべての要素に対して行われるので、できるだけ速くしたいと思っていました。その場合、「要素IDのみが一致する」という意味でした。要素IDはjQueryスタイルの「#id」で引き続き処理されますが、すべてのjQueryセレクターがサポートされていることを意味するわけではありません。
したがって、「#ignorePDF」を「.ignorePDF」などのクラスセレクターで置き換えることは、私にとってはうまくいきませんでした。代わりに、次のように無視するすべての要素に同じハンドラーを追加する必要があります。
var elementHandler = {
'#ignoreElement': function (element, renderer) {
return true;
},
'#anotherIdToBeIgnored': function (element, renderer) {
return true;
}
};
例から、「a」や「li」のようなタグを選択することが可能であるとも述べられています。ただし、ほとんどのユースケースでは制限がない場合があります。
特別な要素ハンドラーをサポートしています。IDまたはノード名のjQueryスタイルのIDセレクターでそれらを登録します。( "#iAmID"、 "div"、 "span"など)現時点では、他のタイプのセレクタ(クラス、コンパウンド)はサポートされていません。
追加する1つの非常に重要なことは、スタイル情報(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>