前端實現PDF文件打印和下載

在Web開發中,經常需要處理PDF文件,尤其是在業務涉及發票、報告或文檔生成的場景下。本文將詳細介紹如何使用前端技術實現PDF文件的打印和下載,我們將利用HTML5的<embed>元素和JavaScript庫FileSaver.js來完成這一任務。

一、環境準備

確保你的項目中包含了以下技術棧:

  • HTML5
  • CSS3
  • JavaScript
  • FileSaver.js(用于文件下載)

二、引入FileSaver.js

首先,你需要在項目中引入FileSaver.js庫。你可以通過CDN鏈接直接引入,或者使用npm進行安裝。

通過CDN引入

Html

深色版本

1<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js"></script>

通過npm安裝

Bash

深色版本

1npm install file-saver

然后在你的JavaScript文件中引入:

Javascript

深色版本

1import { saveAs } from 'file-saver';

三、顯示PDF文件

使用HTML5的<embed><object>標簽可以嵌入PDF文件。我們選擇使用<embed>,因為它提供了更好的跨瀏覽器兼容性。

Html

深色版本

1<embed id="pdfViewer" type="application/pdf" src="path/to/your/file.pdf" width="100%" height="600px">

四、實現PDF打印

要實現PDF文件的打印,可以使用JavaScript的window.print()方法。但是,由于<embed>標簽本身沒有直接的打印功能,我們需要先確保PDF文件完全加載后再觸發打印動作。

Javascript

深色版本

1document.getElementById('pdfViewer').addEventListener('load', function() {
2  window.print();
3});

然而,上面的方法在某些瀏覽器中可能不起作用,因為window.print()在某些情況下會阻止PDF文件的渲染。為此,我們可以采用一種更可靠的方法,使用iframe來加載PDF文件,然后再打印:

Html

深色版本

1<iframe id="printFrame" style="display:none;"></iframe>

Javascript

深色版本

1function printPDF() {
2  var iframe = document.getElementById('printFrame');
3  iframe.src = 'path/to/your/file.pdf';
4
5  iframe.onload = function() {
6    setTimeout(function() {
7      window.frames['printFrame'].focus();
8      window.frames['printFrame'].print();
9      iframe.src = ''; // 清空iframe,防止重復打印
10    }, 100);
11  };
12}

五、實現PDF下載

使用FileSaver.js庫,我們可以輕松地將PDF文件下載到用戶的設備上。以下是一個下載PDF文件的示例函數:

Javascript

深色版本

1function downloadPDF(url, filename) {
2  fetch(url)
3    .then(response => response.blob())
4    .then(blob => {
5      saveAs(blob, filename);
6    })
7    .catch(error => console.error('Error downloading PDF:', error));
8}

在你的HTML頁面中添加一個按鈕,調用這個函數:

Html

深色版本

1<button onclick="downloadPDF('path/to/your/file.pdf', 'filename.pdf')">Download PDF</button>

六、完整示例

將上述代碼片段整合在一起,你將得到一個可以打印和下載PDF文件的前端頁面。

Html

深色版本

1<!DOCTYPE html>
2<html lang="en">
3<head>
4<meta charset="UTF-8">
5<title>PDF Viewer</title>
6<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js"></script>
7</head>
8<body>
9<embed id="pdfViewer" type="application/pdf" src="path/to/your/file.pdf" width="100%" height="600px">
10
11<iframe id="printFrame" style="display:none;"></iframe>
12
13<button onclick="printPDF()">Print PDF</button>
14<button onclick="downloadPDF('path/to/your/file.pdf', 'filename.pdf')">Download PDF</button>
15
16<script>
17function printPDF() {
18  var iframe = document.getElementById('printFrame');
19  iframe.src = 'path/to/your/file.pdf';
20
21  iframe.onload = function() {
22    setTimeout(function() {
23      window.frames['printFrame'].focus();
24      window.frames['printFrame'].print();
25      iframe.src = '';
26    }, 100);
27  };
28}
29
30function downloadPDF(url, filename) {
31  fetch(url)
32    .then(response => response.blob())
33    .then(blob => {
34      saveAs(blob, filename);
35    })
36    .catch(error => console.error('Error downloading PDF:', error));
37}
38</script>
39</body>
40</html>

七、總結

