Vue フロントエンドで PDF を生成してダウンロードする方法

Vue フロントエンドで PDF を生成してダウンロードする方法

アイデア: html2canvas を使用して HTML ページを画像に変換し、次に jspdf を使用して画像の base64 を PDF ファイルに生成します。

1. インストールと導入

//ページのHTMLを画像に変換します npm install html2canvas --save  
// 画像からPDFを生成する
npm インストール jspdf --save

定義した実装方法を導入し、プロジェクトのメインファイルmain.jsに登録する

'@/utils/htmlToPdf' から htmlToPdf をインポートします。
// Vue.use() メソッドを使用すると、ツール メソッド Vue.use(htmlToPdf) のインストール メソッドが呼び出されます。

ポータル: Vue における Vue.use() の原理と使用法

2. PDFファイルをパッケージ化してエクスポートする方法

構成の詳細

pdf = new jsPDF('p', 'pt', [pdfX, pdfY]); とします。
最初のパラメーター: l: 水平、p: 垂直。 2 番目のパラメーター: 測定単位 ("pt"、"mm"、"cm"、"m"、"in"、または "px")。
3 番目のパラメータ: 次の形式にすることができます。デフォルトは "a4" です。カスタム形式の場合は、サイズを数値配列として渡すだけです (例: [592.28, 841.89])。
		   a0 - a10
		   b0 - b10
		   c0 - c10
  		   ダウンロード
		   手紙
		   政府からの手紙
		   法律上の
		   ジュニアリーガル
		   元帳
		   タブロイド
		   クレジットカード

pdf.addPage() は PDF ドキュメントに新しいページを追加します。デフォルトのサイズは a4 です。パラメータは次のとおりです。

pdf.addImage() は PDF に画像を追加します。パラメータは次のとおりです。

PDFのページを削除する

let targetPage = pdf.internal.getNumberOfPages(); // 合計ページ数を取得する pdf.deletePage(targetPage); // 対象ページを削除する

PDF文書を保存

pdf.save(`test.pdf`);

PDF ファイルをエクスポートするメソッドをカプセル化します (utils/htmlToPdf.js)

// ページを PDF 形式でエクスポートする import html2Canvas from 'html2canvas'
'jspdf' から JsPDF をインポートします
エクスポートデフォルト{
  インストール (Vue, オプション) {
    Vue.prototype.getPdf = 関数(){
      // PDF をダウンロードするときに、ページの先頭にない場合は PDF スタイルが正しくなくなるため、ページの先頭に戻ってからダウンロードします。let top = document.getElementById('pdfDom');
      (トップ!= null)の場合{
        上部にスクロールしてビューに移動します。
        上部 = null;
      }
      title = this.exportPDFtitle とします。
      html2Canvas(document.querySelector('#pdfDom'), {
        汚染を許可: true
      }).then(関数(キャンバス) {
        // キャンバスの幅と高さを取得します。let contentWidth = canvas.width;
        contentHeight を canvas.height に設定します。
	      // HTML ページを表示する PDF ページによって生成されるキャンバスの高さ。
        pageHeight = contentWidth / 841.89 * 592.28 とします。
	      //PDF を生成しない HTML ページの高さ let leftHeight = contentHeight;
	      // ページオフセット let position = 0;
	      // PDF 内の HTML ページによって生成されたキャンバス イメージの幅と高さ (この場合: 横長の A4 用紙 [841.89, 592.28]、縦のサイズを変更する必要があります)
        imgWidth = 841.89 とします。
        imgHeight = 841.89 / contentWidth * contentHeight とします。
        pageData = canvas.toDataURL('image/jpeg', 1.0); とします。
        PDF = new JsPDF('l', 'pt', 'a4'); とします。
        // 2 つの高さを区別する必要があります。1 つは HTML ページの実際の高さで、もう 1 つは生成された PDF ページの高さです。// コンテンツが 1 つの PDF ページの範囲を超えない場合、ページングは​​必要ありません if (leftHeight < pageHeight) {
          PDF.addImage(pageData, 'JPEG', 0, 0, 画像幅, 画像高さ)
        } それ以外 {
          (左の高さ > 0)の間{
            PDF.addImage(pageData, 'JPEG', 0, 位置, 画像幅, 画像高さ)
            左の高さ -= ページの高さ;
            ポジション -= 592.28;
            // 空白ページの追加を避ける if (leftHeight > 0) {
              PDF.addPage();
            }
          }
        }
        PDF.save(タイトル + '.pdf')
      })
    }
  }
}

