>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
JavaScript

Documind:将混乱的 PDF 和扫描件转换为干净的 JSON

任何写过银行对账单或发票解析器的人都深知这种痛苦。你使用 pdf-parse 或传统 OCR 处理真实文档,结果得到的是一团混乱的文本行——表格列错位、日期与合同号混在一起、总计金额与明细项目名称分离。

随着多模态语言模型的出现,文档解析变得明显更容易了。但将页面转换为图像、提交模型、结构验证和最终 JSON 组装整合在一起,通常需要数百行样板代码。

我最近在 GitHub 上发现了 Documind,这是 DocumindHQ 团队的项目。这是一个小巧的 Node.js 库,负责从非结构化文档中提取结构化数据的所有繁琐工作。

Join us on Discord

这个库能做什么

Documind 在底层结合了系统页面渲染工具和视觉模型。该项目源于流行的 Zerox 工具,但已发展成为一个独立平台,用于处理数据模式。

该库解决四个特定任务:

  1. 读取多种格式:PDF、DOCX、HTML、TXT、PNG 和 JPG。
  2. 接收你的字段模式,返回从文档中提取数据的可预测 JSON。
  3. 同时支持 OpenAI 云 API 和通过 Llava 或 Llama 3.2 Vision 的本地模型。
  4. 将复杂的多页文档转换为干净的 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 的核心思想是通过字段数组定义输出对象的形状。每个字段有名称、类型(stringnumberarrayobjectbooleanenum)和文本描述,作为神经网络的提示。

以下是一个解析银行对账单的模式示例,包含嵌套的交易表格:

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)的团队。

该工具无需编写脆弱的基于正则表达式的解析器,只需几行代码就能获得类型化的结果。如果你需要快速自动化手动文档录入,这个仓库绝对值得一试。

相关项目