實現點擊按鈕導出頁面pdf

在Vue 3 + Vite項目中,你可以使用html2canvasjspdf庫來實現將頁面某部分導出為PDF文檔的功能。以下是一個簡單的實現方式:

1.安裝html2canvasjspdf

pnpm install html2canvas jspdf

2.在Vue組件中使用這些庫來實現導出功能:

<template><div><button @click="exportToPDF">導出PDF</button><div ref="pdfContent" class="pdf-content"><!-- 這里是你想要導出的頁面部分 --></div></div>
</template><script lang="ts">
import { defineComponent, ref } from 'vue';
import html2canvas from 'html2canvas';
import jsPDF from 'jspdf';export default defineComponent({setup() {const pdfContent = ref<HTMLElement | null>(null);const exportToPDF = async () => {if (pdfContent.value) {const canvas = await html2canvas(pdfContent.value);const imgData = canvas.toDataURL('image/png');const doc = new jsPDF({orientation: 'portrait',unit: 'px',format: 'a4',});const imgProps = doc.getImageProperties(imgData);const pdfWidth = doc.internal.pageSize.getWidth();const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width;doc.addImage(imgData, 'PNG', 0, 0, pdfWidth, pdfHeight);doc.save('exported.pdf');}};return {pdfContent,exportToPDF,};},
});
</script><style>
.pdf-content {/* 樣式按需定制 */
}
</style>

最后點擊導出按鈕,即可成功按設置導出你想要導出的部分內容到pdf文檔了,如下所以,打開pdf即可:

封裝方法htmlToPdf.ts

