Documind:将混乱的 PDF 和扫描件转换为干净的 JSON
任何写过银行对账单或发票解析器的人都深知这种痛苦。你使用 pdf-parse 或传统 OCR 处理真实文档,结果得到的是一团混乱的文本行——表格列错位、日期与合同号混在一起、总计金额与明细项目名称分离。
随着多模态语言模型的出现,文档解析变得明显更容易了。但将页面转换为图像、提交模型、结构验证和最终 JSON 组装整合在一起,通常需要数百行样板代码。
我最近在 GitHub 上发现了 Documind,这是 DocumindHQ 团队的项目。这是一个小巧的 Node.js 库,负责从非结构化文档中提取结构化数据的所有繁琐工作。
这个库能做什么
Documind 在底层结合了系统页面渲染工具和视觉模型。该项目源于流行的 Zerox 工具,但已发展成为一个独立平台,用于处理数据模式。
该库解决四个特定任务:
- 读取多种格式:PDF、DOCX、HTML、TXT、PNG 和 JPG。
- 接收你的字段模式,返回从文档中提取数据的可预测 JSON。
- 同时支持 OpenAI 云 API 和通过 Llava 或 Llama 3.2 Vision 的本地模型。
- 将复杂的多页文档转换为干净的 Markdown,保留表格和列表结构。
如果你没有时间手动定义字段模式,Documind 可以根据第一个文档的内容自动生成模式。
快速开始和系统依赖
该库使用 JavaScript 编写,要求 Node.js 18 及以上版本。由于将 PDF 页面渲染为图像需要底层工具,在安装 npm 包之前,你需要在系统中安装 Ghostscript 和 GraphicsMagick。
在 macOS 上,通过 Homebrew 安装:
brew install ghostscript graphicsmagick
在 Ubuntu 或 Debian 上:
sudo apt-get update
sudo apt-get install -y ghostscript graphicsmagick
之后,安装包本身:
npm install documind
要使用 OpenAI,在项目根目录创建 .env 文件并传入密钥:
OPENAI_API_KEY=your_openai_api_key
如何定义数据模式
Documind 的核心思想是通过字段数组定义输出对象的形状。每个字段有名称、类型(string、number、array、object、boolean、enum)和文本描述,作为神经网络的提示。
以下是一个解析银行对账单的模式示例,包含嵌套的交易表格:
const schema = [
{
name: "accountNumber",
type: "string",
description: "The account number of the bank statement."
},
{
name: "openingBalance",
type: "number",
description: "The opening balance of the account."
},
{
name: "transactions",
type: "array",
description: "List of transactions in the account.",
children: [
{
name: "date",
type: "string",
description: "Transaction date."
},
{
name: "creditAmount",
type: "number",
description: "Credit Amount of the transaction."
},
{
name: "debitAmount",
type: "number",
description: "Debit Amount of the transaction."
},
{
name: "description",
type: "string",
description: "Transaction description."
}
]
},
{
name: "closingBalance",
type: "number",
description: "The closing balance of the account."
}
];
现在将模式和文件 URL 传递给 extract 函数:
import { extract } from 'documind';
async function main() {
const result = await extract({
file: 'https://example.com/bank_statement.pdf',
schema
});
console.log(JSON.stringify(result, null, 2));
}
main();
结果是可直接使用的对象,无需用正则表达式解析原始文本:
{
"success": true,
"pages": 1,
"data": {
"accountNumber": "100002345",
"openingBalance": 3200,
"transactions": [
{
"date": "2021-05-12",
"creditAmount": null,
"debitAmount": 100,
"description": "transfer to Tom"
},
{
"date": "2021-05-12",
"creditAmount": 50,
"debitAmount": null,
"description": "For lunch the other day"
}
],
"closingBalance": 2420
},
"fileName": "bank_statement.pdf"
}
现成模板
对于收据、发票或标准对账单等典型文档,你无需从头编写模式。该库包含内置模板。
你可以这样查看可用的预设列表:
import { templates } from 'documind';
console.log(templates.list());
使用模板调用解析甚至更简单:
import { extract } from 'documind';
const result = await extract({
file: 'https://example.com/bank_statement.pdf',
template: 'bank_statement'
});
本地模型和数据安全
文档通常包含个人数据、病历或机密财务信息,不能发送到外部云 API。
Documind 的开发者内置了对本地视觉模型的支持。你可以在自己的 GPU 服务器上部署 Llama 3.2 Vision 或 Llava,并将请求定向到那里。解析过程保持不变,但数据永远不会离开你的私有网络。
需要注意的事项
在将项目部署到生产环境之前,有几个细节需要考虑:
- AGPL v3.0 许可证。如果你计划将 Documind 直接嵌入到闭源商业后端中,严格的 AGPL 要求可能会成为法律问题。在这种情况下,更好的做法是将文档处理隔离到单独的微服务中。
- 系统二进制文件。Ghostscript 和 GraphicsMagick 在无服务器环境(如 AWS Lambda 或 Vercel Functions)中会使部署变得复杂,除非你构建自定义 Docker 镜像。
谁会发现它有用
Documind 非常适合构建入站文档处理管道、实现金融科技服务自动化,或准备上传到向量存储库的非结构化文档数据库(RAG)的团队。
该工具无需编写脆弱的基于正则表达式的解析器,只需几行代码就能获得类型化的结果。如果你需要快速自动化手动文档录入,这个仓库绝对值得一试。
相关项目