みなさん、こんにちは。どんぶラッコです。
本日は、 jsPDF
と html2canvas
という2つのライブラリを使ってWebページをPDFで保存できる機能を作ってみましょう!
サンプル
See the Pen jsPDFとhtml2canvasを使ってHTMLページをPDF化する by cha1ra (@cha1ra) on CodePen.
改めて、今回使ったライブラリをご紹介します。
まずは jsPDF
。 PDF化処理を担うライブラリです。
次に html2canvas
。HTML要素をcanvas化して画像にしてくれるライブラリです。
ライセンスはどちらも MIT
です(2020年11月12日現在)。
コード解説
では実際のコードをみていきましょう。まずはHTMLから。
<div id="capture">
<p>
id <code>capture</code> の中身を画像化してPDFにするサンプル
</p>
<div>
<button id="btn">
PDFとして保存
</button>
</div>
</div>
今回は id="capture"
の要素内をPDF化する、という設定で記述しているので、captureが付与された <div>
タグで囲っています。
続いてJavaScript。
// If you install via npm ...
// import { jsPDF } from 'jspdf'
// import * as html2canvas from 'html2canvas'
const button = document.getElementById('btn')
button.addEventListener('click', (event) => {
const source = document.getElementById('capture')
html2canvas(source).then(capture => {
const imgData = capture.toDataURL('image/png')
const doc = new jsPDF()
const width = doc.internal.pageSize.width
doc.addImage(imgData, 'PNG', 10, 10, width * 0.9, 0)
doc.save("sample.pdf")
})
})
関数化せずにだらだら書いてしまっているので、機能ごとに分解してみていきましょう。
まずはボタンのクリックイベントを取得しています。
const button = document.getElementById('btn')
button.addEventListener('click', (event) => {
// 中略
})
これはわかりやすいですね。続いてHTML要素の画像化処理を実施しています。
const button = document.getElementById('btn')
button.addEventListener('click', (event) => {
// ここから追記
const source = document.getElementById('capture')
html2canvas(source).then(capture => {
const imgData = capture.toDataURL('image/png')
// 中略
})
})
定数source
に id="capture"
のDOM要素を格納し、それを html2canvas()
に食わせています。
html2canvasはPromiseオブジェクトを返すので、そのまま .then
でつなげて記載します
続いて、jsPDFの処理です。
const button = document.getElementById('btn')
button.addEventListener('click', (event) => {
const source = document.getElementById('capture')
html2canvas(source).then(capture => {
const imgData = capture.toDataURL('image/png')
// ここから追記
const doc = new jsPDF()
const width = doc.internal.pageSize.width
doc.addImage(imgData, 'PNG', 10, 10, width * 0.9, 0)
doc.save("sample.pdf")
})
})
doc.internal.pageSize.width
で PDFの横幅を取得しています。そして、doc.addImage()
でPDFに画像を貼り付ける処理をしています。
手順を分解すると結構簡単ですよね!
ちなみに、npm
やyarn
を使ってインストールした場合(モジュールとして読み込みたい場合)、import
文の書き方は下記の通りです。
import { jsPDF } from 'jspdf'
import * as html2canvas from 'html2canvas'
また、PDFの2ページ目に貼り付けたい場合、doc.addPage()
と記載するだけでOKです!
みなさんも試してみてください〜