anydoc: Convierte Cualquier Documento de Office a Markdown Limpio en Milisegundos

anydoc es una biblioteca rápida en Rust que convierte Word, PowerPoint, Excel, PDF y más a Markdown limpio. Con enlaces para Node.js, Python y WASM, es el convertidor más rápido y completo disponible.

anydoc: Convierte Cualquier Documento de Office a Markdown Limpio en Milisegundos

Si alguna vez has intentado alimentar un archivo .docx o .pptx a un LLM, conoces el dolor. La mayoría de los convertidores son lentos, producen resultados desordenados o solo admiten un puñado de formatos. anydoc de Firecrawl tiene como objetivo resolver esto de una vez por todas: una biblioteca pura en Rust que convierte Word, PowerPoint, Excel, OpenDocument, RTF, EPUB, CSV y PDF en Markdown limpio compatible con GitHub (GFM) en menos de 5 milisegundos por documento.

Creado por el equipo detrás de Firecrawl, anydoc es el motor que impulsa Firecrawl Parse. Ahora es de código abierto, con enlaces para Node.js, Python y WebAssembly, además de una Habilidad de Agente para que tus agentes de IA puedan leer documentos de forma nativa.

¿Por qué anydoc?

El problema con los convertidores existentes de documento a Markdown es triple:

  1. Velocidad: LibreOffice tarda más de un segundo por documento. anydoc lo hace en 4.4 ms de mediana.
  2. Cobertura de formatos: La mayoría de las herramientas admiten solo unos pocos formatos. anydoc maneja 14 formatos diferentes de serie.
  3. Consistencia: Cada convertidor tiene sus propias peculiaridades. anydoc canaliza todo a través de un modelo de documento único, por lo que la salida es uniforme en todos los formatos.

En su evaluación comparativa contra otros seis convertidores (LibreOffice, unstructured, markitdown, pandoc, docling, mammoth), anydoc obtuvo la puntuación más alta en cada formato que admite y fue 10 veces más rápido que la siguiente herramienta más rápida.

Primeros Pasos

CLI

La forma más rápida de probar anydoc es mediante npx:

npx @firecrawl/anydoc report.docx # Markdown a stdout
npx @firecrawl/anydoc slides.pptx -o slides.md # o a un archivo
npx @firecrawl/anydoc - --format csv < data.csv # leer stdin

Para una instalación permanente:

npm install -g @firecrawl/anydoc

Node.js

npm install @firecrawl/anydoc
import { toDocument, toMarkdown, toMarkdownBytes } from '@firecrawl/anydoc';

// Desde una ruta de archivo:
const markdown = await toMarkdown('report.docx');

// Desde bytes, con formato auto-detectado:
const fromBytes = await toMarkdownBytes(bytes);

// O especifica el formato explícitamente (necesario para CSV):
const fromCsv = await toMarkdownBytes(bytes, 'csv');

// O obtén el modelo de documento con activos incrustados:
const document = await toDocument(bytes);

Python

pip install firecrawl-anydoc
import anydoc

markdown = anydoc.to_markdown("report.docx")
markdown = anydoc.to_markdown_bytes(data)
markdown = anydoc.to_markdown_bytes(data, "csv")
document = anydoc.to_document(data)

WebAssembly (Navegador)

npm install @firecrawl/anydoc-wasm
import init, { toMarkdownBytes, toDocument } from '@firecrawl/anydoc-wasm';
await init();
const markdown = toMarkdownBytes(bytes);

Rust

cargo add anydoc
let markdown = anydoc::to_markdown("report.docx")?;
let markdown = anydoc::to_markdown_bytes(&bytes, None)?;
let markdown = anydoc::to_markdown_bytes(&bytes, anydoc::Format::Csv)?;
let document = anydoc::to_document(&bytes, None)?;

Características que Importan

Estructura Completa del Documento

anydoc conserva todo lo que esperarías de un documento enriquecido:

  • Encabezados con anclas
  • Negrita, cursiva, tachado
  • Código en línea y bloques de código
  • Enlaces y referencias cruzadas internas
  • Listas con viñetas, numeradas, anidadas y de tareas (con numeración original)
  • Tablas con celdas combinadas y filas de encabezado
  • Citas en bloque
  • Notas al pie y notas finales
  • Notas del orador (de PowerPoint)

Activos Incrustados

