Node.js实现文本与pdf相互转换的代码详解

 更新时间:2025年07月09日 10:24:44   作者:Heo  
在IT行业中,文档格式转换是日常工作中的常见需求,Word与PDF是两种广泛应用的文档格式,它们各有优势,但有时需要相互转换以满足特定场景的需求,本篇将详细讲解如何使用Node.js实现文本与pdf相互转换,需要的朋友可以参考下

pdf 转文本

主要使用 pdf-parse 这个库,直接识别提取我们 pdf 文件中的文字。

const express = require("express");
const fs = require("fs");
const PDFParser = require("pdf-parse");
const cors = require("cors");

const pdfFilePath = "./xxx_实习生.pdf";

const app = express();

// 解决跨域问题
app.use(cors());
app.use(express.static(__dirname));
app.use(express.json());

app.post("/form2pdf", (req, res) => {
  console.log(req.body);
  const str = "";

    // 1. 读取pdf文件
  fs.readFile(pdfFilePath, (err, pdfBuffer) => {
    if (err) {
      console.log(err);
      return;
    }

    PDFParser(pdfBuffer).then((pdfData) => {
      const pages = pdfData.text.split("\n\n");
      console.log(pages);
      let str;
      for (let i = 1; i < pages.length; i++) str = str + pages[i];
      console.log(str);
    });
  });
});

app.listen(3000, () => {
  console.log("Server is running on port 3000");
});

文本转 pdf

主要使用 pdfkit 这个库将文本转为pdf文件。

const express = require("express");
const fs = require("fs");
const cors = require("cors");
const PDFDocument = require("pdfkit");

const app = express();

// 解决跨域问题
app.use(cors());
app.use(express.static(__dirname));
app.use(express.json());

app.post("/form2pdf", (req, res) => {
  console.log(req.body);
  const str = "";
  // 使用 pdfkit 生成pdf

  // 创建 PDF 文档
  const doc = new PDFDocument({
    margin: 50, // 控制上下左右留白
  });

  // 输出到文件
  // 如果有同名的 直接覆盖
  doc.pipe(fs.createWriteStream("output.pdf"));

  // ========== Header ==========
  function addHeader(doc) {
    doc.fontSize(20).text(req.body.name, { align: "center" }).moveDown();
    doc
      .moveTo(50, doc.y) // 从左边开始画横线
      .lineTo(550, doc.y) // 到右边
      .stroke();
    doc.moveDown();
  }

  // ========== Footer ==========
  function addFooter(doc) {
    const range = doc.bufferedPageRange(); // 所有页

    for (let i = range.start; i < range.start + range.count; i++) {
      doc.switchToPage(i);
      doc
        .fontSize(10)
        .fillColor("gray")
        .text(`第 ${i + 1} 页`, 0, doc.page.height - 50, {
          align: "center",
        });
    }
  }

  // ========== Body ==========
  function addBody(doc) {
    doc.fontSize(12);
    doc.text(req.body.name + " " + req.body.sex + " " + req.body.age, {
      align: "left",
      lineGap: 4,
    });
  }

  // 添加内容
  addHeader(doc);
  addBody(doc);

  // 结束前添加 footer(多页也有效)
  doc.end();
  doc.on("end", () => {
    addFooter(doc);
  });

  // 把后端的pdf地址返回给前端
  res.json({
    code: 200,
    data: "http://localhost:3000/output.pdf",
  });
  res.send("PDF generated successfully!");
});

app.listen(3000, () => {
  console.log("Server is running on port 3000");
});

浏览器缓存引发的小问题

之前自己写 demo,遇到一个小问题,可能刚刚入门的小白一时找不到原因,特此记录下:

  • 后端生成pdf文件,但是名称都相同(而且由于前端通过 iframe 渲染 pdf 的url 地址,url 地址也相同)
  • 尽管内容不同,但是浏览器发现相同的名称pdf(静态文件),会继续使用缓存,导致后端pdf虽然重新覆盖生成,但是前端浏览器中的 iframe 渲染的 pdf 还是旧的(缓存中的)。

解决方法是:

<iframe :src="url" width="100%" height="1200px"></iframe>

const onSubmit = () => {
  axios.post("http://localhost:3000/form2pdf", form).then((res) => {
    url.value = res.data.data + "?t=" + Date.now();
    console.log(url);
  });
};

添加一个时间戳来阻止浏览器继续使用缓存,以保证每次重新请求都可以渲染最新的pdf 文件数据。

  1. 浏览器为什么会缓存 PDF?

静态资源(如 PDF、图片、JS、CSS)默认会被浏览器缓存。
这是因为 Express 的 express.static() 中间件会自动为静态资源设置缓存相关的 HTTP 头(如 Cache-Control),让浏览器下次访问同样的 URL 时直接用本地缓存,加快加载速度、减少服务器压力。

