HTML画面をPDFにする

今回stackblitzでデモを作ったのですが、どうやらstackblitzでは、html2canvasでhtmlを画像に変換する際に、600×400.pngが404になってしまうようです。実際にダウンロードし、ローカル環境で確認すると、画像は表示されます。

複数枚PDFがある時

html2canvasで処理をしている時、描画するものが少ないページは早く処理が終わり、画像などがあるページは処理が遅れます。なのであらかじめPDFにする順番(id)を持たせておきます。
Promise.all() を使って並列で処理し、全ての処理が終わったらidで正しい順番に並び替えます。

   const options: any = {
      type: 'png',
      windowWidth: 1080, //ブラウザサイズ
      width: 1080, //キャプチャするエリアのサイズ
    };

    // 中略

     type imgDataArrayType = {
        id: number;
        imgData: string;
        width: number;
      };
      let imgDataArray: imgDataArrayType[] = [];

      // HTMLを画像にする
      const promises = Array.from(downloadPdfPage).map((target, i) => {
        return html2canvas(target as HTMLElement, options).then((canvas) => {
          const imgData = canvas.toDataURL('image/png');
          const width = doc.internal.pageSize.width;
          return {
            id: i, //PDFにする順番
            imgData: imgData,
            width: width,
          };
        });
      });

      //Promise.all()を使って、並列に実行する
      imgDataArray = await Promise.all(promises);

      // 全ての処理が終わったら、idでソート
      imgDataArray.sort((a, b) => a.id - b.id);

imgDataArrayを元にPDFを作成

      const doc = new jsPDF('p', 'pt', 'a4'); //設定をA4にする

      // 中略 

      //pdf生成
      imgDataArray.forEach((data, index) => {
        doc.addImage(data.imgData, 'PNG', 30, 40, data.width, 0);
        if (index < imgDataArray.length - 1) {
          doc.addPage();// PDFを1枚追加
        }
      });

      doc.save('sample.pdf'); //sample.pdfという名前で出力する