Las imágenes y objetos incrustados se representan como texto alternativo en Markdown, pero los bytes sin procesar están disponibles en el modelo de documento, etiquetados con su tipo de medio. Las imágenes externas se convierten en imágenes Markdown estándar.

Detección de Formato Basada en Contenido

En lugar de depender de las extensiones de archivo, anydoc lee los bytes reales para detectar el formato: cabecera PDF, grupo abierto RTF, nombres de flujo OLE, tipo MIME del paquete ZIP. Esto significa que los archivos mal etiquetados aún se convierten correctamente.

Soporte PDF Integrado

Los PDF basados en texto se convierten localmente usando pdf-inspector — no se requiere servicio OCR. Para PDF escaneados, necesitarías la API alojada de Firecrawl con modelos OCR.

Listo para Agentes

anydoc se envía como una Habilidad de Agente:

npx skills add firecrawl/anydoc

Esto funciona con Claude Code, Codex, Cursor, OpenCode y otros agentes compatibles.

Benchmark: anydoc vs. los Demás

Así se compara anydoc con otros convertidores populares en 100 documentos del mundo real en 14 formatos (puntuaciones sobre 100, cuanto más alto mejor):

Herramienta Formatos Mediana ms Puntuación Completitud Estructura Formato Limpieza
anydoc 14/14 4.4 81 87 79 78 81
libreoffice 12/14 1129.5 40 59 42 40 24
unstructured 8/14 572.9 63 76 59 51 63
markitdown 6/14 134.8 65 78 66 60 52
pandoc 5/14 102.1 56 74 57 56 38
docling 4/14 513.6 57 60 60 57 51
mammoth 1/14 52.5 70 84 71 75 51

Por formato, anydoc gana o empata en cada formato. Por ejemplo, en .docx obtiene 88 frente a los 70 de mammoth, y en .pptx es 74 frente a los 66 de markitdown.

El benchmark utiliza un juez LLM (Claude Sonnet 5) para comparar salidas a ciegas contra imágenes de referencia de las primeras seis páginas. Cada par se juzga dos veces para cancelar el sesgo de posición, totalizando 482 veredictos.

Cómo Funciona

La arquitectura de anydoc es elegante: cada analizador de formato produce un modelo de documento compartido, que luego pasa por un único serializador GFM. Esto significa que las correcciones a un formato se aplican automáticamente a todos los demás.

bytes del documento
│
├─► detección de formato → marcadores de contenido, no la extensión
│
├─► analizador de formato → uno por formato (doc, docx, ppt, pptx, xls,
│ xlsx, odt/ods/odp, rtf, epub, csv)
│ │
│ └─► Documento → modelo compartido: bloques, en línea, tablas,
│ notas al pie, activos
│ │
│ └─► serializador GFM → Markdown
│
└─► PDF → pdf-inspector → Markdown directamente

Manejo de Errores

anydoc devuelve un ConvertError con variantes específicas:

  • Unsupported – Formato desconocido o PDF solo de imágenes
  • Malformed – Archivo estructuralmente inutilizable
  • Encrypted – Protegido con contraseña
  • ResourceLimit – Límites de seguridad superados (descompresión, anidamiento, etc.)
  • MissingPart – Parte requerida ausente
  • Io – Error de lectura de archivo (solo desde to_markdown)

En Node y WASM, la variante está en error.code; en Python, hay una subclase por variante.

Desarrollo

anydoc es de código abierto (MIT) y se desarrolla activamente. Puedes ejecutar pruebas, contribuir o simplemente explorar el código:

cargo test
cd node && npm install && npm run build && npm test
cd python && pip install maturin && maturin develop && python -m unittest discover -s tests

El repositorio incluye un corpus de accesorios con pruebas de instantánea, pruebas de mutación y objetivos de fuzzing por formato.

Conclusión

Si estás construyendo un pipeline que ingiere documentos de oficina y necesita Markdown limpio y estructurado para LLMs, anydoc es un cambio de juego. Es rápido, completo y consistente. Ya sea que lo uses a través de CLI, Node.js, Python o en el navegador, es la mejor herramienta que hemos visto para este trabajo.

Prueba la demostración en vivo en tu navegador: los archivos se procesan localmente a través de WebAssembly, por lo que nada sale de tu máquina.

Fuente

firecrawl/anydoc: Convierte Word, PowerPoint, Excel, OpenDocument, RTF, EPUB, CSV y PDF a Markdown limpio. Construido en Rust, con enlaces para Node.js y Python.