只要 URL 一样,且没有特殊的禁止缓存设置,浏览器就会优先用缓存。

如果在 /form2pdf 路由里加了:

res.setHeader("Cache-Control", 'no-store');

但这个 header 只作用于 /form2pdf 这个接口的响应,output.pdf 这个静态文件的响应没有影响
output.pdf 的响应是由 express.static(__dirname) 处理的,和接口响应头无关。

  1. 为什么加参数能解决?

当你访问 output.pdf?t=xxx 时,浏览器认为这是一个全新的资源(即使实际文件一样),所以会重新请求服务器,不会用缓存。

  1. 如何让静态 PDF 不被缓存?

可以让 Express 静态资源响应时加上禁止缓存的 header:

app.use(express.static(__dirname, {
  setHeaders: (res, path) => {
    if (path.endsWith('.pdf')) {
      res.setHeader('Cache-Control', 'no-store');
    }
  }
}));

这样浏览器每次都会重新请求 PDF 文件。

到此这篇关于Node.js实现文本与pdf相互转换的代码详解的文章就介绍到这了,更多相关Node.js文本与pdf互转内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Node.js中修改全局变量的方式及注意事项

    Node.js中修改全局变量的方式及注意事项

    本文详细介绍了在Node.js中如何修改全局变量,包括全局变量的定义方式、正确的修改姿势、潜在的隐患及其解决方案,以及推荐的替代方案,总结建议了在实际应用中应尽量避免使用全局变量,转而采用模块化、可维护性更高的方法,感兴趣的朋友一起看看吧
    2025-02-02
  • Node.js的cross-env工具包使用介绍

    Node.js的cross-env工具包使用介绍

    这篇文章主要为大家介绍了Node.js的cross-env工具包使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • node如何实现简单的脚手架浅析

    node如何实现简单的脚手架浅析

    在工作中,需要开发一个脚手架,用于给相关用户提供相关的开发便利性,下面这篇文章主要给大家介绍了关于node如何实现简单的脚手架的相关资料,需要的朋友可以参考下
    2022-05-05
  • node.js中的fs.exists方法使用说明

    node.js中的fs.exists方法使用说明

    这篇文章主要介绍了node.js中的fs.exists方法使用说明,本文介绍了fs.exists方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12
  • 三分钟教会你用nodejs操作mysql数据库

    三分钟教会你用nodejs操作mysql数据库

    MySQL数据库作为最流行的开源数据库,基本上是每个web开发者必须要掌握的数据库程序之一了,基本使用 node.js上,最受欢迎的mysql包就是mysql模块,下面这篇文章主要给大家介绍了关于如何通过三分钟教会你用nodejs操作mysql数据库,需要的朋友可以参考下
    2023-05-05
  • Node.js完整安装配置指南(包含国内镜像配置)

    Node.js完整安装配置指南(包含国内镜像配置)

    本文介绍Node.js的安装配置过程,包括使用Chocolatey、官网下载、国内镜像下载等安装方法,验证安装,配置国内镜像源,环境变量配置,npm配置优化,常用镜像测速脚本,使用nrm管理镜像源,及故障排查内容,最后推荐了完整的配置命令和立即解决方案,感兴趣的朋友跟随小编一起看看吧
    2026-03-03
  • 解决yarn安装依赖包报错error An unexpected error occurred: https://registry.npm.taobao.orgnpm/element-ui: get问题

    解决yarn安装依赖包报错error An unexpected error o

    文章主要讲述了在使用yarn安装依赖包时遇到的错误,并提供了解决方案,建议将请求地址设置为淘宝源,对node-sass镜像源进行设置,最后重新下载依赖包
    2026-04-04
  • Node.js Sequelize如何实现数据库的读写分离

    Node.js Sequelize如何实现数据库的读写分离

    Sequelize是一个易于使用,支持多SQL方言(dialect)的对象-关系映射框架(ORM),这个库完全采用JavaScript开发并且能够用在Node.JS环境中。它当前支持MySQL, MariaDB, SQLite 和 PostgreSQL 数据库。在Node.js中,使用 Sequelize操作数据库时,同样支持读写分离。
    2016-10-10
  • Node4-5静态资源服务器实战以及优化压缩文件实例内容

    Node4-5静态资源服务器实战以及优化压缩文件实例内容

    这篇文章主要介绍了Node4-5静态资源服务器实战以及优化压缩文件实例内容,有需要的朋友们可以参考学习下。
    2019-08-08
  • linux 后台运行node服务指令方法

    linux 后台运行node服务指令方法

    今天小编就为大家分享一篇linux 后台运行node服务指令方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05

最新评论