国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 web前端 js教程 使用JSPDF即時(shí)從網(wǎng)頁??生成PDF

使用JSPDF即時(shí)從網(wǎng)頁??生成PDF

Feb 18, 2025 am 09:30 AM

jsPDF:客戶端PDF生成利器,精細(xì)控制頁面元素

核心要點(diǎn):

  • jsPDF是一個(gè)JavaScript庫(kù),允許直接在客戶端生成PDF文件,從而加快處理速度。它特別適用于精確控制文檔中元素的位置、大小以及分頁。
  • jsPDF庫(kù)易于用于基本的PDF文件生成,但由于文檔有限,對(duì)于復(fù)雜的項(xiàng)目可能會(huì)更具挑戰(zhàn)性。然而,它提供了向PDF添加文本、圖像和形狀的功能,并可精確控制位置和大小。
  • jsPDF庫(kù)可以使用其API進(jìn)行擴(kuò)展??梢蕴砑又T如textAlign()之類的函數(shù),并使用setFontSize()、setFont()、setTextColor()setFontType()方法更改文本屬性。
  • jsPDF還允許創(chuàng)建多頁P(yáng)DF,使用“autoTable”插件添加表格以及包含超鏈接。但是,由于瀏覽器安全限制,用戶無法指定生成的PDF的特定保存位置。

Generating PDFs from Web Pages on the Fly with jsPDF 便攜式文檔格式(PDF)是桌面出版和辦公自動(dòng)化領(lǐng)域的一項(xiàng)重大創(chuàng)新。

它也廣泛用于網(wǎng)絡(luò)出版,但不幸的是,很多時(shí)候使用方法不當(dāng)——例如用它來替換本應(yīng)使用HTML構(gòu)建的內(nèi)容。這會(huì)導(dǎo)致許多關(guān)于可用性、可訪問性、SEO等方面的問題。

但是,在某些情況下需要PDF文件:當(dāng)需要存檔文檔并且必須在網(wǎng)絡(luò)外部使用(例如發(fā)票)時(shí),或者當(dāng)需要對(duì)打印進(jìn)行深度控制時(shí)。

正是對(duì)打印控制的需求促使我去研究一種輕松生成PDF的方法。

本文的目的不僅僅是簡(jiǎn)單地解釋如何創(chuàng)建PDF(有很多簡(jiǎn)單的方法可以做到這一點(diǎn)),而且還要關(guān)注PDF文件可以解決問題的情況,以及像jsPDF這樣的簡(jiǎn)單工具如何提供幫助。

打印處理

任何處理過CSS打印規(guī)則的人都了解實(shí)現(xiàn)體面的跨瀏覽器兼容性有多么困難(例如,查看Can I Use中的分頁符支持表)。因此,當(dāng)我需要構(gòu)建必須打印的內(nèi)容時(shí),我總是嘗試避免使用CSS,最簡(jiǎn)單的解決方案是使用PDF。

我這里說的不是簡(jiǎn)單的HTML到PDF轉(zhuǎn)換。(我嘗試過幾種此類工具,但沒有一個(gè)完全令我滿意。)我的目標(biāo)是完全控制元素的位置和大小、分頁符等等。

過去,我經(jīng)常使用FPDF,這是一個(gè)PHP工具,可以輕松地為您提供這種控制,并且可以輕松地使用許多插件進(jìn)行擴(kuò)展。

不幸的是,該庫(kù)似乎已被放棄(其最后一個(gè)版本可以追溯到2011年)(更新:實(shí)際上,最新版本似乎是2015年12月發(fā)布的),但由于一些JavaScript庫(kù),我們現(xiàn)在可以直接在客戶端構(gòu)建PDF文件(從而使它們的生成速度更快)。

幾個(gè)月前,當(dāng)我開始我的項(xiàng)目時(shí),我搜索了一個(gè)JS庫(kù),最終我找到了兩個(gè)候選者:jsPDF和pdfmake。pdfmake似乎文檔齊全且易于使用,但由于它是測(cè)試版,所以我選擇了jsPDF。