import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'
// title:下載文件的名稱  htmlId:包裹的標簽的id
const htmlToPdf = (title: string, htmlId: string) => {var element = document.querySelector(htmlId) as HTMLElementwindow.pageYOffset = 0document.documentElement.scrollTop = 0document.body.scrollTop = 0setTimeout(() => {// // 以下注釋的是增加導出的pdf水印 !!!!!!!!!!!!!// const value = '我是水印'// //創建一個畫布// let can = document.createElement('canvas')// //設置畫布的長寬// can.width = 400// can.height = 500// let cans = can.getContext('2d') as any// //旋轉角度// cans.rotate((-15 * Math.PI) / 180)// cans.font = '18px Vedana'// //設置填充繪畫的顏色、漸變或者模式// cans.fillStyle = 'rgba(200, 200, 200, 0.40)'// //設置文本內容的當前對齊方式// cans.textAlign = 'left'// //設置在繪制文本時使用的當前文本基線// cans.textBaseline = 'Middle'// //在畫布上繪制填色的文本(輸出的文本,開始繪制文本的X坐標位置,開始繪制文本的Y坐標位置)// cans.fillText(value, can.width / 8, can.height / 2)// let div = document.createElement('div')// div.style.pointerEvents = 'none'// div.style.top = '20px'// div.style.left = '-20px'// div.style.position = 'fixed'// div.style.zIndex = '100000'// div.style.width = element.scrollHeight + 'px'// div.style.height = element.scrollHeight + 'px'// div.style.background =//   'url(' + can.toDataURL('image/png') + ') left top repeat'// element.appendChild(div) // 到頁面中html2Canvas(element, {allowTaint: true,useCORS: true,scale: 2, // 提升畫面質量,但是會增加文件大小height: element.scrollHeight, // 需要注意,element的 高度 寬度一定要在這里定義一下,不然會存在只下載了當前你能看到的頁面   避雷避雷!!!windowHeight: element.scrollHeight,}).then(function (canvas) {var contentWidth = 1948var contentHeight = canvas.height*1948 / canvas.width// console.log('contentWidth', contentWidth)// console.log('contentHeight', contentHeight)// 一頁pdf顯示html頁面生成的canvas高度;var pageHeight = (contentWidth * 841.89) / 592.28// 未生成pdf的html頁面高度var leftHeight = contentHeight// console.log('pageHeight', pageHeight)// console.log('leftHeight', leftHeight)// 頁面偏移var position = 0// a4紙的尺寸[595.28,841.89],html頁面生成的canvas在pdf中圖片的寬高  //40是左右頁邊距var imgWidth = 595.28-60var imgHeight = (592.28 / contentWidth) * contentHeightvar pageData = canvas.toDataURL('image/jpeg', 1.0)var pdf = new JsPDF('portrait', 'px', 'a4')// 有兩個高度需要區分,一個是html頁面的實際高度,和生成pdf的頁面高度(841.89)// 當內容未超過pdf一頁顯示的范圍,無需分頁if (leftHeight < pageHeight) {// console.log('沒超過1頁')pdf.addImage(pageData, 'JPEG', 2, 2, imgWidth, imgHeight)// pdf.addImage(pageData, 'JPEG', 20, 20, imgWidth, imgHeight)} else {while (leftHeight > 0) {// console.log('超過1頁')pdf.addImage(pageData, 'JPEG', 5, position, imgWidth, imgHeight)leftHeight -= pageHeightposition -= 841.89// 避免添加空白頁if (leftHeight > 0) {pdf.addPage()}}}pdf.save(title + '.pdf')})}, 1000)
}export default htmlToPdf

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40197.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40197.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40197.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

統計信號處理基礎 習題解答11-11

題目 考慮矢量MAP估計量 證明這個估計量對于代價函數 使貝葉斯風險最小。其中&#xff1a;, &#xff0c;且. 解答 貝葉斯風險函數&#xff1a; 基于概率密度的非負特性&#xff0c;上述對積分要求最小&#xff0c;那就需要內層積分達到最小。令內層積分為&#xff1a; 上述積…

蘋果Mac電腦能玩什么游戲 Mac怎么運行Windows游戲

相對于Windows平臺來說&#xff0c;Mac電腦可玩的游戲較少。雖然蘋果設備的性能足以支持各種大型游戲&#xff0c;但由于系統以及蘋果配套服務的限制&#xff0c;很多游戲無法在Mac系統中運行。不過&#xff0c;借助虛擬機軟件&#xff0c;Mac電腦可以突破系統限制玩更多的游戲…

react中jsx的語法規則

1.react核心庫react.development.js 2.react_dom庫&#xff0c;用于支持react操作dom&#xff08;react-dom.development.js&#xff09; 3.引入bable&#xff0c;解析jsx語法的庫&#xff0c;用于將jsx轉換為js(babel.min.js) 上述三個庫是寫基礎react的基本庫 下面我將用…

光照老化試驗箱在化工產品暴曬測試中的應用

概述 光照老化試驗箱是一種模擬自然光照條件下材料老化情況的實驗設備&#xff0c;廣泛應用于化工、建材、電子、汽車等行業中對材料的耐候性、耐光性能等進行測試。通過模擬日光中的紫外線和溫度等環境因素&#xff0c;加速材料老化過程&#xff0c;以此評估材料在長期使用中…

2024阿里云大模型自定義插件(如何調用自定義接口)

1&#xff0c;自定義插件入口 2&#xff0c;插件定義&#xff1a;描述插件的參數 2.1&#xff0c;注意事項&#xff1a; 2.1.1&#xff0c;只支持json格式的參數&#xff1b;只支持application/JSON&#xff1b;如下圖&#xff1a; 2.1.2&#xff0c;需要把接口描述進行修改&a…

03:Spring MVC

文章目錄 一&#xff1a;Spring MVC簡介1&#xff1a;說說自己對于Spring MVC的了解&#xff1f;1.1&#xff1a;流程說明&#xff1a; 一&#xff1a;Spring MVC簡介 Spring MVC就是一個MVC框架&#xff0c;Spring MVC annotation式的開發比Struts2方便&#xff0c;可以直接代…

LeetCode 算法:二叉搜索樹中第K小的元素 c++

原題鏈接&#x1f517;&#xff1a;二叉搜索樹中第K小的元素 難度&#xff1a;中等???? 題目 給定一個二叉搜索樹的根節點 root &#xff0c;和一個整數 k &#xff0c;請你設計一個算法查找其中第 k 小的元素&#xff08;從1開始計數&#xff09;。 示例 1&#xff1a;…

網絡爬蟲之什么是代碼混淆?初步理解代碼混淆

爬蟲逆向之什么是代碼混淆&#xff1f;初步理解代碼混淆 在網絡爬蟲和逆向工程的過程中&#xff0c;代碼混淆是一項常見的技術&#xff0c;旨在保護代碼不被輕易理解和逆向。對于爬蟲工程師來說&#xff0c;理解并破解代碼混淆是一個重要的技能。本文將詳細介紹代碼混淆的基本概…

GUI開發

Question One Java 實現動作監聽&#xff0c;網格布局添加四個按鈕&#xff0c;實現四個不同的文本顯示 import java.awt.*; import java.awt.event.*; import javax.swing.*;class myGUI extends JFrame implements ActionListener{private Button b1, b2, b3, b4;private Tex…

0627,0628,0629,排序,文件

01&#xff1a;請實現選擇排序&#xff0c;并分析它的時間復雜度&#xff0c;空間復雜度和穩定性 void selection_sort(int arr[], int n); 解答&#xff1a; 穩定性&#xff1a;穩定&#xff0c; 不穩定的&#xff0c;會發生長距離的交換 4 9 9 4 1 &#xf…

ubuntu,linux下屏蔽壞塊方法-240625-240702封存

在windows下的屏蔽壞道的方法 機械硬盤壞道的文件系統級別的屏蔽方法_硬盤如何屏蔽壞扇區-CSDN博客 https://blog.csdn.net/cyuyan112233/article/details/139408503?spm1001.2014.3001.5502 【免費】磁盤壞道屏蔽工具磁盤壞道屏蔽工具_機械硬盤屏蔽壞扇區資源-CSDN文庫 https…

第一周題目總結

1.車爾尼有一個數組 nums &#xff0c;它只包含 正 整數&#xff0c;所有正整數的數位長度都 相同 。 兩個整數的 數位不同 指的是兩個整數 相同 位置上不同數字的數目。 請車爾尼返回 nums 中 所有 整數對里&#xff0c;數位不同之和。 示例 1&#xff1a; 輸入&#xff1a…

【嵌入式DIY實例-ESP8266篇】-LCD ST7735顯示網絡時間

LCD ST7735顯示網絡時間 文章目錄 LCD ST7735顯示網絡時間1、硬件準備2、代碼實現本文將介紹如何使用 ESP8266 NodeMCU Wi-Fi 板實現互聯網時鐘,其中時間和日期顯示在 ST7735 TFT 顯示屏上。 ST7735 TFT是一款分辨率為128160像素的彩色顯示屏,采用SPI協議與主控設備通信。 1…

Python中的變量和數據類型:Python中有哪些基本數據類型以及變量是如何聲明的

在Python中&#xff0c;變量是用來存儲數據的容器&#xff0c;而數據類型則定義了這些數據的種類。Python是一種動態類型語言&#xff0c;這意味著你不需要在聲明變量時指定其類型&#xff1b;Python解釋器會在運行時自動確定變量的類型。 Python中的基本數據類型 Python中有…

SQL語句(DML)

DML英文全稱是Data Manipulation Language&#xff08;數據操作語言&#xff09;&#xff0c;用來對數據庫中表的數據記錄進行增刪改等操作 DML-添加數據 insert into employee(id, workno, name, gender, age, idcard) values (1,1,Itcast,男,10,123456789012345678);select *…

AI 與數據的智能融合丨大模型時代下的存儲系統

WOT 全球技術創新大會2024北京站于 6 月 22 日圓滿落幕。本屆大會以“智啟新紀&#xff0c;慧創萬物”為主題&#xff0c;邀請到 60 位不同行業的專家&#xff0c;聚焦 AIGC、領導力、研發效能、架構演進、大數據等熱門技術話題進行分享。 近年來&#xff0c;數據和人工智能已…

記錄搭建一臺可域名訪問的HTTPS服務器

一、背景 近期公司業務涉及到微信小程序&#xff0c;即將開發完成需要按照微信小程序平臺的要求提供帶證書的域名請求服務器。 資源背景介紹如下&#xff1a; 1、域名 公司已有一個二級域名&#xff0c;再次申請新的二級域名并且實現ICP備案不僅需要花重金重新購買&#xff0c;…

Docker實現Redis主從,以及哨兵機制

Docker實現Redis主從,以及哨兵機制 目錄 Docker實現Redis主從,以及哨兵機制準備Redis鏡像創建Redis主節點配置文件啟動Redis從節點確認主從連接哨兵主要功能配置哨兵文件創建Redis哨兵的Docker容器 要通過Docker實現Redis的主從&#xff08;master-slave&#xff09;復制&#…

汽車EDI: BMW EDI項目案例

寶馬集團是全世界成功的汽車和摩托車制造商之一&#xff0c;旗下擁有BMW、MINI和Rolls-Royce三大品牌&#xff1b;同時提供汽車金融和高檔出行服務。作為一家全球性公司&#xff0c;寶馬集團在14個國家擁有31家生產和組裝廠&#xff0c;銷售網絡遍及140多個國家和地區。 本文主…

什么是 Socks5 代理?了解和使用 SOCKS5 代理的終極指南

SOCKS5是什么以及它如何工作&#xff1f; 在網絡和互聯網協議領域&#xff0c;有多種工具和技術在確保安全高效的通信方面發揮著至關重要的作用。 SOCKS5 就是這樣一個工具&#xff0c;它代表套接字安全版本 5。 在這篇博文中&#xff0c;我們將深入探討 SOCKS5 的細節&…