Documind превращает кривые PDF и сканы в строгий JSON
Репозиторий давно не обновлялся
Последнее обновление было 1 год назад.
Каждый, кто хоть раз писал парсер банковских выписок или счетов-фактур, знает эту боль. Берёшь pdf-parse или классический OCR, запускаешь на реальном документе и получаешь хаотичный суп из строчек, где колонки таблиц съехали, даты перепутались с номерами договоров, а итоговые суммы оторвались от названий позиций.
С появлением мультимодальных языковых моделей парсинг документов стал заметно проще. Но чтобы склеить воедино конвертацию страниц в картинки, отправку в модель, валидацию структуры и сборку готового JSON, обычно приходится писать сотни строк шаблонного кода.
Недавно на GitHub наткнулся на проект Documind от команды DocumindHQ. Это небольшая Node.js библиотека, которая берёт на себя всю грязную работу по извлечению структурированных данных из неструктурированных документов.
Что умеет библиотека
Под капотом Documind объединяет системные утилиты рендеринга страниц и vision-модели. Проект вырос из наработок популярного инструмента Zerox, но развился в отдельную платформу для работы со схемами данных.
Библиотека решает четыре конкретные задачи:
- Читает разнородные форматы: PDF, DOCX, HTML, TXT, PNG и JPG.
- Принимает вашу схему полей и возвращает предсказуемый JSON, заполненный данными из документа.
- Умеет работать как с облачным API OpenAI, так и с локальными моделями через 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."
}
];
Теперь передаём схему и ссылку на файл в функцию 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 заложили поддержку локальных vision-моделей. Можно развернуть Llama 3.2 Vision или Llava на собственном сервере с GPU и направить запросы туда. Процесс парсинга остаётся прежним, но данные не покидают ваш закрытый контур.
На что обратить внимание
Перед внедрением проекта в продакшн стоит учесть пару нюансов:
- Лицензия AGPL v3.0. Если вы планируете встраивать Documind напрямую в закрытый коммерческий бэкенд, строгие требования AGPL могут стать юридической проблемой. В таком случае логичнее вынести обработку документов в отдельный изолированный микросервис.
- Системные бинарники. Ghostscript и GraphicsMagick усложняют запуск в бессерверных средах вроде AWS Lambda или Vercel Functions, если вы не собираете кастомный Docker-образ.
Кому пригодится
Documind отлично подойдёт командам, которые строят пайплайны обработки входящей первички, автоматизируют финтех-сервисы или готовят неструктурированные базы документов к загрузке в векторные хранилища (RAG).
Инструмент избавляет от написания хрупких парсеров на регулярках и даёт типизированный результат в несколько строчек кода. Если вам нужно быстро автоматизировать ручной ввод документов, на этот репозиторий определённо стоит взглянуть.
