Anydoc: конвертация документов в Markdown на Rust
Anydoc — это библиотека для конвертации документов (Word, PowerPoint, Excel и др.) в чистый Markdown. Она написана на Rust и предоставляет привязки для Node.js и Python.
Этот инструмент полезен для разработчиков, которым нужно преобразовать офисные документы в Markdown, например, для подготовки текста к публикации на GitHub. Anydoc гарантирует одинаковый результат независимо от исходного формата, что уменьшает риск ошибок в конвертации. Также доступна версия для браузера на WebAssembly, что позволяет обрабатывать файлы локально без передачи данных на сервер.
Запускается через CLI с командой npx @firecrawl/anydoc и поддерживает работу с различными агентами через интеграцию с Agent Skills. Обрати внимание, что, несмотря на мощные возможности, библиотека может не полностью справляться с некоторыми типами документов без дополнительных технологий, таких как OCR для отсканированных страниц.
Проект anydoc — это библиотека на Rust, которая преобразует документы различных форматов (таких как Word, PowerPoint, Excel, OpenDocument, RTF, EPUB, CSV и PDF) в чистый Markdown, совместимый с GitHub. Библиотека включает привязки для Node.js, Python и WebAssembly (браузер).
Основная цель создания anydoc — быстрое преобразование офисных документов в Markdown, пригодный для больших языковых моделей, с гарантированным единообразием результата вне зависимости от формата входного документа. Библиотека была разработана компанией Firecrawl и используется в рамках продукта Firecrawl Parse, предоставляющего API для конвертации документов с поддержкой оптического распознавания текста (OCR) для сканированных страниц.
Ты можешь попробовать библиотеку прямо в своем браузере: демо-страница, на которой библиотека работает как WebAssembly, позволяет конвертировать файлы локально, не загружая их на сервер.
Быстрый старт
Навыки агента
anydoc доступен как Agent Skill, что позволяет твоему агенту обрабатывать любые документы:
npx skills add firecrawl/anydoc
CLI
Примеры команд для использования библиотеки в командной строке:
npx @firecrawl/anydoc report.docx # Вывод Markdown в стандартный вывод
npx @firecrawl/anydoc slides.pptx -o slides.md # Или в файл
npx @firecrawl/anydoc - --format csv < data.csv # Чтение из stdin
npx @firecrawl/anydoc scan.pdf --ocr hosted # Сканированные страницы через Firecrawl Parse
Node.js
Для установки в проект:
npm install @firecrawl/anydoc
Пример использования:
import { toDocument, toMarkdown, toMarkdownBytes } from '@firecrawl/anydoc';
// Из файла:
const markdown = await toMarkdown('report.docx');
// Чтобы включить OCR:
const markdown = await toMarkdown('report.docx', { ocr: 'hosted' });
// Из байтов, формат определяется автоматически:
const fromBytes = await toMarkdownBytes(bytes);
// Или укажи формат, если он не имеет сигнатуры (например, CSV):
const fromCsv = await toMarkdownBytes(bytes, 'csv');
// Или остановись на модели документа, которая также содержит встроенные ресурсы:
const document = await toDocument(bytes);
Python
Установка через pip:
pip install firecrawl-anydoc
Примеры кода:
import anydoc
# Из файла:
markdown = anydoc.to_markdown("report.docx")
# Чтобы включить OCR:
markdown = anydoc.to_markdown("report.docx", ocr="hosted")
# Из байтов, формат определяется автоматически:
markdown = anydoc.to_markdown_bytes(data)
# Или укажи формат, если он не имеет сигнатуры (например, CSV):
markdown = anydoc.to_markdown_bytes(data, "csv")
# Или остановись на модели документа:
document = anydoc.to_document(data)
Браузер (WebAssembly)
Установка:
npm install @firecrawl/anydoc-wasm
Код для работы с библиотекой:
import init, { toMarkdownBytes, toDocument } from '@firecrawl/anydoc-wasm';
await init();
// Из байтов, формат определяется автоматически:
const markdown = toMarkdownBytes(bytes);
// Или укажи формат, если он не имеет сигнатуры (например, CSV):
const fromCsv = toMarkdownBytes(bytes, 'csv');
// Или остановись на модели документа:
const document = toDocument(bytes);
Rust
Установка библиотеки:
cargo add anydoc
Пример использования:
// Из файла:
let markdown = anydoc::to_markdown("report.docx")?;
// Из байтов, формат определяется автоматически:
let markdown = anydoc::to_markdown_bytes(&bytes, None)?;
// Или укажи формат, если он не имеет сигнатуры (например, CSV):
let markdown = anydoc::to_markdown_bytes(&bytes, anydoc::Format::Csv)?;
// Или остановись на модели документа:
let document = anydoc::to_document(&bytes, None)?;
OCR
Библиотека anydoc может обрабатывать текстовые PDF локально, но не выполняет OCR. Если у тебя есть PDF с отсканированными или изображениями страницами, конвертация завершится с ошибкой NeedsOcr. Чтобы обработать такие документы, можно использовать опцию ocr: 'hosted'.
Особенности
- Один выходной формат для всех входных. Каждый формат преобразуется в общую модель документа и рендерится через единый сериализатор для Markdown.
- Полная структура документа с поддержкой заголовков, стилей, списков и таблиц.
- Уравнения в формате LaTeX.
- Встраиваемые ресурсы, такие как изображения, сохраняются и отображаются.
- Ускоренное чтение формата на основе содержимого файла.
- Быстрая конвертация, без использования внешних сервисов.
- Совместимость с многими языками программирования и доступность через CLI.
Поддерживаемые форматы
| Формат | Расширения |
|---|---|
| Word | .doc, .docx, .docm |
| PowerPoint | .ppt, .pps, .pot, .pptx, .pptm, .ppsx, .ppsm |
| Excel | .xls, .xlsx, .xlsm, .xlsb |
| OpenDocument | .odt, .ods, .odp |
| Rich Text Format | .rtf |
| EPUB | .epub |
| CSV | .csv |
Ограничения
Некоторые форматы могут не поддерживаться для конвертации, такие как зашифрованные документы или те, которые требуют OCR для работы с отсканированными страницами. В таких случаях конвертация завершится ошибкой.
Как это работает
anydoc выполняет следующие шаги:
- Обнаружение формата на основе сигнатур в содержимом файла.
- Парсинг формата в общую модель документа.
- Сериализация на выход в Markdown.
- Обработка PDF через встроенный инструмент.
Выводы одного формата обрабатываются единообразно, что избавляет от возможных ошибок при конвертации.
Лицензия
Проект лицензирован под MIT.
Открыть на GitHub: firecrawl/anydoc →
RepoRadar