如何使用 Puppeteer 和 Node.js 創(chuàng)建 PDF 生成器
生成動(dòng)態(tài) PDF 是 Web 開發(fā)中的常見要求。無論是發(fā)票、報(bào)告還是簡(jiǎn)歷,創(chuàng)建強(qiáng)大的 PDF 生成器都是開發(fā)人員的一項(xiàng)基本技能。在本文中,我將引導(dǎo)您使用 Node.js 和 Puppeteer(一個(gè)強(qiáng)大的無頭瀏覽器庫)構(gòu)建 PDF 生成器。
作為示例,我使用相同的方法來構(gòu)建我的 CV Maker 項(xiàng)目,它接受用戶輸入并動(dòng)態(tài)生成 PDF。您可以在此處查看該項(xiàng)目的現(xiàn)場(chǎng)演示:Live Demo。
本指南以簡(jiǎn)單、適合初學(xué)者的語言編寫。如果有任何不清楚的地方,請(qǐng)隨時(shí)發(fā)表評(píng)論,我會(huì)盡快解決。
先決條件
在我們開始之前,請(qǐng)確保您具備以下條件:
- Node.js 安裝在您的計(jì)算機(jī)上。
- 基本的 Node.js 項(xiàng)目框架 設(shè)置。
- Puppeteer 作為項(xiàng)目中的依賴項(xiàng)安裝:
npm install puppeteer
如果您想?yún)⒖急窘坛痰耐暾创a,請(qǐng)查看我的 GitHub 存儲(chǔ)庫。
第 1 步:創(chuàng)建用于接收數(shù)據(jù)的 POST 端點(diǎn)
首先,創(chuàng)建一個(gè)端點(diǎn),客戶端可以在其中發(fā)送數(shù)據(jù)以生成 PDF。為此,我們將在 index.js(或等效的主服務(wù)器文件)中定義一個(gè)簡(jiǎn)單的 POST 路由。
app.post("/data", async (req: Request, res: Response) => { let postData = req.body.data; // Storing the data sent from the client });
該端點(diǎn)將接收需要包含在PDF中的數(shù)據(jù)。
第2步:創(chuàng)建控制器文件
為了保持代碼井井有條,請(qǐng)?jiān)陧?xiàng)目目錄中創(chuàng)建一個(gè)名為“controllers”的文件夾。在此文件夾中,創(chuàng)建一個(gè)名為 PdfController.js 的文件。
控制器文件是我們編寫生成 PDF 邏輯的地方。這使我們的代碼保持模塊化并使其更易于維護(hù)。
第 3 步:編寫 PDF 生成邏輯
在 PdfController.js 中,添加以下代碼以使用 Puppeteer 生成 PDF:
export default (async function (postData) { try { const browser = await puppeteer.launch({ headless: true, args: ["--no-sandbox", "--disable-gpu"], }); const page = await browser.newPage(); const content = `<html><body><h1>${postData}</h1></body></html>`; await page.setContent(content); await page.emulateMediaType('screen'); await page.pdf({ path: 'resume.pdf', format: 'A4', printBackground: true, }); console.log('PDF created'); await browser.close(); } catch (err) { console.error('Error:', err); } });
以下是這段代碼的作用:
- 以無頭模式啟動(dòng) Puppeteer 瀏覽器實(shí)例。
- 打開一個(gè)新頁面并使用用戶提供的數(shù)據(jù)設(shè)置內(nèi)容。
- 將頁面內(nèi)容轉(zhuǎn)換為PDF并另存為resume.pdf。
- 關(guān)閉瀏覽器以釋放資源。
步驟 4:在 POST 端點(diǎn)中使用 PdfController 函數(shù)
現(xiàn)在,將 PdfController 函數(shù)連接到 index.js 中的 POST 端點(diǎn):
import PdfController from "./controllers/controller.js"; app.post("/data", async (req: Request, res: Response) => { let postData = req.body.data; // Storing the data sent from the client await PdfController(postData); });
這確保每當(dāng)調(diào)用 /data 端點(diǎn)時(shí),都會(huì)執(zhí)行生成 PDF 的邏輯。
第 5 步:驗(yàn)證 PDF 生成
此時(shí),您可以使用 Postman 或任何其他 HTTP 客戶端來測(cè)試端點(diǎn)。當(dāng)您發(fā)送帶有相關(guān)文本數(shù)據(jù)的 POST 請(qǐng)求時(shí),將在項(xiàng)目的根目錄中創(chuàng)建一個(gè)名為resume.pdf 的 PDF。
第 6 步:將 PDF 發(fā)送回客戶
要將生成的 PDF 作為響應(yīng)發(fā)送回客戶端,請(qǐng)安裝 fs-extra 軟件包:
npm install puppeteer
然后按如下方式更新 POST 端點(diǎn):
app.post("/data", async (req: Request, res: Response) => { let postData = req.body.data; // Storing the data sent from the client });
此代碼將resume.pdf 文件作為可下載附件發(fā)送給客戶端。
結(jié)論
就是這樣! ?您已經(jīng)使用 Node.js 和 Puppeteer 構(gòu)建了一個(gè)完整的 PDF 生成器。此設(shè)置根據(jù)用戶輸入動(dòng)態(tài)生成 PDF 并將其作為可下載文件發(fā)送回。
這是您取得的成就:
- 使用 POST 端點(diǎn)設(shè)置 Node.js 服務(wù)器。
- 使用 Puppeteer 動(dòng)態(tài)生成 PDF。
- 將生成的PDF發(fā)送回客戶端。
獎(jiǎng)金
如果您想生成結(jié)構(gòu)良好且格式良好的 PDF(例如帶有表格和樣式的簡(jiǎn)歷或發(fā)票),請(qǐng)?jiān)谠u(píng)論中告訴我。我很樂意為高級(jí)用例編寫另一篇教程。
此外,請(qǐng)隨時(shí)查看完整的項(xiàng)目代碼。它有詳細(xì)的文檔并且適合初學(xué)者。
祝你有美好的一天!
以上是使用 puppeteer 和 Node 來創(chuàng)建 PDF!的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

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

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

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

Clothoff.io
AI脫衣機(jī)

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

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的代碼編輯器

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

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

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

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

Java和JavaScript是不同的編程語言,各自適用于不同的應(yīng)用場(chǎng)景。Java用于大型企業(yè)和移動(dòng)應(yīng)用開發(fā),而JavaScript主要用于網(wǎng)頁開發(fā)。

JavascriptconcommentsenceenceEncorenceEnterential gransimenting,reading and guidingCodeeXecution.1)單inecommentsareusedforquickexplanations.2)多l(xiāng)inecommentsexplaincomplexlogicorprovideDocumentation.3)

