Node.js 实现 PDF 转 Word:高效转换指南与实战代码

Node.js 实现 PDF 转 Word:高效转换指南与实战代码

在自动化办公和文档处理场景中,将 PDF 文件转换为可编辑的 Word(.docx)格式是一个常见需求。Node.js 凭借其丰富的 npm 生态和异步 I/O 特性,成为实现这一功能的绝佳选择。本文将带你一步步构建一个可靠的 PDF 转 Word 转换器。

一、 工具选型:核心 npm 包对比

在 Node.js 中处理 PDF 并转换为 Word,主要涉及两类库:用于读取 PDF 内容的库和用于生成 Word 文档的库。

  • 读取 PDF:
    • pdf-parse:基于 pdfjs-dist,提供简单的 API 来提取 PDF 的文本和元数据。适用于文本提取为主的场景。
    • pdf2json:将 PDF 结构解析为 JSON 格式,保留更多位置和格式信息(如坐标、字体),适合需要重建布局的场景。
  • 生成 Word:
    • mammoth:虽然主要用于 Word 转 HTML,但其反向思路(从结构化数据生成)或配合其他库使用有一定潜力。
    • docx(formerly officegen)或 docxtemplater:功能强大的库,用于从头创建结构复杂的 .docx 文件。

二、 实战:基于 pdf-parse 和 docx 的简单转换

以下示例将使用 pdf-parse 提取文本,并用 docx 库创建一个基础的 Word 文档。

1. 初始化项目与安装依赖

mkdir pdf-to-word && cd pdf-to-word
npm init -y
npm install pdf-parse docx fs

2. 编写转换脚本 (convert.js)

const fs = require('fs');
const pdfParse = require('pdf-parse');
const { Document, Packer, Paragraph, TextRun } = require('docx');

async function convertPdfToWord(pdfPath, outputPath) {
  // 1. 读取 PDF 文件
  const dataBuffer = fs.readFileSync(pdfPath);

  // 2. 解析 PDF 文本
  const pdfData = await pdfParse(dataBuffer);
  const textContent = pdfData.text;

  // 3. 将文本按行分割(简单处理)
  const lines = textContent.split('\n');

  // 4. 创建 Word 文档内容
  const doc = new Document({
    sections: [{
      children: lines.map(line => {
        // 每一行作为一个段落
        return new Paragraph({
          children: [new TextRun(line)],
        });
      })
    }]
  });

  // 5. 生成 .docx 文件并保存
  const buffer = await Packer.toBuffer(doc);
  fs.writeFileSync(outputPath, buffer);
  console.log(`转换完成!文件已保存至: ${outputPath}`);
}

// 使用示例
convertPdfToWord('input.pdf', 'output.docx');

三、 进阶考量与挑战

上述简单示例仅提取了纯文本。在实际应用中,PDF 往往包含复杂的格式、图片、表格和多列布局。

常见挑战与解决方案:

  1. 布局保留: 使用 pdf2json 解析出的 JSON 包含每个文本块的坐标信息(x, y),你可以利用这些坐标在 Word 文档中使用文本框或精确制表符来近似重建原始布局。
  2. 格式(字体、颜色): pdf2json 也提供了字体信息。在生成 Word 时,可以将这些信息映射到 TextRun 的样式属性上。
  3. 图片提取: 需要更底层的 PDF 库(如 pdfjs-dist 的低级 API)来单独提取图片资源,然后使用 docx 库的 ImageRun 插入到相应位置。
  4. 表格识别: 这是最复杂的部分之一。通常需要结合 PDF 中的线条信息进行启发式分析,或借助 OCR/AI 工具来识别表格结构。

四、 替代方案与推荐

如果追求极高的转换保真度,可以考虑:

  • 调用专业服务 API: 如 Adobe PDF Services API、Smallpdf API 等,它们提供云端的高质量转换服务。
  • 命令行工具结合: 使用 Node.js 的 child_process 调用成熟的命令行工具,如 LibreOffice 的 headless 模式(soffice --convert-to docx input.pdf)。

总结

使用 Node.js 实现 PDF 转 Word 是一个强大且灵活的选择。对于简单文本提取,pdf-parse 配合 docx 库即可快速实现。对于复杂文档,则需要更深入地解析 PDF 结构并进行大量的映射和重建工作。在实际项目中,请根据对格式保真度的要求和开发成本,权衡选择自建库组合还是调用第三方专业服务。