通過本文的介紹,你已經學會了如何在前端實現PDF文件的打印和下載功能。這不僅可以增強你的Web應用的功能性,還可以提高用戶體驗。記得在實際應用中,根據你的具體需求調整代碼,并確保遵守相關的版權和隱私法規。

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

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

相關文章

Python 爬蟲:使用打碼平臺來識別各種驗證碼:

本課程使用的是 超級鷹 打碼平臺&#xff0c; 沒有賬戶的請自行注冊&#xff01; 超級鷹驗證碼識別-專業的驗證碼云端識別服務,讓驗證碼識別更快速、更準確、更強大 使用打碼平臺來攻破驗證碼難題&#xff0c; 是很簡單容易的&#xff0c; 但是要錢&#xff01; 案例代碼及測…

React18+Redux+antd 項目實戰 JS

React18Reduxantd 項目實戰 js Ant Design插件官網 Axios官網 (可配置請求攔截器和響應攔截器) JavaScript官網 Echarts官網 一、項目前期準備 1.創建新項目 hotel-manager npx create-react-app hotel-manager2.安裝依賴 //安裝路由 npm i react-router-domnpm i aixos /…

CentOS搭建郵件服務器:DNS配置方法技巧?

CentOS搭建郵件服務器的流程&#xff1f;如何高效使用CentOS&#xff1f; 在當今數字化時代&#xff0c;郵件服務器的需求日益增加。為了確保郵件能夠順利送達&#xff0c;正確的DNS配置是必不可少的一環。AokSend將詳細介紹在CentOS搭建郵件服務器過程中&#xff0c;如何進行…

SpringBoot新手快速入門系列教程7:基于Redis的一個簡單存取數據的例子

我的教程都是親自測試可行才發布的&#xff0c;如果有任何問題歡迎留言或者來群里我每天都會解答。 新手可能有這樣的疑問&#xff0c;有了數據庫的存取方式&#xff0c;我們為什么還要使用Redis這種緩存數據庫讀取方式呢&#xff1f; 原因主要有以下幾點&#xff1a; 1. 性能…

力扣題解(單詞拆分)

139. 單詞拆分單詞拆分 給你一個字符串 s 和一個字符串列表 wordDict 作為字典。如果可以利用字典中出現的一個或多個單詞拼接出 s 則返回 true。 注意&#xff1a;不要求字典中出現的單詞全部都使用&#xff0c;并且字典中的單詞可以重復使用。 思路&#xff1a; 規定dp[i]…

亞馬遜中小型店鋪如何開店?

對于想要在亞馬遜平臺上開設店鋪的中小型賣家來說&#xff0c;這是一個非常值得關注的話題。作為亞馬遜上的一個重要參與者&#xff0c;中小型店鋪有著廣闊的發展空間和無限的可能性&#xff0c;但也由于成本預算與規模限制&#xff0c;無法與大型店鋪的策略相提并論&#xff0…

字符串模板被噶了,JDK 23 刪除了預覽功能“字符串模板”

之前出了一個視頻&#xff0c;介紹 JDK 23 中的新特性。之后我才發現&#xff0c;在 JDK 21 和 22 中的預覽功能“字符串模板&#xff08;String Templates&#xff09;”&#xff0c;在 JDK 23 中已經沒有了。字符串模板的相關代碼&#xff0c;已經被全部刪除了。 字符串模板的…

Spring Boot 3.3 【二】Spring Boot自動配置機制深度解析

簡單動作&#xff0c;深刻聯結。在這技術海洋&#xff0c;我備好舟&#xff0c;等你揚帆。啟航吧&#xff01; &#x1f31f;點擊【關注】&#xff0c;解鎖定期的技術驚喜&#xff0c;讓靈感與知識的源泉不斷涌動。 &#x1f44d;一個【點贊】&#xff0c;如同心照不宣的默契&a…

Unity免費領場景多人實時協作地編2人版局域網和LAN聯機類似谷歌文檔協同合作搭建場景同步資產設置編輯付費版支持10人甚至更多20240709

大家有沒有用過谷歌文檔、石墨文檔、飛書文檔等等之類的協同工具呢&#xff1f; Blender也有類似多人聯機建模的插件&#xff0c; Unity也有類似的多人合作搭建場景的插件啦。 剛找到一款免費插件&#xff0c;可以支持2人局域網和LAN聯機地編。 付費的版本支持組建更大的團隊。…

詳解如何通過稀疏向量優化信息檢索