JavaScript中的日期和時(shí)間處理需注意以下幾點(diǎn):1.創(chuàng)建Date對(duì)象有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設(shè)置時(shí)間信息可用get和set方法,注意月份從0開始;3.手動(dòng)格式化日期需拼接字符串,也可使用第三方庫;4.處理時(shí)區(qū)問題建議使用支持時(shí)區(qū)的庫,如Luxon。掌握這些要點(diǎn)能有效避免常見錯(cuò)誤。

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScriptIspreferredforredforwebdevelverment,而Javaisbetterforlarge-ScalebackendsystystemsandSandAndRoidApps.1)JavascriptexcelcelsincreatingInteractiveWebexperienceswebexperienceswithitswithitsdynamicnnamicnnamicnnamicnnamicnemicnemicnemicnemicnemicnemicnemicnemicnddommanipulation.2)

javascripthassevenfundaMentalDatatypes:數(shù)字,弦,布爾值,未定義,null,object和symbol.1)numberSeadUble-eaduble-ecisionFormat,forwidevaluerangesbutbecautious.2)

事件捕獲和冒泡是DOM中事件傳播的兩個(gè)階段,捕獲是從頂層向下到目標(biāo)元素,冒泡是從目標(biāo)元素向上傳播到頂層。1.事件捕獲通過addEventListener的useCapture參數(shù)設(shè)為true實(shí)現(xiàn);2.事件冒泡是默認(rèn)行為,useCapture設(shè)為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委托,提高動(dòng)態(tài)內(nèi)容處理效率;5.捕獲可用于提前攔截事件,如日志記錄或錯(cuò)誤處理。了解這兩個(gè)階段有助于精確控制JavaScript響應(yīng)用戶操作的時(shí)機(jī)和方式。

Java和JavaScript是不同的編程語言。1.Java是靜態(tài)類型、編譯型語言,適用于企業(yè)應(yīng)用和大型系統(tǒng)。2.JavaScript是動(dòng)態(tài)類型、解釋型語言,主要用于網(wǎng)頁交互和前端開發(fā)。