関連コンポーネントへの応用

<テンプレート>
  <div class="wrap">
    <div id="pdfDom" スタイル="padding: 10px;">
      <el-テーブル
        :data="テーブルデータ"
        境界線>
        <el-table-column prop="date" label="日付" width="250"></el-table-column>
        <el-table-column prop="name" label="姓名" width="250"></el-table-column>
        <el-table-column prop="address" label="住所"></el-table-column>
      </el-table>
    </div>
    <button type="button" style="margin-top: 20px;" @click="btnClick">PDF をエクスポート</button>
  </div>

</テンプレート>
 
<スクリプト>
エクスポートデフォルト{
  データ() { 
    戻る {
      exportPDFtitle: "ページエクスポートPDFファイル名",
      テーブルデータ: [
         {
          日付: '2016-05-06'、
          名前: 王小湖、
          住所: 重慶市九龍坡区火居大道
        }, {
          日付: '2016-05-07'、
          名前: 王小湖、
          住所: 重慶市九龍坡区火居大道
        },{
          日付: '2016-05-03'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1518号'
        }, {
          日付: '2016-05-02'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1518号'
        }, {
          日付: '2016-05-04'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1518号'
        }, {
          日付: '2016-05-01'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1518号'
        }, {
          日付: '2016-05-08'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1518号'
        }, {
          日付: '2016-05-06'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1518号'
        }, {
          日付: '2016-05-06'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1518号'
        }, {
          日付: '2016-05-07'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1518号'
        }, {
          日付: '2016-05-01'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1518号'
        }, {
          日付: '2016-05-08'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1518号'
        }, {
          日付: '2016-05-06'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1518号'
        }, {
          日付: '2016-05-07'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1518号'
        }, {
          日付: '2016-05-06'、
          名前: 王小湖、
          住所: '南京市江寧区江君大道'
        }, {
          日付: '2016-05-07'、
          名前: 王小湖、
          住所: '南京市江寧区江君大道'
        },, {
          日付: '2016-05-04'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1518号'
        }, {
          日付: '2016-05-01'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1518号'
        }, {
          日付: '2016-05-08'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1518号'
        }, {
          日付: '2016-05-06'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1518号'
        }, {
          日付: '2016-05-07'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1518号'
        },{
          日付: '2016-05-01'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1518号'
        }, {
          日付: '2016-05-08'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1518号'
        }, {
          日付: '2016-05-06'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1518号'
        }, {
          日付: '2016-05-08'、
          名前: 王小湖、
          住所: 武漢市紅山区文化大道
        }, {
          日付: '2016-05-06'、
          名前: 王小湖、
          住所: 武漢市紅山区文化大道
        }, {
          日付: '2016-05-07'、
          名前: 王小湖、
          住所: 武漢市紅山区文化大道
        }, {
          日付: '2016-05-06'、
          名前: 王小湖、
          住所: '南京市江寧区江君大道'
        }, {
          日付: '2016-05-07'、
          名前: 王小湖、
          住所: 武漢市紅山区文化大道
        },
      ]
    } 
  }, 
  メソッド: {
    btnClick(){
      this.$nextTick(() => {this.getPdf();})
    },
  },  
}
</スクリプト>  

効果