使用jsPDF構(gòu)建PDF

jsPDF文檔相當(dāng)簡(jiǎn)短,包括一個(gè)頁面以及一些演示,以及源文件(或其jsDoc頁面)中更多信息,因此請(qǐng)記住,將其用于復(fù)雜項(xiàng)目一開始可能會(huì)有點(diǎn)困難。

無論如何,jsPDF對(duì)于基本的PDF文件生成非常容易。讓我們來看一個(gè)簡(jiǎn)單的“Hello World”示例:

var pdf = new jsPDF();
pdf.text(30, 30, 'Hello world!');
pdf.save('hello_world.pdf');

此HTML頁面生成一個(gè)單頁P(yáng)DF文件并將其保存到您的計(jì)算機(jī)上。首先,您必須鏈接到j(luò)sPDF庫(kù)(在本例中,來自cdnjs.com),然后創(chuàng)建一個(gè)jsPDF實(shí)例,添加一行文本,并將結(jié)果保存為hello_world.pdf。

請(qǐng)注意,我使用了1.0.272版本,它不是最新的:在撰寫本文時(shí),最新版本是1.1.135,但它有很多問題,所以我仍在使用之前的版本。

您可以看到構(gòu)建基本PDF文件是多么簡(jiǎn)單(您可以在jsPDF網(wǎng)站上找到更多示例)。

讓我們嘗試構(gòu)建更復(fù)雜的內(nèi)容。

傳單項(xiàng)目

幾個(gè)月前,有人要求我構(gòu)建一個(gè)用于創(chuàng)建一些簡(jiǎn)單傳單的應(yīng)用程序。它是處理旅行社服務(wù)的更大項(xiàng)目的一部分,真正的傳單部分由一些JSON數(shù)據(jù)填充。

傳單的主要目的是提供一種簡(jiǎn)單的方法來顯示要在旅行社商店櫥窗中展示的特價(jià)優(yōu)惠。

我已經(jīng)為本文重新安排了該應(yīng)用程序,刪除了所有服務(wù)器端功能,簡(jiǎn)化了傳單設(shè)計(jì),擺脫了舊版瀏覽器兼容性,并使用Bootstrap 3和jQuery構(gòu)建了一個(gè)非常簡(jiǎn)單的UI。

該演示與Firefox和Chrome配合良好,而Explorer(或Edge)不允許您顯示預(yù)覽,而只能下載生成的PDF。

這是一個(gè)使用該應(yīng)用程序創(chuàng)建的PDF示例(照片來源:Rafael Le?o / Unsplash)

Generating PDFs from Web Pages on the Fly with jsPDF

可以在本文結(jié)尾或直接在CodePen中找到一個(gè)可運(yùn)行的演示。請(qǐng)注意,由于CodePen在iframe中加載結(jié)果頁面,因此在iframe中加載的PDF預(yù)覽在Chrome和Safari中存在一些問題,阻止了預(yù)覽的顯示。(如果可以,請(qǐng)使用Firefox,或者在我的個(gè)人網(wǎng)站上嘗試演示)。

傳單構(gòu)建器

用戶界面允許用戶插入一些基本數(shù)據(jù)(標(biāo)題、摘要和價(jià)格)??梢赃x擇添加圖像,否則將顯示灰框的“特價(jià)優(yōu)惠”標(biāo)題。

其他數(shù)據(jù)(代理名稱及其網(wǎng)站URL和徽標(biāo))嵌入到應(yīng)用程序代碼中。

Generating PDFs from Web Pages on the Fly with jsPDF

PDF可以在iframe中預(yù)覽(除了Explorer或Edge)或直接下載。

當(dāng)單擊“更新預(yù)覽”或“下載”按鈕時(shí),將使用jsPDF生成PDF,并將其作為data URI字符串傳遞到iframe或保存到磁盤,如上例所示。

