얼마 전 pdf-inspector라는 Firecrawl의 PDF 분류 도구를 정리해서 올린 적이 있다. 텍스트 기반 PDF인지 스캔본인지 미리 판별해서 불필요한 OCR을 걸러주는 라이브러리였는데, 그 글을 쓰면서 Firecrawl이 문서 파싱 쪽을 꽤 진지하게 파고들고 있다는 인상을 받았다.
아니나 다를까 며칠 뒤에 이번엔 PDF뿐 아니라 Word, PPT, Excel까지 전부 묶어서 처리하는 anydoc이라는 라이브러리를 오픈소스로 내놨길래 이어서 정리해본다.
1. AnyDoc가 뭐냐면
anydoc은 Firecrawl이 만들어 2026년 8월 4일 오픈소스로 공개한 문서 변환 라이브러리다. Word, PowerPoint, Excel, OpenDocument, RTF, EPUB, CSV, PDF를 GitHub-Flavored Markdown으로 바꿔주는 게 전부인데, 이 "전부"가 생각보다 까다로운 일이다. Rust로 짜여 있고 MIT 라이선스라 자체 호스팅도 가능하고, Node.js·Python 바인딩도 같이 제공한다.
원래 Firecrawl은 웹 스크래핑 API 회사인데, 로컬 파일이나 비공개 문서를 처리하는 /parse 엔드포인트를 올해 4월에 먼저 내놨었다. anydoc은 그 /parse를 실제로 돌리던 내부 엔진을 떼어내서 독립 오픈소스 프로젝트로 공개한 것이다. 즉 사이드 프로젝트가 아니라 이미 프로덕션에서 쓰이던 엔진이라는 얘기다.
쉽게 말해, "확장자가 뭐든 상관없이 하나의 문서 모델로 통일해서 마크다운으로 뽑아준다"는 것이다. 포맷마다 파서는 따로 있지만 결과물은 전부 같은 직렬화 로직을 거치기 때문에, docx에서 고친 테이블 이스케이핑 버그가 rtf나 odt에도 자동으로 적용되는 구조라고 한다.

