使用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è)計(jì)用來使服務(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-webkit 不支持html5播放mp4視頻的方法
本文給大家分享的是解決node-webkit 不支持html5播放mp4視頻的方法,其原因大概是因?yàn)閚ode-webkit沒有購買mp4格式的專利授權(quán),恩,我們來想個辦法來解決這個事情吧。2015-03-03
Node.js 使用 gRPC從定義到實(shí)現(xiàn)過程詳解
gRPC是一個高性能、開源的遠(yuǎn)程過程調(diào)用(RPC)框架,由 Google 開發(fā),它支持多種編程語言,旨在簡化和優(yōu)化分布式系統(tǒng)中的服務(wù)通信,本文給大家介紹Node.js 使用 gRPC從定義到實(shí)現(xiàn)過程,感興趣的朋友跟隨小編一起看看吧2024-07-07
前端+nodejs+mysql實(shí)現(xiàn)前后端聯(lián)通的完整代碼
Node.js主要屬于后端技術(shù),但也可以用于前端開發(fā)的某些場景,下面這篇文章主要介紹了前端+nodejs+mysql實(shí)現(xiàn)前后端聯(lián)通的完整代碼,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04
Node.js中child_process實(shí)現(xiàn)多進(jìn)程
這篇文章主要介紹了Node.js中child_process實(shí)現(xiàn)多進(jìn)程,需要的朋友可以參考下2015-02-02
nodejs配置express服務(wù)器運(yùn)行自動打開瀏覽器詳細(xì)步驟
在nodejs中使用express來搭建框架可以說是非常的簡單方便,下面這篇文章主要給大家介紹了關(guān)于nodejs配置express服務(wù)器運(yùn)行自動打開瀏覽器的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01