PDF生成首先使用以下選項(xiàng)創(chuàng)建一個(gè)新的jsPDF對(duì)象實(shí)例:縱向方向(p)、毫米單位(mm)、“A4”格式。

var pdf = new jsPDF();
pdf.text(30, 30, 'Hello world!');
pdf.save('hello_world.pdf');

使用addImage函數(shù)添加圖像。請(qǐng)注意,放置在PDF頁面中的每個(gè)對(duì)象都必須精確定位。您必須使用聲明的單位來處理每個(gè)對(duì)象坐標(biāo)。

var pdf = new jsPDF('p', 'mm', 'a4');

圖像必須進(jìn)行Base64編碼:代理徽標(biāo)以這種格式嵌入到腳本中,而用戶加載的圖像則使用$('#flyer-image').change偵聽器中的readAsDataURL方法進(jìn)行編碼。

標(biāo)題使用textAlign函數(shù)添加。請(qǐng)注意,此函數(shù)不是jsPDF核心的組成部分,但是,正如作者在他的示例中建議的那樣,可以使用其API輕松擴(kuò)展該庫(kù)。您可以在傳單構(gòu)建器腳本的頂部找到textAlign()函數(shù):

// pdf.addImage(base64_source, image format, X, Y, width, height)
pdf.addImage(agency_logo.src, 'PNG', logo_sizes.centered_x, _y, logo_sizes.w, logo_sizes.h);

此函數(shù)計(jì)算文本字符串的X坐標(biāo)以使其居中,然后調(diào)用本機(jī)text()方法:

pdf.textAlign(flyer_title, {align: "center"}, 0, _y);

要更改文本屬性,可以使用setFontSize()、setFont()、setTextColor()setFontType()方法。

例如,要設(shè)置一個(gè)20pt Times Bold紅色字符串,您需要鍵入以下內(nèi)容:

pdf.text(text string, X, Y);

“特價(jià)優(yōu)惠”灰色框和價(jià)格圓圈使用兩種類似的方法:roundedRect()circle()。兩者都需要左上角坐標(biāo)、大小值(第一種情況下的寬度和高度以及第二種情況下的半徑):

pdf.setFontSize(20);
pdf.setFont("times");
pdf.setFontType("bold");
pdf.setTextColor(255, 0, 0);
pdf.text(10,10, 'This is a 20pt Times Bold red string');

style參數(shù)指的是對(duì)象的填充和描邊屬性。有效的樣式包括:S [默認(rèn)] 表示描邊,F(xiàn) 表示填充,DF(或FD)表示填充和描邊。

填充和描邊屬性必須使用setFillColorsetDrawColor預(yù)先設(shè)置,它們需要RGB值和setLineWidth,后者需要在PDF文檔創(chuàng)建之初聲明的單位中的線寬值。

完整的代碼可在CodePen演示中找到:

(此處應(yīng)插入CodePen鏈接,由于我無法訪問外部網(wǎng)站,無法提供)

結(jié)論

這個(gè)基本示例展示了如何使用jsPDF構(gòu)建非?;镜膫鲉?。

它的使用可能很簡(jiǎn)單,但是缺乏完整的文檔使每一步都非常復(fù)雜。

我仍在尋找其他解決方案,關(guān)注pdfmake等其他解決方案。但最終,我認(rèn)為唯一真正明確的解決方案是更好地支持打印CSS規(guī)則的瀏覽器!

(此處應(yīng)包含F(xiàn)AQ部分,內(nèi)容與原文相同,但格式可根據(jù)需要調(diào)整)

以上是使用JSPDF即時(shí)從網(wǎng)頁??生成PDF的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

垃圾收集如何在JavaScript中起作用? 垃圾收集如何在JavaScript中起作用? Jul 04, 2025 am 12:42 AM

