firecrawl/anydoc
Chuyển đổi Word, PowerPoint, Excel, OpenDocument, RTF, EPUB, CSV và PDF để xóa Markdown. Được tích hợp trong Rust, với các liên kết Node.js và Python.
README
bất kỳ tài liệu nào
Thư viện Rust nhanh giúp chuyển đổi tài liệu (Word, PowerPoint, Excel, OpenDocument, RTF, EPUB, CSV và PDF) thành GitHub-Flavored Markdown sạch. Bao gồm các ràng buộc cho Node.js, Python, và trình duyệt (WebAssembly).
Được xây dựng bởi Pháo hoa để biến bất kỳ tài liệu văn phòng nào thành Markdown sẵn sàng cho LLM trong một phần nghìn giây một chữ số, với một đầu ra nhất quán cho dù sử dụng định dạng nào. Nó hỗ trợ Phân tích cú pháp Firecrawl, vì vậy nếu bạn không muốn tự mình chạy nó thì API được lưu trữ sẽ cung cấp cho bạn chuyển đổi tương tự cộng với các mô hình OCR của chúng tôi dành cho các trang được quét mà Anydoc không thể tự đọc được.
Hãy thử nó trong trình duyệt của bạn: trang demo chạy thư viện dưới dạng WebAssugging, do đó các tệp được chuyển đổi cục bộ và không bao giờ rời khỏi máy của bạn.
Bắt đầu nhanh
Kỹ năng đại lý
Anydoc được cung cấp dưới dạng Kỹ năng đặc vụ, để nhân viên hỗ trợ của bạn có thể đọc bất kỳ tài liệu nào mà nhân viên đó truy cập:
npx skills add firecrawl/anydoc
các kỹ năng hướng dẫn tác nhân chuyển đổi tài liệu bằng Anydoc CLI. Hoạt động với Claude Code, Codex, Cursor, Mã mở, và bất kỳ thứ gì khác đại lý tương thích.
CLI
npx @firecrawl/anydoc report.docx # Markdown to stdout
npx @firecrawl/anydoc slides.pptx -o slides.md # or to a file
npx @firecrawl/anydoc - --format csv < data.csv # read stdin
npx tải xuống tệp nhị phân dựng sẵn cho nền tảng của bạn trong lần chạy đầu tiên. Để vĩnh viễn anydoc lệnh, cài đặt trên toàn cầu với npm install -g @firecrawl/anydoc. Chạy anydoc --help cho tất cả các lựa chọn.
Node.js
npm install @firecrawl/anydoc
import { toDocument, toMarkdown, toMarkdownBytes } from '@firecrawl/anydoc';
// From a file path:
const markdown = await toMarkdown('report.docx');
// From bytes, with the format detected from the content:
const fromBytes = await toMarkdownBytes(bytes);
// Or name it, which signature-less formats (CSV) need:
const fromCsv = await toMarkdownBytes(bytes, 'csv');
// Or stop at the document model, which also carries embedded assets:
const document = await toDocument(bytes);
Tham chiếu đầy đủ API: nút/README.md
Python
pip install firecrawl-anydoc
import anydoc
# From a file path:
markdown = anydoc.to_markdown("report.docx")
# From bytes, with the format detected from the content:
markdown = anydoc.to_markdown_bytes(data)
# Or name it, which signature-less formats (CSV) need:
markdown = anydoc.to_markdown_bytes(data, "csv")
# Or stop at the document model, which also carries embedded assets:
document = anydoc.to_document(data)
Tham chiếu đầy đủ API: Python/README.md
Trình duyệt (WebAssembly)
npm install @firecrawl/anydoc-wasm
import init, { toMarkdownBytes, toDocument } from '@firecrawl/anydoc-wasm';
await init();
// From bytes, with the format detected from the content:
const markdown = toMarkdownBytes(bytes);
// Or name it, which signature-less formats (CSV) need:
const fromCsv = toMarkdownBytes(bytes, 'csv');
// Or stop at the document model, which also carries embedded assets:
const document = toDocument(bytes);
Tham chiếu đầy đủ API: wasm/README.md
Rust
cargo add anydoc
// From a file path:
let markdown = anydoc::to_markdown("report.docx")?;
// From bytes, with the format detected from the content:
let markdown = anydoc::to_markdown_bytes(&bytes, None)?;
// Or name it, which signature-less formats (CSV) need:
let markdown = anydoc::to_markdown_bytes(&bytes, anydoc::Format::Csv)?;
// Or stop at the document model, which also carries embedded assets:
let document = anydoc::to_document(&bytes, None)?;
Tính năng
- Một đầu ra cho mọi định dạng. Mỗi định dạng phân tích cú pháp thành một mô hình tài liệu được chia sẻ và hiển thị thông qua một bộ nối tiếp Markdown duy nhất, do đó, các lối thoát, bảng, neo tiêu đề và chú thích cuối trang hoạt động giống hệt nhau cho dù đầu vào là
.doctừ năm 2003 hoặc một.pptxtừ hôm qua. - Cấu trúc tài liệu đầy đủ. Tiêu đề có dấu neo, in đậm/nghiêng/gạch ngang, mã nội tuyến và khối mã, liên kết và tham chiếu chéo nội bộ, danh sách dấu đầu dòng/đánh số/lồng nhau/nhiệm vụ với cách đánh số riêng của nguồn, bảng có các ô và hàng tiêu đề được hợp nhất, dấu ngoặc kép, chú thích cuối trang và chú thích cuối cùng cũng như ghi chú của người thuyết trình.
- Các phương trình như LaTeX. Các phương trình Word và PowerPoint (OMML), OpenDocument và EPUB (MathML) cũng như RTF chuyển đổi sang dạng toán theo định dạng GitHub:
$...$nội tuyến và$$khối. - Tài sản nhúng. Hình ảnh và đối tượng được nhúng hiển thị dưới dạng văn bản thay thế trong Markdown và các byte thô vẫn có sẵn trên mô hình tài liệu, được gắn thẻ với loại phương tiện của chúng. Hình ảnh có URL bên ngoài trở thành hình ảnh Markdown thông thường.
- Phát hiện định dạng dựa trên nội dung. Định dạng được đọc từ chính các byte (tiêu đề PDF, nhóm mở RTF, tên luồng OLE, mimetype gói ZIP), do đó các tệp bị gắn nhãn sai vẫn chuyển đổi chính xác.
- Nhanh. thuần túy Rust, không có mô hình ML, không có dịch vụ bên ngoài. Thời gian chuyển đổi trung bình là dưới 5 mili giây cho mỗi tài liệu.
- Những ràng buộc không thể tránh khỏi. Chuyển đổi Node.js chạy trên nhóm luồng libuv và không bao giờ chặn vòng lặp sự kiện; Python giải phóng GIL để các luồng khác tiếp tục chạy. Các loại TypeScript và cuống Python được gửi cùng với các gói.
- Hỗ trợ PDF được tích hợp sẵn. Các tệp PDF dựa trên văn bản chuyển đổi cục bộ thông qua thanh tra pdf, không cần dịch vụ OCR.
- Đại lý đã sẵn sàng. Vận chuyển như một Kỹ năng đặc vụ: một
npx skills add firecrawl/anydocvà bất kỳ đại lý nào cũng có thể đọc tài liệu văn phòng.
Các định dạng được hỗ trợ
| định dạng | Tiện ích mở rộng |
|---|---|
| từ | .doc, .docx, .docm |
| PowerPoint | .ppt, .pps, .pot, .pptx, .pptm, .ppsx, .ppsm |
| Excel | .xls, .xlsx, .xlsm, .xlsb |
| Tài liệu mở | .odt, .ods, .odp |
| Định dạng văn bản có định dạng | .rtf |
| EPUB | .epub |
| CSV | .csv |
.pdf |
Điểm chuẩn
Anydoc được đo dựa trên sáu bộ chuyển đổi khác trên 100 tài liệu trong thế giới thực trải rộng trên mười bốn định dạng. Điểm chạy từ 0 đến 100, càng cao càng tốt; tốc độ là thời gian trung bình để chuyển đổi một tài liệu.
| công cụ | định dạng | mili giây trung bình | tài liệu đánh giá | ghi điểm | sự đầy đủ | cấu trúc | định dạng | sự sạch sẽ |
|---|---|---|---|---|---|---|---|---|
| bất kỳ tài liệu nào | 14/14 | 4.4 | 94 | 81 | 87 | 79 | 78 | 81 |
| thư viện | 12/14 | 1129.5 | 87 | 40 | 59 | 42 | 40 | 24 |
| không có cấu trúc | 8/14 | 572.9 | 58 | 63 | 76 | 59 | 51 | 63 |
| giảm giá | 6/14 | 134.8 | 33 | 65 | 78 | 66 | 60 | 52 |
| pandoc | 5/14 | 102.1 | 34 | 56 | 74 | 57 | 56 | 38 |
| ghi chép | 4/14 | 513.6 | 21 | 57 | 60 | 60 | 57 | 51 |
| voi ma mút | 1/14 | 52.5 | 8 | 70 | 84 | 71 | 75 | 51 |
Mỗi định dạng, thích cho thích:
| định dạng | bất kỳ tài liệu nào | thư viện | không có cấu trúc | giảm giá | pandoc | ghi chép | voi ma mút |
|---|---|---|---|---|---|---|---|
| bác sĩ | 87 | 57 | 67 | - | - | - | - |
| tài liệu | 84 | 48 | - | - | - | - | - |
| docx | 88 | 56 | 53 | 71 | 68 | 71 | 70 |
| epub | 77 | - | 72 | 72 | 52 | - | - |
| odp | 86 | 23 | - | - | - | - | - |
| ôi | 82 | 38 | - | - | - | - | - |
| số lẻ | 80 | 51 | 68 | - | 60 | - | - |
| ppt | 80 | 26 | - | - | - | - | - |
| pptx | 74 | 24 | - | 66 | - | 52 | - |
| rtf | 88 | 53 | 46 | - | 45 | - | - |
| xls | 80 | 38 | 66 | 62 | - | - | - |
| xlsm | 76 | 32 | - | - | - | - | - |
| xlsx | 72 | 30 | 66 | 55 | - | 47 | - |
Chất lượng được chấm điểm như thế nào: một thẩm phán LLM (Claude Sonnet 5) so sánh kết quả đầu ra của hai công cụ một cách mù quáng với sự thật cơ bản: sáu trang đầu tiên của tài liệu, được LibreOffice hiển thị thành hình ảnh. Mỗi đầu ra được chấm điểm dựa trên tính đầy đủ, cấu trúc, định dạng và độ sạch sẽ. Mỗi cặp được đánh giá hai lần với kết quả đầu ra được hoán đổi để loại bỏ sai lệch vị trí, tổng cộng có 482 phán quyết. Mỗi công cụ score tính trung bình điểm số trên mỗi định dạng của nó so với các định dạng mà nó hỗ trợ, do đó, một kho văn bản nặng về một định dạng không thể làm sai lệch nó. Điều đó cũng có nghĩa là mỗi hàng tính trung bình một tập hợp định dạng khác nhau (69 của voi ma mút chỉ là docx, trong khi 81 của Anydoc bao gồm cả 14 định dạng), vì vậy bảng theo định dạng là sự so sánh công bằng.
Tốc độ là một chuyển đổi ấm cho mỗi tài liệu trên Ryzen 9 9950X3D (Windows 11, 64 GB DDR5-6400). thư viện Anydoc và Python được tính thời gian với quá trình loại trừ xuất hiện; các công cụ CLI bao gồm nó vì đó là cách chúng được sử dụng. Dây nịt sống ở bench/; kho văn bản không thể phân phối lại được và không có trong kho lưu trữ.
Phù hợp nhất: các quy trình nhận được nhiều loại tài liệu văn phòng hỗn hợp và cần một đầu ra Markdown có cấu trúc, nhất quán. Trong so sánh này, Anydoc là công cụ duy nhất bao gồm tất cả 14 định dạng, đạt điểm cao nhất trên mọi định dạng được đánh giá và chuyển đổi tài liệu nhanh hơn nhiều so với công cụ nhanh nhất tiếp theo.
Phát hiện định dạng
Định dạng được đọc từ nội dung tệp, sử dụng điểm đánh dấu chỉ định thông số kỹ thuật của nó: tiêu đề PDF, nhóm mở RTF, tên luồng OLE, mimetype gói ZIP và loại nội dung. CSV không có điểm đánh dấu như vậy nên phần mở rộng hoặc định dạng rõ ràng sẽ đặt tên cho nó.
Format::from_bytes(&bytes); // Some(Format::Docx), or None when nothing matches
Format::from_extension("pptm"); // Some(Format::Pptx)
Format::from_path(Path::new("report.odt")); // Some(Format::Odt)
Ba chức năng tương tự tồn tại trong Node (formatFromBytes, ...) và Python (anydoc.format_from_bytes, ...).
Lỗi
Một chuyển đổi trở lại Err chỉ khi không có Markdown có ý nghĩa nào có thể thoát ra khỏi tệp. ConvertError kể tên những gì đã xảy ra:
match anydoc::to_markdown(path) {
Ok(markdown) => Some(markdown),
// No document comes out of these, so record the file and take the next one.
Err(error @ (ConvertError::Encrypted | ConvertError::Unsupported(_))) => {
unconverted.push((path, error));
None
}
Err(error) => return Err(error),
}
| Biến thể | Ý nghĩa |
|---|---|
Unsupported |
Định dạng không xác định hoặc định dạng không thể chuyển đổi được (PDF chỉ có hình ảnh) |
Malformed |
Về mặt cấu trúc không thể sử dụng được: không thể trích xuất được nội dung có ý nghĩa |
Encrypted |
Được mã hóa hoặc bảo vệ bằng mật khẩu |
ResourceLimit |
Vượt qua giới hạn an toàn cố định (giải nén, lồng, số nút) |
MissingPart |
Thiếu một phần cần thiết cho bất kỳ đầu ra có ý nghĩa nào |
Io |
Không thể đọc được tập tin, từ to_markdown chỉ |
Node và wasm xuất bản tên biến thể trên error.code; Python tăng một anydoc.ConvertError lớp con cho mỗi biến thể, hoặc OSError khi không thể đọc được tập tin.
Nó hoạt động như thế nào
document bytes
│
├─► format detection → content markers, not the extension
│
├─► format parser → one per format (doc, docx, ppt, pptx, xls,
│ xlsx, odt/ods/odp, rtf, epub, csv)
│ │
│ └─► Document → shared model: blocks, inlines, tables,
│ footnotes, assets
│ │
│ └─► GFM serializer → Markdown
│
└─► PDF → pdf-inspector → Markdown directly
Bởi vì mọi định dạng đều thông qua cùng một mô hình tài liệu và bộ tuần tự hóa nên các lỗi đầu ra sẽ được khắc phục một lần. Bản sửa lỗi thoát bảng cho docx tự động là bản sửa lỗi thoát bảng cho rtf, odt và mọi thứ khác.
Phát triển
cargo test
cd node && npm install && npm run build && npm test
cd python && pip install maturin && maturin develop && python -m unittest discover -s tests
wasm-pack build wasm --release --target web --scope firecrawl && node --test wasm/test.mjs # see wasm/README.md
Một kho nội dung cố định đã cam kết dưới tests/fixtures/ đã được kiểm tra ảnh chụp nhanh, tests/robustness.rs kiểm tra đột biến mọi vật cố định, và fuzz/ mang các mục tiêu lông tơ hàng hóa trên mỗi định dạng. Điểm chuẩn về tốc độ và chất lượng tồn tại trong bench/.
Các bản phát hành được gắn thẻ v<version>, nơi xuất bản thùng, gói npm và bánh xe PyPI từ .github/workflows/release.yml. Phiên bản tồn tại ở ba nơi, được kết hợp với nhau để phát hành:
Cargo.toml: cái thùngnode/package.json: gói npmpython/Cargo.toml: bánh xe (python/pyproject.tomlđọc nó)
Giấy phép
Dự án cùng danh mục
chương trình giảng dạy và cơ sở mã nguồn mở của freeCodeCamp.org. Học toán, lập trình và khoa học máy tính miễn phí.
Danh sách các dịch vụ mạng và ứng dụng web của Phần mềm miễn phí có thể được lưu trữ trên máy chủ của riêng bạn
Máy khách GUI hiện đại dựa trên Tauri, được thiết kế để chạy trong Windows, macOS và Linux để mang lại trải nghiệm proxy phù hợp
Trao quyền cho mọi người để xây dựng phần mềm đáng tin cậy và hiệu quả.
Ứng dụng khách GUI cho Windows, Linux và macOS, hỗ trợ Xray, sing-box và các ứng dụng khác
Xây dựng các ứng dụng di động và máy tính để bàn nhỏ hơn, nhanh hơn và an toàn hơn với giao diện người dùng web.