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:
- Velocidad: LibreOffice tarda más de un segundo por documento. anydoc lo hace en 4.4 ms de mediana.
- Cobertura de formatos: La mayoría de las herramientas admiten solo unos pocos formatos. anydoc maneja 14 formatos diferentes de serie.
- 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ágenesMalformed– Archivo estructuralmente inutilizableEncrypted– Protegido con contraseñaResourceLimit– Límites de seguridad superados (descompresión, anidamiento, etc.)MissingPart– Parte requerida ausenteIo– Error de lectura de archivo (solo desdeto_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.