JavaScript的垃圾回收機(jī)制通過標(biāo)記-清除算法自動(dòng)管理內(nèi)存,以減少內(nèi)存泄漏風(fēng)險(xiǎn)。引擎從根對(duì)象出發(fā)遍歷并標(biāo)記活躍對(duì)象,未被標(biāo)記的則被視為垃圾并被清除。例如,當(dāng)對(duì)象不再被引用(如將變量設(shè)為null),它將在下一輪回收中被釋放。常見的內(nèi)存泄漏原因包括:①未清除的定時(shí)器或事件監(jiān)聽器;②閉包中對(duì)外部變量的引用;③全局變量持續(xù)持有大量數(shù)據(jù)。V8引擎通過分代回收、增量標(biāo)記、并行/并發(fā)回收等策略優(yōu)化回收效率,降低主線程阻塞時(shí)間。開發(fā)時(shí)應(yīng)避免不必要的全局引用、及時(shí)解除對(duì)象關(guān)聯(lián),以提升性能與穩(wěn)定性。

如何在node.js中提出HTTP請(qǐng)求? 如何在node.js中提出HTTP請(qǐng)求? Jul 13, 2025 am 02:18 AM

在Node.js中發(fā)起HTTP請(qǐng)求有三種常用方式:使用內(nèi)置模塊、axios和node-fetch。1.使用內(nèi)置的http/https模塊無需依賴,適合基礎(chǔ)場(chǎng)景,但需手動(dòng)處理數(shù)據(jù)拼接和錯(cuò)誤監(jiān)聽,例如用https.get()獲取數(shù)據(jù)或通過.write()發(fā)送POST請(qǐng)求;2.axios是基于Promise的第三方庫(kù),語法簡(jiǎn)潔且功能強(qiáng)大,支持async/await、自動(dòng)JSON轉(zhuǎn)換、攔截器等,推薦用于簡(jiǎn)化異步請(qǐng)求操作;3.node-fetch提供類似瀏覽器fetch的風(fēng)格,基于Promise且語法簡(jiǎn)單

JavaScript數(shù)據(jù)類型:原始與參考 JavaScript數(shù)據(jù)類型:原始與參考 Jul 13, 2025 am 02:43 AM

JavaScript的數(shù)據(jù)類型分為原始類型和引用類型。原始類型包括string、number、boolean、null、undefined和symbol,其值不可變且賦值時(shí)復(fù)制副本,因此互不影響;引用類型如對(duì)象、數(shù)組和函數(shù)存儲(chǔ)的是內(nèi)存地址,指向同一對(duì)象的變量會(huì)相互影響。判斷類型可用typeof和instanceof,但需注意typeofnull的歷史問題。理解這兩類差異有助于編寫更穩(wěn)定可靠的代碼。

JavaScript時(shí)間對(duì)象,某人構(gòu)建了一個(gè)eactexe,在Google Chrome上更快的網(wǎng)站等等 JavaScript時(shí)間對(duì)象,某人構(gòu)建了一個(gè)eactexe,在Google Chrome上更快的網(wǎng)站等等 Jul 08, 2025 pm 02:27 PM

JavaScript開發(fā)者們,大家好!歡迎閱讀本周的JavaScript新聞!本周我們將重點(diǎn)關(guān)注:Oracle與Deno的商標(biāo)糾紛、新的JavaScript時(shí)間對(duì)象獲得瀏覽器支持、GoogleChrome的更新以及一些強(qiáng)大的開發(fā)者工具。讓我們開始吧!Oracle與Deno的商標(biāo)之爭(zhēng)Oracle試圖注冊(cè)“JavaScript”商標(biāo)的舉動(dòng)引發(fā)爭(zhēng)議。Node.js和Deno的創(chuàng)建者RyanDahl已提交請(qǐng)?jiān)笗笕∠撋虡?biāo),他認(rèn)為JavaScript是一個(gè)開放標(biāo)準(zhǔn),不應(yīng)由Oracle