最適化する部品

  1. ページングすると、ページの内容が切り捨てられます (ディスカッションのためにメッセージを残してください)。
  2. 異なるコンテンツが新しいページで始まります。アイデア: 余分なコンテンツを計算し、最後のページの高さを占めます (間隔 = ページの高さ - 余分な高さ)。

要約する

これで、Vue フロントエンドで PDF を生成してダウンロードする方法に関するこの記事は終了です。Vue フロントエンドで PDF を生成してダウンロードする方法に関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vue は、ぼやけて生成されたキャンバスなどの問題を解決するために PDF エクスポートを実装しています (推奨)
  • VueでPDFファイルのプレビューを実装する方法
  • Vue は PDF ファイルのオンライン プレビューとダウンロードを実装します (pdf.js)
  • Vue2.0 グローバルコンポーネントの PDF の詳細な説明
  • Vue は PDF ドキュメントのオンライン プレビュー機能を実装しました
  • Vue で Web ページを PDF に印刷するサンプル コード
  • Vueはページを画像またはPDFとしてエクスポートします
  • Vue でページを PDF 形式にエクスポートする実装のアイデア
  • vueでvue-pdfを使用する方法の詳細な説明
  • Vue ページを PDF ファイルにエクスポートする方法

<<:  Nginx アクセス ログとエラー ログ パラメータの説明

>>:  HTML入力ファイルコントロールはアップロードされるファイルの種類を制限します

推薦する

Ubuntu 18.04 でソースコードから Odoo14 をインストールするチュートリアル

目次このシリーズの背景概要PostgreSQL データベースの準備ソースからインストール仮想環境の作...

マウスのドラッグ効果を実現するJavaScript

この記事では、マウスドラッグ効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...

重複したMySQLレコードを現場でチェックし、処理する実践的な記録

目次序文分析するデータ合計繰り返し率どこにあるかと持っているかの違い要約する序文私はソフトウェアの導...

Vue.js フロントエンドフレームワークにおけるイベント処理の概要

1. v-onイベント監視DOM イベントをリッスンするには、v-on ディレクティブを使用します。...

js オブザーバーモードの紹介と使用

目次定義2. 使用シナリオ3. 例を挙げる4. コーディング定義オブザーバー パターンは 1 対多の...

mysql init_connect に関するいくつかの重要なポイントの要約

init_connectの役割init_connect は通常、接続が来たときに、自動コミットを 0...

MySQL テーブル結合クエリでグループ化と重複排除を実装する例

目次ビジネスロジックデータテーブル構造クエリロジックSQL スクリプトスクリプトの説明ビジネスロジッ...

Node.js は、異なるリクエストパスに応じて異なるデータを返します。

目次1. 異なるリクエストパスに応じて異なるデータを返す方法を学びます。 2. 送信データ: データ...

MySQLの保存時間の不一致の問題を解決する

Java を使用してシステム時間を取得し、それを MySQL データベースに保存した後、時間タイプが...

MySQL マスタースレーブレプリケーションと読み取り書き込み分離の詳細な説明

記事マインドマップマスター/スレーブ レプリケーションと読み取り/書き込み分離を使用する理由は何です...

React-Native環境のセットアップと基本的な紹介

環境の準備1. 環境構築React Native 中国語ウェブサイト2. 開発ツール フロントエンド...

JavaScript parseInt() と Number() の違いのケーススタディ

学習目標: parseInt() と Number() という 2 つの関数は、文字列をデータ型に変...

CSS で「プラス記号」効果を実装するためのサンプルコード

以下に示すプラス記号の効果を実現するには: この効果を実現するには、div 要素だけが必要です。 b...

ReactプロジェクトでのTypeScriptの実装

目次1. はじめに2. 使用方法ステートレスコンポーネントステートフルコンポーネント制御コンポーネン...

HTML で点線の境界線を設定する方法

CSSスタイルとHTMLタグ要素を使用するさまざまな HTML タグに点線の境界線を追加するために、...