在信息檢索方法的發展歷程中&#xff0c;我們見證了從傳統的統計關鍵詞匹配到如 BERT 這樣的深度學習模型的轉變。雖然傳統方法提供了堅實的基礎&#xff0c;但往往難以精準捕捉文本的語義關系。如 BERT 這樣的稠密檢索方法通過利用高維向量捕獲文本的上下文語義&#xff0c;為…

煙霧識別技術在火災預防中的應用:思通數科大模型的力量

引言 火災是導致生命財產損失的重大災害之一。早期檢測和快速響應是預防火災和減少損失的關鍵。結合思通數科大模型的煙霧識別技術&#xff0c;為實時檢測和精確定位煙霧來源提供了一種高效的解決方案。本文將探討這一技術如何有效預防火災并保障人員安全。 煙霧識別技術概述 …

注冊自定義總線

1、在/sys/bus下注冊一個自定義總線 #include<linux/module.h> #include<linux/init.h> #include<linux/kernel.h> #include<linux/kobject.h> #include<linux/slab.h> #include<linux/sysfs.h> #include<linux/device.h> #include…

bug修復 修復修復修復

好的&#xff0c;這里是更新后的代碼&#xff0c;將所有 inRange 函數的第一個變量替換為 ZoomOutimage&#xff1a; // 綠色分岔路 if (divergerColor "green" && nextColor "null") {cv::Mat frameGreen, frameRed;frame2.copyTo(frameGreen)…

如何在 Fedora 中使用 `shred` 擦除驅動器或文件

English Version: https://blog.csdn.net/sch0120/article/details/140390161 如何在 Fedora 中使用 shred 擦除驅動器或文件 安全擦除驅動器對于保護您的敏感數據免受未授權訪問至關重要。在這篇博文中&#xff0c;我們將學習如何在 Fedora 中使用 shred 命令安全擦除整個驅…

FATE Flow 源碼解析 - 作業提交處理流程

背景介紹 FATE 是隱私計算中最有名的開源項目了&#xff0c;從 star 的數量上來看也可以看出來。截止 2023 年 3 月共收獲 4.9k 個 star&#xff0c;但是 FATE 一直被認為代碼框架復雜&#xff0c;難以理解&#xff0c;作為一個相關的從業者&#xff0c;后續會持續對 FATE 項目…

React@16.x(56)Redux@4.x(5)- 實現 createStore

目錄 1&#xff0c;分析2&#xff0c;實現2.1&#xff0c;基礎實現2.2&#xff0c;優化2.2.1&#xff0c;隨機字符串2.2.2&#xff0c;action 的判斷2.2.2&#xff0c;監聽器的優化 2.3&#xff0c;最終形態 1&#xff0c;分析 createStore()&#xff0c;參數1為 reducer&…

0601STM32TIM

TOC 分為四部分&#xff0c;八小節 一部分&#xff1a;主要講定時器基本定時的功能&#xff0c;也就是定一個事件&#xff0c;讓定時器每隔這個時間產生一個中斷&#xff0c;來實現每隔一個固定時間來執行一段程序的目的&#xff0c;比如做一個時鐘、秒表&#xff0c;或者使用一…

【Linux】1w詳解如何實現一個簡單的shell

目錄 實現思路 1. 交互 獲取命令行 2. 子串分割 解析命令行 3. 指令的判斷 內建命令 4. 普通命令的執行 補充&#xff1a;vim 文本替換 整體代碼 重點思考 1.getenv和putenv是什么意思 2.代碼extern char **environ; 3.內建命令是什么 4.lastcode WEXITSTATUS(sta…

Java-final關鍵字詳解

Java-final關鍵字詳解 一、引言 二、什么是 final 關鍵字&#xff1f; 三、final 變量 final 局部變量 final 實例變量 final 靜態變量 四、final 方法 五、final 類 六、final 關鍵字的實際應用 1. 定義常量 2. 防止方法被重寫 3. 創建不可變類 4. 優化性能 七、…

切割01串(牛客小白月賽98)

題意&#xff1a; 給三個整數n&#xff0c;l&#xff0c;r&#xff0c;和一個字符串s&#xff0c;滿足l<|c0-c1|<r就可以切成字符串a和字符串b&#xff0c;c0為字符串a左側出現0的次數&#xff0c;c1為字符串b右側出現1的次數&#xff0c;求最多切割次數 知識點&#x…