下面给你一份 《Node.js 实现 TXT ⇄ PDF 相互转换的完整方案 + 代码详解》,包含:
✔ TXT → PDF
✔ PDF → TXT(提取文字)
✔ 使用两套库(pdfkit、pdf-parse)
✔ 关键注意事项(换行、编码、中文字体嵌入)
✔ 可直接运行完整代码示例
🚀 一、环境准备
安装两个核心包:
npm install pdfkit pdf-parse
说明:
| 作用 | 包 |
|---|---|
| 生成 PDF(TXT → PDF) | pdfkit |
| 解析 PDF(PDF → TXT) | pdf-parse |
📌 二、TXT → PDF(Node.js 生成 PDF 文件)
注意:默认 PDFKit 不支持中文,需要加载字体!
① 创建目录结构
project/
├─ index.js
├─ input.txt
└─ fonts/
└─ NotoSansSC-Regular.otf // 推荐使用开源中文字体
常用免费中文字体(Google Noto):
下载后放入 fonts 目录即可。
✅ ② TXT → PDF 完整代码(可直接运行)
// convert-txt-to-pdf.js
const fs = require('fs');
const PDFDocument = require('pdfkit');
function txtToPdf(inputPath, outputPath) {
const text = fs.readFileSync(inputPath, "utf-8");
const doc = new PDFDocument({
font: "fonts/NotoSansSC-Regular.otf",
margin: 50
});
doc.pipe(fs.createWriteStream(outputPath));
doc.font("fonts/NotoSansSC-Regular.otf")
.fontSize(12)
.text(text, {
lineGap: 4,
paragraphGap: 10
});
doc.end();
console.log("TXT 转 PDF 成功:", outputPath);
}
// 调用
txtToPdf("input.txt", "output.pdf");
📌 支持中文、换行、自动分页
📌 100% 可运行
🚀 三、PDF → TXT(提取 PDF 内容)
使用 pdf-parse 提取纯文本内容。
📌 支持中文(PDF 内必须嵌入字体)
无法提取图片中的文字(那必须用 OCR)
✅ PDF → TXT 完整代码
// convert-pdf-to-txt.js
const fs = require('fs');
const pdfParse = require('pdf-parse');
async function pdfToTxt(inputPath, outputPath) {
const buffer = fs.readFileSync(inputPath);
const data = await pdfParse(buffer);
fs.writeFileSync(outputPath, data.text, "utf-8");
console.log("PDF 转 TXT 成功:", outputPath);
}
// 调用
pdfToTxt("output.pdf", "parsed.txt");
📌 四、PDF → TXT 解析得到的内容结构
pdf-parse 返回一个对象:
{
numpages: 3,
numrender: 3,
info: { ... },
metadata: {},
text: "...解析出的文本..."
}
你主要用 data.text。
🧩 五、TXT ⇄ PDF 缺陷 & 注意事项
1. PDFKit 默认不支持中文
必须加载中文字体:
doc.font("fonts/NotoSansSC-Regular.otf");
否则中文会变成方块(□)。
2. PDF → TXT 可能会丢失格式
PDF 本质上是绝对定位的排版文件:
- 换行可能不完全准确
- 多栏排版的顺序可能混乱
- 表格不会转换成表格(变成纯文本)
3. 图片中的文字不能提取
必须使用 OCR,例如:
tesseract.js- 云 OCR 接口(腾讯/阿里/百度)
如果你需要,我可以给你提供 Node.js OCR 提取 PDF 中文的完整代码。
🏁 六、整合:写一个双向转换 CLI 工具(附完整代码)
如需一个:
node convert.js --txt input.txt --pdf out.pdf
node convert.js --pdf input.pdf --txt out.txt
发表回复