使用Nodejs编写一个脚本实现markdown转pdf功能

 更新时间:2024年05月14日 08:29:21   作者:Moment  
Markdown 是一种轻量级的标记语言,非常适合用来写作和记录,将 Markdown 转换为 PDF 可以让文档在格式和样式上更加统一,也方便在不同设备和平台上查看和打印,在接下来的内容中我们将讲解如何使用 NodeJs 编写一个 Markdown 转 PDF 的脚本来实现我们这个想要的功能

前言

Markdown 是一种轻量级的标记语言,非常适合用来写作和记录,但并不是所有人都习惯或能够直接阅读 Markdown 文件。将 Markdown 转换为 PDF 可以让文档在格式和样式上更加统一,也方便在不同设备和平台上查看和打印,方便分享给不熟悉 Markdown 的用户。

在接下来的内容中我们将讲解如何使用 NodeJs 编写一个 Markdown 转 PDF 的脚本来实现我们这个想要的功能。

实现

首先我们来明确一下我们的需求,我们目前的情况是主需要读取内容,暂时还不需要读取样式什么的,但是我们还需要将 Markdown 里的图片链接在 pdf 里能直接显示。

我们需要安装 markdown-pdf 来实现文档转换,使用 node-fetch 来实现下载图片,并将图片展现在 pdf 上。

pnpm add markdown-pdf node-fetch

node-fetch 是一个轻量级的模块,提供了一个类似于浏览器原生 fetch API 的接口,用于在 Node.js 环境中发起 HTTP 请求。这个库主要被设计用来使服务器端的代码能够以一种与前端开发者熟悉的方式来进行网络请求。

接下来我们将编写一个简单的 NodeJs 脚本,并读取 markdown 文件,下载其中的图片,并将其转换为 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 转换为 PDF
async function markdownToPdf(inputFile, pdfFile) {
  const tempFile = "moment.md";
  await prepareMarkdown(inputFile, tempFile);
  markdownPdf()
    .from(tempFile)
    .to(pdfFile, () => {
      console.log("PDF 创建成功");

      fs.unlinkSync(tempFile);
    });
}

markdownToPdf("./如何将 NestJs 应用部署到 vercel.md", "./moment.pdf");

在上面的这些代码中,首先使用正则表达式 regex 匹配 Markdown 文件中的图片链接格式 ![xxx](url)。此正则表达式将捕获 Markdown 图片的 URL。

从 url 中解析文件名,创建本地存储路径,检查图片是否下载,如果没有下载则使用 fetch 获取图片内容保存到本地,并将图片路径写入到临时路径文件 outputFile。

之后将调用我们的 markdown-pdf 库来实现 markdown 转 pdf。

这个时候在我们终端中执行如下命令:

node index.js

最终执行效果如下图所示:

它给我创建了一个 images 路径,用于存放我们刚才下载到的图片,也为我们创建了一个 pdf 文件,它的最终效果如下图所示:

图片和我们编写的内容都能正常显示,那如果要给我们的内容中添加一些样式就非常好看了。

总结

通过上面的内容我们实现了一个 markdown 转 pdf 的过程,之后如果真的有需要的话,可以加入一些样式之类的,让我们的外观变得好看,我们也可以编写好一些 css 样式,让他成为我们编写简历的神器

到此这篇关于使用Nodejs编写一个脚本实现markdown转pdf功能的文章就介绍到这了,更多相关Nodejs markdown转pdf内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Node.js中require的工作原理浅析

    Node.js中require的工作原理浅析

    这篇文章主要介绍了Node.js中require的工作原理浅析,通过分析node.js的源码得到本文,需要的朋友可以参考下
    2014-06-06
  • node.js express框架简介与实现

    node.js express框架简介与实现

    这篇文章主要介绍了node.js express框架简介与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Node.js入门笔记 之async模块

    Node.js入门笔记 之async模块

    这篇文章主要介绍了Node.js入门笔记 之async模块,async是一个异步处理模块,主要有三个方式:串行无关联、并行无关联 、串行有关联,文章围绕主题展开更多的相关内容,需要的小伙伴可以参考一下
    2022-06-06
  • 一文详解Node.js服务器动态资源处理

    一文详解Node.js服务器动态资源处理

    动态资源处理也就是对数据进行重新排序来读写数据库,读取反序列化,写入序列化,这篇文章主要来和大家聊聊Node.js中的服务器动态资源处理,感兴趣的可以了解下
    2024-04-04
  • 解决npm run serve启动报错npm ERR Missing script:"serve"

    解决npm run serve启动报错npm ERR Missing script:"serve&q

    这篇文章主要给大家介绍了关于解决npm run serve启动报错npm ERR Missing script:"serve"的相关资料,这是最近开发中遇到的一个问题,文中通过图文将解决办法介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • Node.js使用sharp库实现PNG图片转换为WebP格式

    Node.js使用sharp库实现PNG图片转换为WebP格式

    在 Node.js 中,可以使用 sharp 库将 PNG 图片转换为 WebP 格式,sharp 是一个高性能的图像处理库,支持多种图像格式的转换和处理,以下是如何使用 sharp 将 PNG 图片转换为 WebP 的详细步骤,需要的朋友可以参考下
    2024-12-12
  • nvm报错Now using node v版本号(64-bit)图文解决方法

    nvm报错Now using node v版本号(64-bit)图文解决方法

    这篇文章主要给大家介绍了关于nvm报错Now using node v版本号(64-bit)的解决方法,文中将解决的办法介绍的非常详细,对遇到这个问题的朋友具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-11-11
  • node.js突破nginx防盗链机制,下载图片案例分析

    node.js突破nginx防盗链机制,下载图片案例分析

    这篇文章主要介绍了node.js突破nginx防盗链机制,下载图片的方法,结合具体案例形式分析了防盗链的相关原理与node.js使用axios库下载防盗链图片的相关操作技巧,需要的朋友可以参考下
    2023-04-04
  • nodejs操作mysql实现增删改查的实例

    nodejs操作mysql实现增删改查的实例

    下面小编就为大家带来一篇nodejs操作mysql实现增删改查的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 一文带你了解Node.js中的path模块

    一文带你了解Node.js中的path模块

    Node.js和Python技术类似, 都致力于能够实现跨平台的通用代码。 为此,针对路径的拼接, Node.js提供了path模块,本文就来讲讲path模块的使用
    2023-03-03

最新评论