React與Angular vs Vue:哪個(gè)JS框架最好? React與Angular vs Vue:哪個(gè)JS框架最好? Jul 05, 2025 am 02:24 AM

選哪個(gè)JavaScript框架最好?答案是根據(jù)需求選擇最適合的。1.React靈活自由,適合需要高度定制、團(tuán)隊(duì)有架構(gòu)能力的中大型項(xiàng)目;2.Angular提供完整解決方案,適合企業(yè)級(jí)應(yīng)用和長(zhǎng)期維護(hù)的大項(xiàng)目;3.Vue上手簡(jiǎn)單,適合中小型項(xiàng)目或快速開發(fā)。此外,是否已有技術(shù)棧、團(tuán)隊(duì)規(guī)模、項(xiàng)目生命周期及是否需要SSR也都是選擇框架的重要因素??傊?,沒有絕對(duì)最好的框架,適合自己需求的就是最佳選擇。

立即在JavaScript中立即調(diào)用功能表達(dá)式(IIFE) 立即在JavaScript中立即調(diào)用功能表達(dá)式(IIFE) Jul 04, 2025 am 02:42 AM

IIFE(ImmediatelyInvokedFunctionExpression)是一種在定義后立即執(zhí)行的函數(shù)表達(dá)式,用于變量隔離和避免污染全局作用域。它通過將函數(shù)包裹在括號(hào)中使其成為表達(dá)式,并緊隨其后的一對(duì)括號(hào)來調(diào)用,如(function(){/code/})();。其核心用途包括:1.避免變量沖突,防止多個(gè)腳本間的命名重復(fù);2.創(chuàng)建私有作用域,使函數(shù)內(nèi)部變量不可見;3.模塊化代碼,便于初始化工作而不暴露過多變量。常見寫法包括帶參數(shù)傳遞的版本和ES6箭頭函數(shù)版本,但需注意:必須使用表達(dá)式、結(jié)

處理諾言:鏈接,錯(cuò)誤處理和承諾在JavaScript中 處理諾言:鏈接,錯(cuò)誤處理和承諾在JavaScript中 Jul 08, 2025 am 02:40 AM

Promise是JavaScript中處理異步操作的核心機(jī)制,理解鏈?zhǔn)秸{(diào)用、錯(cuò)誤處理和組合器是掌握其應(yīng)用的關(guān)鍵。1.鏈?zhǔn)秸{(diào)用通過.then()返回新Promise實(shí)現(xiàn)異步流程串聯(lián),每個(gè).then()接收上一步結(jié)果并可返回值或Promise;2.錯(cuò)誤處理應(yīng)統(tǒng)一使用.catch()捕獲異常,避免靜默失敗,并可在catch中返回默認(rèn)值繼續(xù)流程;3.組合器如Promise.all()(全成功才成功)、Promise.race()(首個(gè)完成即返回)和Promise.allSettled()(等待所有完成)

什么是緩存API?如何與服務(wù)人員使用? 什么是緩存API?如何與服務(wù)人員使用? Jul 08, 2025 am 02:43 AM

CacheAPI是瀏覽器提供的一種緩存網(wǎng)絡(luò)請(qǐng)求的工具,常與ServiceWorker配合使用,以提升網(wǎng)站性能和離線體驗(yàn)。1.它允許開發(fā)者手動(dòng)存儲(chǔ)如腳本、樣式表、圖片等資源;2.可根據(jù)請(qǐng)求匹配緩存響應(yīng);3.支持刪除特定緩存或清空整個(gè)緩存;4.通過ServiceWorker監(jiān)聽fetch事件實(shí)現(xiàn)緩存優(yōu)先或網(wǎng)絡(luò)優(yōu)先等策略;5.常用于離線支持、加快重復(fù)訪問速度、預(yù)加載關(guān)鍵資源及后臺(tái)更新內(nèi)容;6.使用時(shí)需注意緩存版本控制、存儲(chǔ)限制及與HTTP緩存機(jī)制的區(qū)別。

See all articles