使用Nodejs編寫一個腳本實(shí)現(xiàn)markdown轉(zhuǎn)pdf功能
前言
Markdown 是一種輕量級的標(biāo)記語言,非常適合用來寫作和記錄,但并不是所有人都習(xí)慣或能夠直接閱讀 Markdown 文件。將 Markdown 轉(zhuǎn)換為 PDF 可以讓文檔在格式和樣式上更加統(tǒng)一,也方便在不同設(shè)備和平臺上查看和打印,方便分享給不熟悉 Markdown 的用戶。
在接下來的內(nèi)容中我們將講解如何使用 NodeJs 編寫一個 Markdown 轉(zhuǎn) PDF 的腳本來實(shí)現(xiàn)我們這個想要的功能。
實(shí)現(xiàn)
首先我們來明確一下我們的需求,我們目前的情況是主需要讀取內(nèi)容,暫時還不需要讀取樣式什么的,但是我們還需要將 Markdown 里的圖片鏈接在 pdf 里能直接顯示。
我們需要安裝 markdown-pdf 來實(shí)現(xiàn)文檔轉(zhuǎn)換,使用 node-fetch 來實(shí)現(xiàn)下載圖片,并將圖片展現(xiàn)在 pdf 上。
pnpm add markdown-pdf node-fetch
node-fetch 是一個輕量級的模塊,提供了一個類似于瀏覽器原生 fetch API 的接口,用于在 Node.js 環(huán)境中發(fā)起 HTTP 請求。這個庫主要被設(shè)計用來使服務(wù)器端的代碼能夠以一種與前端開發(fā)者熟悉的方式來進(jìn)行網(wǎng)絡(luò)請求。
接下來我們將編寫一個簡單的 NodeJs 腳本,并讀取 markdown 文件,下載其中的圖片,并將其轉(zhuǎn)換為 PDF。
import fs from "fs"; import path from "path"; import fetch from "node-fetch"; import markdownPdf from "markdown-pdf"; async function prepareMarkdown(inputFile, outputFile) { let data = fs.readFileSync(inputFile, "utf8"); const regex = /!\[.*?\]\((.*?)\)/g; let match; while ((match = regex.exec(data)) !== null) { const imageUrl = match[1]; const imageName = path.basename(imageUrl); const imagePath = "./images/" + imageName; // 確保 images 目錄存在 const directory = path.dirname(imagePath); if (!fs.existsSync(directory)) { fs.mkdirSync(directory, { recursive: true }); } // 下載圖片,如果還未下載 if (!fs.existsSync(imagePath)) { const response = await fetch(imageUrl); const buffer = Buffer.from(await response.arrayBuffer()); fs.writeFileSync(imagePath, buffer); } // 替換 Markdown 中的圖片鏈接為本地路徑 data = data.replace(imageUrl, imagePath); } // 將替換后的 Markdown 寫入到臨時文件 fs.writeFileSync(outputFile, data); } // 將 Markdown 轉(zhuǎn)換為 PDF async function markdownToPdf(inputFile, pdfFile) { const tempFile = "moment.md"; await prepareMarkdown(inputFile, tempFile); markdownPdf() .from(tempFile) .to(pdfFile, () => { console.log("PDF 創(chuàng)建成功"); fs.unlinkSync(tempFile); }); } markdownToPdf("./如何將 NestJs 應(yīng)用部署到 vercel.md", "./moment.pdf");
在上面的這些代碼中,首先使用正則表達(dá)式 regex 匹配 Markdown 文件中的圖片鏈接格式 
。此正則表達(dá)式將捕獲 Markdown 圖片的 URL。
從 url 中解析文件名,創(chuàng)建本地存儲路徑,檢查圖片是否下載,如果沒有下載則使用 fetch 獲取圖片內(nèi)容保存到本地,并將圖片路徑寫入到臨時路徑文件 outputFile。
之后將調(diào)用我們的 markdown-pdf 庫來實(shí)現(xiàn) markdown 轉(zhuǎn) pdf。
這個時候在我們終端中執(zhí)行如下命令:
node index.js
最終執(zhí)行效果如下圖所示:
它給我創(chuàng)建了一個 images 路徑,用于存放我們剛才下載到的圖片,也為我們創(chuàng)建了一個 pdf 文件,它的最終效果如下圖所示:
圖片和我們編寫的內(nèi)容都能正常顯示,那如果要給我們的內(nèi)容中添加一些樣式就非常好看了。
總結(jié)
通過上面的內(nèi)容我們實(shí)現(xiàn)了一個 markdown 轉(zhuǎn) pdf 的過程,之后如果真的有需要的話,可以加入一些樣式之類的,讓我們的外觀變得好看,我們也可以編寫好一些 css 樣式,讓他成為我們編寫簡歷的神器
到此這篇關(guān)于使用Nodejs編寫一個腳本實(shí)現(xiàn)markdown轉(zhuǎn)pdf功能的文章就介紹到這了,更多相關(guān)Nodejs markdown轉(zhuǎn)pdf內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
node.js express框架簡介與實(shí)現(xiàn)
這篇文章主要介紹了node.js express框架簡介與實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07解決npm?run?serve啟動報錯npm?ERR?Missing?script:"serve&q
這篇文章主要給大家介紹了關(guān)于解決npm?run?serve啟動報錯npm?ERR?Missing?script:"serve"的相關(guān)資料,這是最近開發(fā)中遇到的一個問題,文中通過圖文將解決辦法介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01Node.js使用sharp庫實(shí)現(xiàn)PNG圖片轉(zhuǎn)換為WebP格式
在 Node.js 中,可以使用 sharp 庫將 PNG 圖片轉(zhuǎn)換為 WebP 格式,sharp 是一個高性能的圖像處理庫,支持多種圖像格式的轉(zhuǎn)換和處理,以下是如何使用 sharp 將 PNG 圖片轉(zhuǎn)換為 WebP 的詳細(xì)步驟,需要的朋友可以參考下2024-12-12nvm報錯Now?using?node?v版本號(64-bit)圖文解決方法
這篇文章主要給大家介紹了關(guān)于nvm報錯Now?using?node?v版本號(64-bit)的解決方法,文中將解決的辦法介紹的非常詳細(xì),對遇到這個問題的朋友具有一定的參考借鑒價值,需要的朋友可以參考下2023-11-11node.js突破nginx防盜鏈機(jī)制,下載圖片案例分析
這篇文章主要介紹了node.js突破nginx防盜鏈機(jī)制,下載圖片的方法,結(jié)合具體案例形式分析了防盜鏈的相關(guān)原理與node.js使用axios庫下載防盜鏈圖片的相關(guān)操作技巧,需要的朋友可以參考下2023-04-04nodejs操作mysql實(shí)現(xiàn)增刪改查的實(shí)例
下面小編就為大家?guī)硪黄猲odejs操作mysql實(shí)現(xiàn)增刪改查的實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05