2. 핵심 기능들
포맷 하나로 통일
지원 포맷은 아래처럼 8개 카테고리다.
| 분류 | 확장자 |
|---|---|
| Word | .doc, .docx, .docm |
| PowerPoint | .ppt, .pps, .pot, .pptx, .pptm, .ppsx, .ppsm |
| Excel | .xls, .xlsx, .xlsm, .xlsb |
| OpenDocument | .odt, .ods, .odp |
| RTF | .rtf |
| EPUB | .epub |
| CSV | .csv |
특이한 건 포맷 판별을 확장자가 아니라 파일 내용(바이트)으로 한다는 점이다. PDF 헤더, RTF 오픈 그룹, ZIP 패키지의 content type 같은 걸 직접 읽어서 판별하기 때문에, 확장자를 잘못 붙인 파일도 제대로 변환된다고 한다. 다만 CSV는 그 자체로 시그니처가 없는 포맷이라 확장자나 명시적 포맷 지정이 필요하다.
순수 Rust, ML 모델 없이 초고속
anydoc은 ML 모델을 전혀 쓰지 않는다. 순수 파싱 로직만으로 동작하다 보니 속도가 확연히 다르다. 공식 벤치마크(100개 실제 문서, 14개 포맷, 7개 변환 도구 비교, 479건의 블라인드 페어와이즈 LLM 평가) 기준으로 보면 이렇다.
| 도구 | 중앙값 처리 시간 |
|---|---|
| anydoc | 약 4.7ms |
| docling | 약 513.6ms |
| unstructured | 약 572.9ms |
| libreoffice | 약 1129.5ms |
100배 넘게 차이 나는 셈인데, 회사 측 발표로는 Ryzen 9 9950X3D 기준 docx 500개를 1.7초에 처리했다고 한다. 이 수치는 Firecrawl이 자체적으로 낸 벤치마크라 독립 검증은 아니라는 점은 감안해야 한다. 그래도 일곱 개 도구 중 14개 포맷을 전부 처리한 건 anydoc이 유일했고, EPUB을 제외한 나머지 포맷에서 품질 점수도 가장 높았다고 한다.
PDF는 되는데 OCR은 안 된다
텍스트 기반 PDF는 같은 Firecrawl이 만든 pdf-inspector라는 별도 Rust 엔진을 통해 로컬에서 바로 변환된다. 다만 스캔본이나 이미지로만 된 PDF는 처리하지 못한다. OCR 모델 자체가 없기 때문이다. 이런 경우는 Firecrawl의 유료 호스팅 /parse API로 넘겨야 한다고 안내하고 있다.
에이전트 스킬로 바로 연결
npx skills add firecrawl/anydoc 한 줄이면 Claude Code, Codex, Cursor, OpenCode 같은 에이전트가 CLI로 anydoc을 호출해서 문서를 읽을 수 있게 스킬이 등록된다. 요즘 에이전트 붙이는 쪽으로 다들 몰려가는 추세인데, 여기도 그 흐름에 맞춰서 나온 느낌이다.
3. 설치 및 실행
용도별로 골라 쓰면 된다.
# CLI (설치 없이 바로 실행)
npx @firecrawl/anydoc report.docx
npx @firecrawl/anydoc slides.pptx -o slides.md
# Node.js
npm install @firecrawl/anydoc
# Python
pip install firecrawl-anydoc
# Rust
cargo add anydoc
# 브라우저에서 파일 유출 없이 (WASM)
npm install @firecrawl/anydoc-wasm
# 에이전트 스킬로 등록
npx skills add firecrawl/anydoc
Node.js 기준 사용 예시는 이렇다.
import { toMarkdown, toMarkdownBytes } from '@firecrawl/anydoc';
// 파일 경로에서 바로
const markdown = await toMarkdown('report.docx');
// 바이트에서, 포맷은 자동 감지
const fromBytes = await toMarkdownBytes(bytes);
설치 없이 바로 감을 보고 싶으면 공식 데모 페이지에서 파일을 끌어다 넣어보면 된다. WebAssembly로 브라우저 안에서 전부 돌아가서 파일이 서버로 안 넘어간다고 되어 있다.
4. 실제로 써볼 만한가?
아직 직접 돌려본 건 아니라서 확답은 어렵지만, 스펙만 보면 꽤 눈에 띈다. 특히 RAG 파이프라인이나 문서 기반 에이전트를 만들 때 "이 포맷은 되는데 저 포맷은 안 돼서 라이브러리를 두세 개 섞어 쓰는" 상황이 진짜 자주 생기는데, 하나로 8개 포맷을 다 커버한다는 점은 실무에서 체감이 클 것 같다. MIT 라이선스로 자체 호스팅도 되니 데이터를 외부로 보내기 꺼려지는 환경에서도 쓸 수 있다는 것도 장점이다.
다만 한계도 명확하다. 스캔 PDF나 손글씨 문서는 아예 처리가 안 되니 결국 OCR이 필요한 문서는 유료 API로 넘어가는 구조고, 4.7ms라는 속도도 회사가 자체적으로 측정한 수치라 실제 환경에서 그대로 재현될지는 지켜봐야 한다. 표가 복잡하게 얽힌 문서나 레이아웃이 특이한 문서에서 얼마나 버티는지도 아직 검증된 바가 없다. 벤치마크에서 EPUB 쪽은 다른 도구에 밀렸다는 것도 참고할 부분이다.
정리하면
- Firecrawl이 2026년 8월 4일 오픈소스로 공개한 Rust 기반 문서→마크다운 변환 라이브러리
- Word/PowerPoint/Excel/OpenDocument/RTF/EPUB/CSV/PDF 8개 포맷을 하나의 결과물로 통일
- ML 모델 없이 순수 파싱만으로 동작, 자체 벤치마크 기준 다른 도구 대비 100배 이상 빠름
- 스캔 PDF·이미지 문서는 OCR이 없어서 처리 불가 (유료
/parse로 넘어가야 함) - MIT 라이선스, CLI/Node/Python/Rust/브라우저(WASM)/에이전트 스킬까지 지원
문서 파싱 파이프라인 만들어봤거나 여러 포맷 뒤섞인 데이터 다뤄본 사람이라면 한번 데모 페이지에서 파일 넣어보는 걸 추천한다. 나도 조만간 실제로 몇 개 문서 넣어보고 후기를 남겨볼 생각이다.
참고 자료
'오픈소스' 카테고리의 다른 글
| Qwen3.8-27B GGUF - unsloth Dynamic v3.0 양자화 정리 (0) | 2026.08.20 |
|---|---|
| llmux - vLLM과 llama.cpp를 터미널 하나에서 관리하기 (0) | 2026.08.20 |
| Deskflow - macOS와 Linux에서 키보드·마우스 공유하기 (0) | 2026.08.04 |
| AI 글쓰기 티 없애기 - im-not-ai와 no-ai-slop 비교 및 사용법 (0) | 2026.07.24 |
| pdf-inspector - OCR이 필요한 PDF만 골라내는 도구 (0) | 2026.07.24 |