使用JSPDF即時從網頁生成PDF
jsPDF:客戶端PDF生成利器,精細控制頁面元素
核心要點:
- jsPDF是一個JavaScript庫,允許直接在客戶端生成PDF文件,從而加快處理速度。它特別適用於精確控製文檔中元素的位置、大小以及分頁。
- jsPDF庫易於用於基本的PDF文件生成,但由於文檔有限,對於復雜的項目可能會更具挑戰性。然而,它提供了向PDF添加文本、圖像和形狀的功能,並可精確控制位置和大小。
- jsPDF庫可以使用其API進行擴展。可以添加諸如
textAlign()
之類的函數,並使用setFontSize()
、setFont()
、setTextColor()
和setFontType()
方法更改文本屬性。 - jsPDF還允許創建多頁PDF,使用“autoTable”插件添加表格以及包含超鏈接。但是,由於瀏覽器安全限制,用戶無法指定生成的PDF的特定保存位置。
便攜式文檔格式(PDF)是桌面出版和辦公自動化領域的一項重大創新。
它也廣泛用於網絡出版,但不幸的是,很多時候使用方法不當——例如用它來替換本應使用HTML構建的內容。這會導致許多關於可用性、可訪問性、SEO等方面的問題。
但是,在某些情況下需要PDF文件:當需要存檔文檔並且必須在網絡外部使用(例如發票)時,或者當需要對打印進行深度控制時。
正是對打印控制的需求促使我去研究一種輕鬆生成PDF的方法。
本文的目的不僅僅是簡單地解釋如何創建PDF(有很多簡單的方法可以做到這一點),而且還要關注PDF文件可以解決問題的情況,以及像jsPDF這樣的簡單工具如何提供幫助。
打印處理
任何處理過CSS打印規則的人都了解實現體面的跨瀏覽器兼容性有多麼困難(例如,查看Can I Use中的分頁符支持表)。因此,當我需要構建必須打印的內容時,我總是嘗試避免使用CSS,最簡單的解決方案是使用PDF。
我這裡說的不是簡單的HTML到PDF轉換。 (我嘗試過幾種此類工具,但沒有一個完全令我滿意。)我的目標是完全控制元素的位置和大小、分頁符等等。
過去,我經常使用FPDF,這是一個PHP工具,可以輕鬆地為您提供這種控制,並且可以輕鬆地使用許多插件進行擴展。
不幸的是,該庫似乎已被放棄(其最後一個版本可以追溯到2011年)(更新:實際上,最新版本似乎是2015年12月發布的),但由於一些JavaScript庫,我們現在可以直接在客戶端構建PDF文件(從而使它們的生成速度更快)。
幾個月前,當我開始我的項目時,我搜索了一個JS庫,最終我找到了兩個候選者:jsPDF和pdfmake。 pdfmake似乎文檔齊全且易於使用,但由於它是測試版,所以我選擇了jsPDF。
使用jsPDF構建PDF
jsPDF文檔相當簡短,包括一個頁面以及一些演示,以及源文件(或其jsDoc頁面)中更多信息,因此請記住,將其用於復雜項目一開始可能會有點困難。
無論如何,jsPDF對於基本的PDF文件生成非常容易。讓我們來看一個簡單的“Hello World”示例:
var pdf = new jsPDF(); pdf.text(30, 30, 'Hello world!'); pdf.save('hello_world.pdf');
此HTML頁面生成一個單頁PDF文件並將其保存到您的計算機上。首先,您必須鏈接到jsPDF庫(在本例中,來自cdnjs.com),然後創建一個jsPDF實例,添加一行文本,並將結果保存為hello_world.pdf。
請注意,我使用了1.0.272版本,它不是最新的:在撰寫本文時,最新版本是1.1.135,但它有很多問題,所以我仍在使用之前的版本。
您可以看到構建基本PDF文件是多麼簡單(您可以在jsPDF網站上找到更多示例)。
讓我們嘗試構建更複雜的內容。
傳單項目
幾個月前,有人要求我構建一個用於創建一些簡單傳單的應用程序。它是處理旅行社服務的更大項目的一部分,真正的傳單部分由一些JSON數據填充。
傳單的主要目的是提供一種簡單的方法來顯示要在旅行社商店櫥窗中展示的特價優惠。
我已經為本文重新安排了該應用程序,刪除了所有服務器端功能,簡化了傳單設計,擺脫了舊版瀏覽器兼容性,並使用Bootstrap 3和jQuery構建了一個非常簡單的UI。
該演示與Firefox和Chrome配合良好,而Explorer(或Edge)不允許您顯示預覽,而只能下載生成的PDF。
這是一個使用該應用程序創建的PDF示例(照片來源:Rafael Leão / Unsplash)
可以在本文結尾或直接在CodePen中找到一個可運行的演示。請注意,由於CodePen在iframe中加載結果頁面,因此在iframe中加載的PDF預覽在Chrome和Safari中存在一些問題,阻止了預覽的顯示。 (如果可以,請使用Firefox,或者在我的個人網站上嘗試演示)。
傳單構建器
用戶界面允許用戶插入一些基本數據(標題、摘要和價格)。可以選擇添加圖像,否則將顯示灰框的“特價優惠”標題。
其他數據(代理名稱及其網站URL和徽標)嵌入到應用程序代碼中。
PDF可以在iframe中預覽(除了Explorer或Edge)或直接下載。
當單擊“更新預覽”或“下載”按鈕時,將使用jsPDF生成PDF,並將其作為data URI字符串傳遞到iframe或保存到磁盤,如上例所示。
PDF生成首先使用以下選項創建一個新的jsPDF對象實例:縱向方向(p)、毫米單位(mm)、“A4”格式。
var pdf = new jsPDF(); pdf.text(30, 30, 'Hello world!'); pdf.save('hello_world.pdf');
使用addImage函數添加圖像。請注意,放置在PDF頁面中的每個對像都必須精確定位。您必須使用聲明的單位來處理每個對象坐標。
var pdf = new jsPDF('p', 'mm', 'a4');
圖像必須進行Base64編碼:代理徽標以這種格式嵌入到腳本中,而用戶加載的圖像則使用$('#flyer-image').change偵聽器中的readAsDataURL方法進行編碼。
標題使用textAlign函數添加。請注意,此函數不是jsPDF核心的組成部分,但是,正如作者在他的示例中建議的那樣,可以使用其API輕鬆擴展該庫。您可以在傳單構建器腳本的頂部找到textAlign()函數:
// 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);
此函數計算文本字符串的X坐標以使其居中,然後調用本機text()方法:
pdf.textAlign(flyer_title, {align: "center"}, 0, _y);
要更改文本屬性,可以使用setFontSize()
、setFont()
、setTextColor()
和setFontType()
方法。
例如,要設置一個20pt Times Bold紅色字符串,您需要鍵入以下內容:
pdf.text(text string, X, Y);
“特價優惠”灰色框和價格圓圈使用兩種類似的方法:roundedRect()
和circle()
。兩者都需要左上角坐標、大小值(第一種情況下的寬度和高度以及第二種情況下的半徑):
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參數指的是對象的填充和描邊屬性。有效的樣式包括:S [默認] 表示描邊,F 表示填充,DF(或FD)表示填充和描邊。
填充和描邊屬性必須使用setFillColor
和setDrawColor
預先設置,它們需要RGB值和setLineWidth
,後者需要在PDF文檔創建之初聲明的單位中的線寬值。
完整的代碼可在CodePen演示中找到:
(此處應插入CodePen鏈接,由於我無法訪問外部網站,無法提供)
結論
這個基本示例展示瞭如何使用jsPDF構建非常基本的傳單。
它的使用可能很簡單,但是缺乏完整的文檔使每一步都非常複雜。
我仍在尋找其他解決方案,關注pdfmake等其他解決方案。但最終,我認為唯一真正明確的解決方案是更好地支持打印CSS規則的瀏覽器!
(此處應包含FAQ部分,內容與原文相同,但格式可根據需要調整)
以上是使用JSPDF即時從網頁生成PDF的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。
