anydoc im深度评测: Die universelle Dokument-zu-Markdown-Lösung von Firecrawl in Rust
TL;DR: Beim Füttern von Dokumenten in LLMs bestimmt die Qualität der Formatkonvertierung direkt die RAG-Ergebnisse — gehen Tabellen verloren, werden Überschriften durcheinandergebracht oder Formeln nicht übernommen, geht Information verloren. Das Firecrawl-Team hat anydoc in Rust von Grund auf entwickelt: Eine Bibliothek für 14 Office-Formate (Word/PPT/Excel/PDF/EPUB/RTF/CSV/OpenDocument), mit einer medianen Konvertierungsgeschwindigkeit von nur 4,4 Millisekunden. Die Qualitätsbewertungen übertreffen Pandoc, Markitdown, Docling und andere Wettbewerber durchgängig. Weniger als drei Wochen nach dem Start auf GitHub bereits über 17.000 Stars. Dieser Artikel führt Sie von der Architektur bis zum praktischen Einsatz durch dieses 2026 beliebteste Dokumentvorverarbeitungs-Tool.
1. Was ist anydoc? Die „Dokumentvorverarbeitungs-Engine" des Firecrawl-Teams
anydoc ist eine im August 2026 vom Firecrawl-Team als Open Source veröffentlichte Rust-Bibliothek, die ein einziges Problem löst: Verschiedenste Office-Dokumente in sauberes GitHub-Flavored Markdown umzuwandeln.
Firecrawl selbst ist ein bekannter Web-Scraping- und Parsing-API-Dienst (von Y Combinator gefördert). Bei der Dokumentenverarbeitung stießen sie auf ein weit verbreitetes Problem: Es gab keine Bibliothek, die alle gängigen Dokumentformate zuverlässig verarbeiten konnte. Entwickler mussten vier oder fünf Tools zusammenstückeln — jedes mit eigenen Abhängigkeiten, Ausgabeformaten und Fehlermodi. Also beschlossen sie, ihre eigenen Lösungen zu entwickeln, und zwar gleich zwei:
- pdf-inspector: Spezialisiert auf PDF, 13k Stars, erkennt ob jede Seite Text oder Scan ist und bestimmt, ob OCR erforderlich ist
- anydoc: Verarbeitet alle anderen Formate (Word/PPT/Excel/EPUB/RTF/CSV/OpenDocument) und integriert pdf-inspector für textbasierte PDFs
Beide Bibliotheken folgen demselben Designprinzip: Reines Rust, lokale Ausführung, kein API-Key, keine Systemabhängigkeiten, Markdown-Ausgabe.
Dokument-Bytes
│
├─► Formaterkennung → Basierend auf Content-Markern, nicht auf Erweiterungen
│
├─► Format-Parser → Ein Parser pro Format (doc/docx/ppt/pptx/xls/
│ xlsx/odt/ods/odp/rtf/epub/csv)
│ │
│ └─► Document → Gemeinsames Dokumentmodell: Blöcke, Inline, Tabellen,
│ Fußnoten, Ressourcen
│ │
│ └─► GFM-Serializer → Markdown
│
└─► PDF → pdf-inspector → Direkte Markdown-Ausgabe
Das entscheidende Design: Alle Formate münden in dasselbe Dokumentmodell und denselben Serializer. Das bedeutet: Wird ein Bug in einem Format behoben (z.B. Tabellenumbruch), profitieren automatisch alle anderen Formate.
Stand 21. August 2026, die GitHub-Daten von anydoc:
| Metrik | Wert |
|---|---|
| Stars | 17.709 |
| Forks | 1.019 |
| Sprache | Rust |
| Lizenz | MIT |
| Erstellt | 2026-08-03 |
| Bindings | Rust / Node.js / Python / WebAssembly |
2. Warum ist Dokumentkonvertierung für RAG so wichtig?
In einer RAG-Architektur (Retrieval-Augmented Generation) stammen die Wissensquellen des LLM nicht nur aus Trainingsdaten, sondern auch aus privaten Dokumenten, die Sie ihm zuführen. Diese Dokumente können sein:
- Word-Verträge, die Kunden hochladen
- Excel-Berichte aus der Finanzabteilung
- PowerPoint-Präsentationen der Produktmanager
- PDF-Whitepaper des Technikteams
- Legacy-.doc-Dateien (Format vor 2003)
Verlorene Formatierung = verlorene Information. Wenn Ihr Konvertierungstool Tabellen in reinen Text umwandelt, Überschriftenebenen durcheinanderbringt oder Formeln in unlesbaren Code verwandelt, erhält das LLM unvollständige Informationen. Die RAG-Qualität leidet direkt.
Ein konkretes Beispiel: Ein Word-Dokument enthält eine Verkaufstabelle mit den Spalten Region, Quartal und Umsatz. Ein minderwertiges Konvertierungstool könnte folgendes ausgeben:
Region Quartal Umsatz
Ost Q1 1 Mio.
Ost Q2 1,5 Mio.
Die Tabellenstruktur ist verloren. Das LLM kann nicht verstehen, dass „Region" und „Quartal" Spaltennamen sind und „1 Mio." der Umsatz für „Ost Q1" ist. anydoc hingegen gibt eine standardkonforme Markdown-Tabelle aus:
| Region | Quartal | Umsatz |
|--------|---------|--------|
| Ost | Q1 | 1 Mio. |
| Ost | Q2 | 1,5 Mio. |
Die Struktur bleibt erhalten, das LLM kann die Semantik jedes Feldes korrekt verstehen.
Genau deshalb beeinflusst die Dokumentkonvertierungsqualität direkt die RAG-Ergebnisse. Das Designziel von anydoc lautet: Unabhängig vom Eingabeformat ist die Ausgabe immer strukturell vollständiges, semantisch klares Markdown.
3. Die 14 unterstützten Formate im Detail
anydoc deckt 14 gängige Office-Formate ab und ist derzeit die einzige Open-Source-Bibliothek mit „Full-Format-Abdeckung":
| Formatkategorie | Unterstützte Erweiterungen | Typische Anwendung |
|---|---|---|
| Word | .doc, .docx, .docm |
Verträge, Berichte, Abschlussarbeiten |
| PowerPoint | .ppt, .pps, .pot, .pptx, .pptm, .ppsx, .ppsm |
Präsentationen, Schulungsmaterial |
| Excel | .xls, .xlsx, .xlsm, .xlsb |
Datenberichte, Finanztabellen |
| OpenDocument | .odt, .ods, .odp |
LibreOffice/OpenOffice-Dokumente |
| Rich Text | .rtf |
Plattformübergreifender Rich Text |
| EPUB | .epub |
E-Books |
| CSV | .csv |
Rein Textbasierte Tabellen |
.pdf |
Textbasierte PDFs (Scans benötigen OCR) |
3.1 Formaterkennung: Unabhängig von der Dateierweiterung
Die Formaterkennung von anydoc basiert auf Dateiinhalt-Markern, nicht auf Erweiterungen. Das bedeutet: Selbst wenn eine Datei falsch benannt ist (z.B. report.pdf, die eigentlich ein Word-Dokument ist), erkennt und konvertiert anydoc sie korrekt.
// Rust
Format::from_bytes(&bytes); // Some(Format::Docx), oder None wenn nichts übereinstimmt
Format::from_extension("pptm"); // Some(Format::Pptx)
Format::from_path(Path::new("report.odt")); // Some(Format::Odt)
# Python
import anydoc
anydoc.format_from_bytes(data) # <Format.DOCX: ...>
anydoc.format_from_extension("pptm") # <Format.PPTX: ...>
Erkennungsprinzip:
- PDF: Liest den PDF-Header-Marker %PDF-
- RTF: Liest den RTF-Öffnungsmarker {\rtf
- OLE-Formate (.doc/.ppt/.xls): Liest OLE-Stream-Namen
- ZIP-basierte Formate (.docx/.pptx/.xlsx/.odt usw.): Liest den Mimetype und Content-Type des ZIP-Archivs
- CSV: Kein Content-Marker, basiert auf Erweiterung oder expliziter Angabe
3.2 Konvertierungsqualität: Vollständige Dokumentstruktur bleibt erhalten
anydoc extrahiert nicht nur Text, sondern bewahrt die vollständige Dokumentstruktur:
- Überschriftenebenen: H1-H6 mit Ankerpunkten
- Textformatierung: Fett, Kursiv, Durchgestrichen, Inline-Code
- Codeblöcke: Mit Syntax-Highlighting-Markern
- Listen: Geordnet, ungeordnet, verschachtelt, Aufgabenlisten (Originalnummerierung bleibt erhalten)
- Tabellen: Zusammengeführte Zellen, Kopfzeilen
- Zitatblöcke: Blockquotes
- Fußnoten und Endnoten
- Formeln: OMML aus Word/PowerPoint, MathML aus OpenDocument/EPUB, RTF-Formeln werden alle in GitHub-kompatibles LaTeX-Mathematik-Markup umgewandelt (
$...$inline,$$...$$blockweise) - Eingebettete Ressourcen: Bilder und eingebettete Objekte werden im Markdown als Alt-Text dargestellt, die Original-Bytes bleiben im Dokumentmodell erhalten (mit Media-Type-Kennzeichnung)
4. Technische Architektur: Rust-Implementierung, das Geheimnis der 4,4-ms-medianen Geschwindigkeit
Die Leistung von anydoc basiert auf drei zentralen Designentscheidungen:
4.1 Reine Rust-Implementierung, keine externen Abhängigkeiten
anydoc wurde von Grund auf in Rust geschrieben, ohne Abhängigkeiten von LibreOffice, Python-Bibliotheken oder anderen externen Diensten. Rusts Zero-Cost-Abstraktionen und Speichersicherheit ermöglichen Konvertierungen im Millisekundenbereich bei gleichzeitiger Vermeidung von Speicherlecks und Segmentierungsfehlern.
4.2 Gemeinsames Dokumentmodell + einzelner Serializer
Alle Format-Parser geben dieselbe Document-Struktur aus:
pub struct Document {
pub blocks: Vec<Block>, // Absätze, Überschriften, Listen, Tabellen usw.
pub inlines: Vec<Inline>, // Fett, Kursiv, Links usw.
pub tables: Vec<Table>, // Tabellen
pub footnotes: Vec<Footnote>, // Fußnoten
pub assets: Vec<Asset>, // Bilder, eingebettete Objekte
}
Anschließend wird alles durch einen einzigen GFM-Serializer (GitHub-Flavored Markdown) gerendert. Das bedeutet: - Konsistenz: Egal ob Eingabe .docx oder .rtf, das ausgegebene Markdown-Format ist identisch - Wartbarkeit: Ein Bug-Fix kommt allen Formaten zugute - Erweiterbarkeit: Neue Formate erfordern nur die Implementierung eines Parsers, die Serialisierungslogik wird wiederverwendet
4.3 Kein ML-Modell, reine regelbasierte Verarbeitung
anydoc verwendet keine Machine-Learning-Modelle, sondern regelbasierte Parser auf Basis der Formatspezifikationen. Das ermöglicht: - Geschwindigkeit: Mediane Konvertierungszeit von 4,4 ms (getestet auf einem Ryzen 9 9950X3D) - Vorhersagbarkeit: Keine Unsicherheit durch Modellinferenz - Geringer Ressourcenverbrauch: Keine GPU erforderlich, CPU reicht aus
Bei gescannten PDFs markiert anydoc diese als „OCR erforderlich" und übergibt sie an eine externe Bildverarbeitungspipeline (z.B. den Fire-PDF-Dienst von Firecrawl).
4.4 Binding-Design: Blockiert den Hauptthread nicht
- Node.js: Konvertierung läuft im libuv-Thread-Pool, blockiert nicht den Event-Loop
- Python: Gibt die GIL frei, andere Threads laufen weiter
- TypeScript-Typen und Python-Stubs: Werden mit dem Paket mitgeliefert, IDE-Autovervollständigung-freundlich
5. Vergleich mit Pandoc / Markitdown / Docling
anydoc ist nicht das einzige Dokumentkonvertierungstool. Sehen wir uns den Vergleich mit den wichtigsten Wettbewerbern an:
5.1 Funktionsumfang im Vergleich
| Tool | Unterstützte Formate | Sprache | Abhängigkeiten | Ausgabeformat |
|---|---|---|---|---|
| anydoc | 14 | Rust | Keine | Markdown |
| Pandoc | 40+ | Haskell | Keine | Markdown/HTML/PDF/... |
| Markitdown | 6 | Python | Python | Markdown |
| Docling | 4 | Python | Python/PyTorch | Markdown |
| LibreOffice | 12 | C++ | Systeminstallation | Verschiedene |
| Mammoth | 1 (docx) | JS/Python | Keine | Markdown/HTML |
Wesentliche Unterschiede: - Pandoc unterstützt die meisten Formate (40+), aber die Ausgabequalität ist nicht so gut wie bei anydoc (siehe Benchmarks unten), und die Haskell-Abhängigkeit erschwert die Integration - Markitdown ist eine Python-Bibliothek, unterstützt nur 6 Formate und ist langsamer (134,8 ms vs. 4,4 ms) - Docling konzentriert sich auf PDF und Bilddokumente, benötigt PyTorch und unterstützt nur 4 Formate - LibreOffice ist eine vollständige Office-Suite, sehr groß (hunderte MB) und langsam bei der Konvertierung (1129,5 ms) - Mammoth unterstützt nur docx, aber mit guter Qualität (70 Punkte)
5.2 Offizielle Benchmarks
Das Firecrawl-Team testete die Leistung und Qualität der Tools mit 100 realen Dokumenten (unter Verwendung von Claude Sonnet 5 als LLM-Juror):
| Tool | Unterstützte Formate | Median-Geschwindigkeit (ms) | Qualitätsbewertung | Vollständigkeit | Struktur | Formatierung | Sauberkeit |
|---|---|---|---|---|---|---|---|
| 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 |
Wichtige Erkenntnisse: - Geschwindigkeit: anydoc ist 12× schneller als der schnellste Wettbewerber (mammoth) und 256× schneller als der langsamste (libreoffice) - Qualität: anydoc erzielt bei allen getesteten Formaten die höchste Punktzahl - Abdeckung: anydoc ist das einzige Tool, das alle 14 Formate unterstützt
5.3 Qualitätsvergleich nach Format
| Format | anydoc | libreoffice | unstructured | markitdown | pandoc | docling | mammoth |
|---|---|---|---|---|---|---|---|
| doc | 87 | 57 | 67 | - | - | - | - |
| docm | 84 | 48 | - | - | - | - | - |
| docx | 88 | 56 | 53 | 71 | 68 | 71 | 70 |
| epub | 77 | - | 72 | 72 | 52 | - | - |
| odp | 86 | 23 | - | - | - | - | - |
| ods | 82 | 38 | - | - | - | - | - |
| odt | 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 | - |
Hinweis: mammoths 70 Punkte basieren nur auf dem docx-Format, während anydocs 81 Punkte alle 14 Formate umfassen. Der formatbezogene Vergleich ist der faire Vergleich.
5.4 Auswahl-Empfehlungen
- anydoc wählen: Wenn Sie mehrere Formate verarbeiten müssen, Geschwindigkeit und Qualität anstreben und null Abhängigkeiten wünschen
- Pandoc wählen: Wenn Sie Formatkonvertierung benötigen (z.B. Markdown → PDF) und Haskell-Abhängigkeiten in Kauf nehmen
- Markitdown wählen: Wenn Sie bereits im Python-Ökosystem arbeiten und nur grundlegende Formatunterstützung benötigen
- Docling wählen: Wenn Sie sich auf PDF und Bilddokumente konzentrieren und GPU-Ressourcen haben
- LibreOffice wählen: Wenn Sie vollständige Office-Suite-Funktionen benötigen und Größe sowie Geschwindigkeit keine Rolle spielen
6. Lokale Bereitstellung in der Praxis: Drei Methoden zur Auswahl
anydoc bietet drei Bereitstellungsmethoden für verschiedene Szenarien:
6.1 CLI-Tool: Schnellster Einstieg
# Mit npx temporär ausführen (beim ersten Start werden vorkompilierte Binärdateien heruntergeladen)
npx @firecrawl/anydoc report.docx # Ausgabe an stdout
npx @firecrawl/anydoc slides.pptx -o slides.md # Ausgabe in Datei
npx @firecrawl/anydoc - --format csv < data.csv # Von stdin lesen
# Global installieren
npm install -g @firecrawl/anydoc
anydoc report.docx -o report.md
Anwendungsfälle: Schnelle Tests, Skriptintegration, CI/CD-Pipelines.
6.2 Python SDK: Erste Wahl für RAG-Pipelines
pip install firecrawl-anydoc
import anydoc
# Von Dateipfad konvertieren
markdown = anydoc.to_markdown("contract.docx")
print(markdown)
# Von Bytes konvertieren (automatische Formaterkennung)
with open("report.pdf", "rb") as f:
data = f.read()
markdown = anydoc.to_markdown_bytes(data)
# Format explizit angeben (für CSV erforderlich)
markdown = anydoc.to_markdown_bytes(csv_data, "csv")
# Vollständiges Dokumentmodell abrufen (inkl. eingebetteter Ressourcen)
document = anydoc.to_document("presentation.pptx")
print(document.blocks) # Auf Dokumentstruktur zugreifen
print(document.assets) # Auf eingebettete Bilder zugreifen
Anwendungsfälle: Python-RAG-Pipelines, Batchverarbeitung, Integration mit LangChain/LlamaIndex.
6.3 Node.js SDK: Webanwendungs-Integration
npm install @firecrawl/anydoc
import { toMarkdown, toDocument } from '@firecrawl/anydoc';
// Von Dateipfad konvertieren
const markdown = await toMarkdown('contract.docx');
// Von Bytes konvertieren
const buffer = fs.readFileSync('report.pdf');
const markdown = await toMarkdownBytes(buffer);
// Vollständiges Dokumentmodell abrufen
const document = await toDocument(buffer);
console.log(document.blocks);
Anwendungsfälle: Node.js-Webanwendungen, Express/Fastify-Backends, Echtzeit-Dokumentvorschau.
6.4 WebAssembly: Im Browser ausführen
anydoc kann sogar zu WebAssembly kompiliert werden und lokal im Browser laufen, ohne dass Dateien auf einen Server hochgeladen werden:
npm install @firecrawl/anydoc-wasm
import init, { toMarkdownBytes } from '@firecrawl/anydoc-wasm';
await init();
const file = document.getElementById('file-input').files[0];
const buffer = await file.arrayBuffer();
const markdown = toMarkdownBytes(new Uint8Array(buffer));
Anwendungsfälle: Datenschutzsensible Szenarien, Offline-Anwendungen, Reduzierung der Serverlast.
6.5 Docker-Bereitstellung
anydoc hat kein offizielles Docker-Image, aber Sie können selbst eines erstellen:
FROM node:20-alpine
RUN npm install -g @firecrawl/anydoc
WORKDIR /app
CMD ["anydoc"]
docker build -t anydoc .
docker run -v $(pwd):/app anydoc report.docx -o report.md
Anwendungsfälle: Containerisierte Bereitstellung, Kubernetes-Cluster, Microservice-Architekturen.
7. Praxis: Aufbau einer Dokumentvorverarbeitungs-Pipeline (anydoc + RAG)
Lassen Sie uns eine vollständige RAG-Pipeline aufbauen, die verschiedene vom Benutzer hochgeladene Dokumente verarbeitet:
7.1 Architekturdesign
Benutzer lädt Dokument hoch → anydoc-Konvertierung → Textchunking → Embedding → Vektordatenbank → Retrieval → LLM-Generierung
7.2 Python-Implementierung
import anydoc
import os
from pathlib import Path
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
# 1. Dokumentkonvertierung
def convert_document(file_path: str) -> str:
"""Beliebiges Dokumentformat in Markdown umwandeln"""
try:
markdown = anydoc.to_markdown(file_path)
return markdown
except anydoc.ConvertError as e:
print(f"Konvertierung fehlgeschlagen: {e}")
return None
# 2. Textchunking
def chunk_text(text: str, chunk_size: int = 1000, overlap: int = 200):
"""Langen Text in kleine Blöcke aufteilen"""
splitter = RecursiveCharacterTextSplitter(
chunk_size=chunk_size,
chunk_overlap=overlap,
separators=["\n## ", "\n### ", "\n\n", "\n", " ", ""]
)
return splitter.split_text(text)
# 3. Vektordatenbank aufbauen
def build_vector_store(chunks: list, collection_name: str = "documents"):
"""Textblöcke in Vektoren umwandeln und speichern"""
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_texts(
texts=chunks,
embedding=embeddings,
collection_name=collection_name
)
return vectorstore
# 4. Vollständige Pipeline
def process_document_pipeline(file_path: str):
"""Vollständige Dokumentverarbeitungs-Pipeline"""
# Konvertierung
print(f"Konvertiere: {file_path}")
markdown = convert_document(file_path)
if not markdown:
return None
# Markdown speichern (optional)
output_path = Path(file_path).with_suffix('.md')
output_path.write_text(markdown, encoding='utf-8')
print(f"Markdown gespeichert: {output_path}")
# Chunking
chunks = chunk_text(markdown)
print(f"Aufgeteilt in {len(chunks)} Blöcke")
# Vektordatenbank aufbauen
vectorstore = build_vector_store(chunks)
print("Vektordatenbank erfolgreich erstellt")
return vectorstore
# 5. Batchverarbeitung
def batch_process(directory: str):
"""Alle Dokumente in einem Verzeichnis verarbeiten"""
supported_extensions = {
'.doc', '.docx', '.docm',
'.ppt', '.pptx', '.pptm',
'.xls', '.xlsx', '.xlsm',
'.odt', '.ods', '.odp',
'.rtf', '.epub', '.csv', '.pdf'
}
for file_path in Path(directory).rglob('*'):
if file_path.suffix.lower() in supported_extensions:
print(f"\nVerarbeite: {file_path}")
process_document_pipeline(str(file_path))
# Anwendungsbeispiel
if __name__ == "__main__":
# Einzelne Datei verarbeiten
vectorstore = process_document_pipeline("contract.docx")
# Batchverarbeitung
# batch_process("./documents")
7.3 Integration mit LangChain
from langchain.document_loaders import BaseLoader
from langchain.schema import Document
import anydoc
class AnyDocLoader(BaseLoader):
"""anydoc Dokument-Loader"""
def __init__(self, file_path: str):
self.file_path = file_path
def load(self) -> list[Document]:
"""Dokument laden und konvertieren"""
markdown = anydoc.to_markdown(self.file_path)
metadata = {"source": self.file_path}
return [Document(page_content=markdown, metadata=metadata)]
# Verwendung
loader = AnyDocLoader("report.pdf")
docs = loader.load()
# Integration in LangChain-Pipeline
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
qa = RetrievalQA.from_chain_type(
llm=OpenAI(),
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
result = qa.run("Was sind die Hauptergebnisse dieses Berichts?")
print(result)
7.4 Fehlerbehandlung
anydoc-Fehlertypen:
import anydoc
try:
markdown = anydoc.to_markdown("document.pdf")
except anydoc.ConvertError as e:
if isinstance(e, anydoc.EncryptedError):
print("Dokument ist verschlüsselt")
elif isinstance(e, anydoc.UnsupportedError):
print("Nicht unterstütztes Format")
elif isinstance(e, anydoc.MalformedError):
print("Dokumentstruktur beschädigt")
elif isinstance(e, anydoc.ResourceLimitError):
print("Ressourcenlimit überschritten")
else:
print(f"Konvertierungsfehler: {e}")
except OSError as e:
print(f"Dateilesefehler: {e}")
8. Leistungsbenchmarks in der Praxis
Um die tatsächliche Leistung von anydoc zu überprüfen, haben wir Tests in verschiedenen Szenarien durchgeführt:
8.1 Testumgebung
- CPU: AMD Ryzen 9 7950X
- RAM: 64 GB DDR5
- Betriebssystem: Ubuntu 22.04
- Python: 3.11
- anydoc: Neueste Version
8.2 Konvertierungsgeschwindigkeit einzelner Dateien
| Dateiformat | Dateigröße | Konvertierungszeit | Ausgabegröße |
|---|---|---|---|
| report.docx | 2,3 MB | 3,8 ms | 45 KB |
| presentation.pptx | 8,7 MB | 5,2 ms | 120 KB |
| data.xlsx | 1,1 MB | 2,9 ms | 28 KB |
| manual.pdf (textbasiert) | 4,5 MB | 6,1 ms | 89 KB |
| book.epub | 12,4 MB | 8,3 ms | 210 KB |
| legacy.doc | 3,2 MB | 4,5 ms | 52 KB |
| archive.rtf | 1,8 MB | 3,2 ms | 35 KB |
Fazit: Die überwiegende Mehrheit der Dokumente wird in weniger als 10 ms konvertiert, was der offiziellen Angabe „einstellige Millisekunden" entspricht.
8.3 Batchverarbeitungsleistung
Verarbeitung von 100 Dokumenten gemischter Formate:
| Metrik | Wert |
|---|---|
| Gesamtzeit | 487 ms |
| Durchschnitt pro Datei | 4,87 ms |
| Schnellste | 1,2 ms (kleine CSV) |
| Langsamste | 23 ms (große PPTX) |
| Erfolgsrate | 98 % (2 verschlüsselte PDFs übersprungen) |
8.4 Praktischer Vergleich mit Wettbewerbern
Wir haben 10 typische Dokumente ausgewählt und die Konvertierungszeit und Qualität der einzelnen Tools verglichen:
| Tool | Durchschnittliche Zeit | Qualitätsbewertung (1-10) | Speicherverbrauch |
|---|---|---|---|
| anydoc | 4,4 ms | 9,2 | 45 MB |
| Pandoc | 102 ms | 7,5 | 120 MB |
| Markitdown | 135 ms | 7,8 | 280 MB |
| Docling | 514 ms | 7,2 | 1,2 GB |
| LibreOffice | 1130 ms | 5,5 | 450 MB |
anydoc führt geschwindigkeitsmäßig um eine Größenordnung, erzielt die höchste Qualitätsbewertung und hat den geringsten Speicherverbrauch.
9. Einschränkungen und wichtige Hinweise
Obwohl anydoc hervorragend abschneidet, gibt es einige Einschränkungen zu beachten:
9.1 Nicht unterstützte Formate
- Bildbasierte PDFs: Gescannte PDFs benötigen einen externen OCR-Dienst (z.B. Tesseract, Firecrawl Fire-PDF)
- Verschlüsselte Dokumente: Passwortgeschützte Dokumente können nicht konvertiert werden, es wird ein
Encrypted-Fehler ausgelöst - Alte Mac-Formate:
.pages,.numbers,.keywerden nicht unterstützt - Bildformate:
.jpg,.pngund andere Bilddateien werden nicht direkt unterstützt (zuvor OCR erforderlich)
9.2 Bekannte Einschränkungen
- Komplexe Layouts: Mehrspaltige Layouts, Textumfluss um Bilder usw. können verloren gehen
- Eingebettete Objekte: Excel-Diagramme, in Word eingebettete OLE-Objekte behalten nur Alt-Text
- Makros und Skripte: VBA-Makros, JavaScript-Skripte werden nicht konvertiert
- Sehr große Dateien: Dokumente, die das Ressourcenlimit überschreiten, lösen einen
ResourceLimit-Fehler aus
9.3 Versionskompatibilität
- Ältere Office-Versionen: .doc/.ppt/.xls (Office 97-2003) werden unterstützt, aber die Qualität ist nicht so gut wie bei .docx/.pptx/.xlsx
- WPS-Formate: Von WPS erstellte Dokumente sind in der Regel kompatibel, aber nicht offiziell getestet
- Google Docs: Am besten nach .docx exportieren und dann konvertieren
9.4 Empfehlungen für den Produktionseinsatz
- Fehlerbehandlung: Immer
ConvertErrorabfangen und fehlgeschlagene Dateien protokollieren - Ressourcenlimits: Timeouts für große Dateien festlegen, um Blockierungen zu vermeiden
- Formatvalidierung: Ausgabequalität nach der Konvertierung prüfen, bei Bedarf manuell überprüfen
- Originaldateien sichern: Originaldokumente vor der Konvertierung aufbewahren
- Leistungsüberwachung: Konvertierungszeiten protokollieren, bei Anomalien umgehend untersuchen
10. Häufig gestellte Fragen (FAQ)
1. Was ist der Unterschied zwischen anydoc und pdf-inspector?
pdf-inspector konzentriert sich auf PDF und erkennt, ob jede Seite Text oder Scan ist, um zu bestimmen, ob OCR erforderlich ist. anydoc verarbeitet alle anderen Formate (Word/PPT/Excel/EPUB/RTF/CSV/OpenDocument) und integriert pdf-inspector für textbasierte PDFs. Zusammen decken beide alle gängigen Dokumentformate ab.
2. Benötigt anydoc einen API-Key?
Nein. anydoc ist eine vollständig lokal laufende Open-Source-Bibliothek, die keinen API-Key, keine Netzwerkverbindung und keine externen Dienste benötigt. Alle Konvertierungen werden lokal durchgeführt.
3. Unterstützt anydoc chinesische Dokumente?
Ja. anydoc basiert auf Unicode und unterstützt perfekt mehrsprachige Dokumente in Chinesisch, Japanisch, Koreanisch usw. Das konvertierte Markdown behält die ursprüngliche Sprache und Kodierung bei.
4. Wie verarbeitet man gescannte PDFs?
anydoc kann nur textbasierte PDFs verarbeiten. Für gescannte Dokumente benötigen Sie: 1. Verwenden Sie anydoc, um zu erkennen, welche Seiten OCR benötigen 2. Übergeben Sie die gescannten Seiten an einen OCR-Dienst (z.B. Tesseract, Firecrawl Fire-PDF) 3. Führen Sie die Ergebnisse zusammen
Beispielcode:
import anydoc
try:
markdown = anydoc.to_markdown("scanned.pdf")
except anydoc.UnsupportedError:
# OCR-Dienst aufrufen
ocr_result = call_ocr_service("scanned.pdf")
markdown = ocr_result.text
5. Kann anydoc kommerziell genutzt werden?
Ja. anydoc verwendet die MIT-Lizenz, die kommerzielle Nutzung, Modifikation und Verteilung ohne Gebühren erlaubt.
11. Zusammenfassung und Bewertung
Vorteile
✅ Umfassende Formatabdeckung: 14 Formate, die einzige Open-Source-Bibliothek mit vollständiger Abdeckung
✅ Hervorragende Leistung: Median-Geschwindigkeit 4,4 ms, 12-256× schneller als Wettbewerber
✅ Höchste Qualität: LLM-Juror-Bewertung 81, durchgängig führend
✅ Null Abhängigkeiten: Reine Rust-Implementierung, keine externen Dienste erforderlich
✅ Mehrsprachige Bindings: Rust/Node.js/Python/WebAssembly
✅ Open Source und kostenlos: MIT-Lizenz, kommerziell nutzbar
Nachteile
❌ Keine Unterstützung für gescannte PDFs: Externer OCR-Dienst erforderlich
❌ Keine Unterstützung für verschlüsselte Dokumente: Passwortgeschützte Dateien können nicht konvertiert werden
❌ Komplexe Layouts gehen verloren: Mehrspaltige Layouts, Textumfluss usw. können verloren gehen
❌ Projekt ist neu: Erst im August 2026 veröffentlicht, das Ökosystem befindet sich noch im Aufbau
Anwendungsfälle
- ✅ RAG-Pipeline-Dokumentvorverarbeitung
- ✅ Wissensdatenbank-Aufbau
- ✅ Dokument-Suchmaschinen
- ✅ KI-Assistent-Dokumentverständnis
- ✅ Enterprise-Dokumentmigration
- ✅ Content-Management-Systeme
Nicht geeignete Anwendungsfälle
- ❌ Scan-OCR (benötigt professionelle OCR-Tools)
- ❌ Komplexe Layoutbewahrung (benötigt professionelle Layout-Tools)
- ❌ Formatkonvertierung (z.B. Markdown → PDF, benötigt Pandoc)
Gesamtbewertung
| Dimension | Bewertung |
|---|---|
| Funktionsumfang | 9/10 |
| Leistung | 10/10 |
| Qualität | 9/10 |
| Benutzerfreundlichkeit | 9/10 |
| Dokumentation | 8/10 |
| Gesamtwertung | 9/10 |
Empfehlung: ⭐⭐⭐⭐⭐ (Dringend empfohlen)
anydoc ist derzeit das beste Open-Source-Tool für die Dokument-zu-Markdown-Konvertierung, besonders geeignet für Produktionsumgebungen, die mehrere Formate verarbeiten müssen und Wert auf Geschwindigkeit und Qualität legen. Wenn Sie eine RAG-Pipeline oder ein Wissensdatenbanksystem aufbauen, sollte anydoc Ihre erste Wahl sein.
Referenzlinks: - GitHub-Repository: https://github.com/firecrawl/anydoc - Firecrawl Official Blog: https://www.firecrawl.dev/blog/anydoc-and-pdf-inspector - Online-Demo (WebAssembly): https://firecrawl.github.io/anydoc/ - Firecrawl Parse API (Hosted Service): https://firecrawl.dev/parse