OpenDocs
OpenDocs is a Python SDK that converts local documents into clean Markdown — TXT, Markdown, images, PDF (native / hybrid / vision), DOCX, PPTX, and XLSX — through a unified sync/async API.
Package name:
opendocs-sdk| Current Alpha:opendocs-sdk==0.2.0| Import name:opendocs| Python: 3.11+
Install
pip install opendocs-sdk
If you need to work from a local checkout (for development or unreleased changes):
uv add ../OpenDocs # or: pip install ../OpenDocs
Quick start
Synchronous local-path example:
from opendocs import parse
markdown = parse("notes.md")
Asynchronous bytes example:
import asyncio
from opendocs import aparse
async def main() -> str:
markdown = await aparse(b"plain text")
return markdown
markdown = asyncio.run(main())
Accepted inputs:
- local filesystem path as
str - local filesystem path as
os.PathLike[str] bytes- binary file object with
read() -> bytes
Callers own all remote downloads. http://, https://, oss://, and s3:// sources must be
downloaded before calling OpenDocs.
Supported formats
| Format | Status | Notes |
|---|---|---|
| TXT | ✅ | Parsed end to end into deterministic Markdown |
Markdown (.md, .markdown) |
✅ | Preserved for named Markdown paths/streams; unnamed UTF-8 bytes detect as TXT |
| ✅ | Per-page native, hybrid, full-vision, or blank routing; source-ordered page boundaries and tables | |
| PNG / JPEG / WebP | ✅ | Static images only; sanitized before the configured vision model sees them |
| DOCX | ✅ | Continuous authored body flow with structured text, lists, links, tables, explicit breaks, and inline images |
| PPTX | ✅ | Slide and shape-tree order with text, tables, accessible charts, groups, and inline images |
XLSX (.xlsx) |
✅ | All sheet-like entries in source order, saved values, tables/regions, merges, standard text objects, native chart facts, and optional visual interpretation |
Only standard .xlsx workbooks are supported. Legacy .xls, macro-enabled .xlsm, binary
.xlsb, and other spreadsheet formats are not accepted.
Vision parsing
Image and visual PDF work uses the provider-neutral LiteLLM
adapter when a VisionConfig is supplied. Native and blank PDF pages do not call a model.
Poppler (pdftoppm) is required only for visual/hybrid PDF parsing — install it with your
platform package manager:
# macOS
brew install poppler
# Debian / Ubuntu
apt-get install poppler-utils
Standalone images require VisionConfig. PDFs and Office documents without vision configuration
preserve usable native content and emit deterministic warnings for visual regions; XLSX always
keeps its native sheet and chart facts when visual enrichment is unavailable. A document with no
usable native content raises VisionRequiredError where that format requires vision.
from opendocs import ParseOptions, VisionConfig, parse
markdown = parse(
"scan.pdf",
options=ParseOptions(timeout=300, max_pages=100, vision_concurrency=4),
vision=VisionConfig(
model="openai/gpt-4o-mini",
api_key="...", # Prefer an environment-backed secret in production.
),
)
ParseOptions controls document timeout, PPTX/PDF page count, output size, and visual concurrency.
Model failures — authentication, permission, invalid request, temporary unavailability, invalid
response — use distinct typed exceptions for precise error handling.
ParseOptions.vision_concurrency limits visual requests within one parse. Applications control
cross-document concurrency themselves (e.g. with an asyncio.Semaphore); see the
independent consumer example.
DOCX, PPTX & XLSX details
DOCX extraction preserves authored body paragraphs, headings, lists, safe links, tables, merged
cells, explicit page breaks, and inline raster-image positions. A DOCX remains one continuous
logical flow; max_pages does not infer physical Word pages.
PPTX extraction emits every slide boundary and traverses each slide's shape tree in source order, including recursive groups, text, tables, accessible chart data, and raster pictures. Exact duplicate embedded images are analyzed once per parse and replayed at every authored slot.
XLSX extraction emits every worksheet and chartsheet in workbook order, including visible, hidden,
very hidden, and empty sheets. It preserves non-empty regions, Excel tables, merged-cell spans,
standard comments/text boxes/links/header-footer text, and common saved display semantics such as
$, €, £, and ¥ currency, grouping, decimals, percentages, dates, and times. Saved formula
caches are preferred; when a cache is missing, the formula text is returned with a warning. OpenDocs
does not recalculate formulas or fetch linked workbooks, data connections, or URLs—the reference is
preserved as text only.
Chart titles, labels, series, categories, and accessible values come from native workbook data. When vision is configured, normalized chart fact cards and embedded images may add trend, label, relationship, or meaning interpretation. This enrichment is fail-open and never replaces native facts. XLSX output does not promise Excel pixel appearance, fonts, colors, borders, dimensions, or other visual styling fidelity.
How OpenDocs compares
| Feature | OpenDocs | marker | docling | unstructured | pypdf |
|---|---|---|---|---|---|
| PDF → Markdown | ✅ | ✅ | ✅ | ✅ | ❌ |
| DOCX → Markdown | ✅ | ❌ | ✅ | ✅ | N/A |
| PPTX → Markdown | ✅ | ❌ | ✅ | ✅ | N/A |
| XLSX → Markdown | ✅ | ❌ | ✅ | ✅ | N/A |
| LLM vision integration | ✅ | ❌ | ❌ | ❌ | ❌ |
| Sync + Async API | ✅ | ❌ | ❌ | ❌ | ❌ |
| No external service required | ✅ | ✅ | ✅ | ⚠️ | ✅ |
| Pure Python (no system deps) | ✅ | ❌ | ❌ | ❌ | ✅ |
| Typed errors & warnings | ✅ | ❌ | ❌ | ❌ | ❌ |
| Image → Markdown | ✅ | ❌ | ❌ | ✅ | ❌ |
| Provider-neutral vision (LiteLLM) | ✅ | N/A | N/A | ❌ | N/A |
Key differentiator: OpenDocs is the only library that combines native Office/PDF extraction with optional LLM-powered visual understanding, all through a clean sync/async API with typed errors.
Platforms: Ubuntu and macOS on Python 3.11, 3.12, and 3.13 (Poppler required for visual PDF).
Windows is unverified for 0.2.0.
Privacy: OpenDocs never downloads HTTP, OSS, or S3 URLs. Model calls send sanitized images to
the provider selected by VisionConfig — review that provider's privacy and cost terms before
enabling vision.
Warnings and errors
OpenDocs uses Python warnings for recoverable degradation and typed exceptions for fatal failures.
import warnings
from opendocs import OpenDocsError, OpenDocsWarning, ParseOptions, parse
with warnings.catch_warnings(record=True) as caught:
warnings.simplefilter("always", OpenDocsWarning)
markdown = parse(
b"first paragraph\n\nsecond paragraph\n",
options=ParseOptions(max_output_chars=16),
)
assert markdown == "first paragraph\n"
assert caught[0].message.code == "output_truncated"
try:
parse("slides.pdf")
except OpenDocsError as error:
print(error.code, error.retryable)
Project docs
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file opendocs_sdk-0.2.0.tar.gz.
File metadata
- Download URL: opendocs_sdk-0.2.0.tar.gz
- Upload date:
- Size: 541.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fab82254d5a4e1b5c0b8162bcab3a75bf438b06c321c635cf55847274da2d05c
|
|
| MD5 |
c54dd507dcdc627b20d6adda9e4d8c3e
|
|
| BLAKE2b-256 |
1e1892618aa5413bcb543bb063fd90be224e1cced1afdf5407c1eec5b9b8e9e1
|
Provenance
The following attestation bundles were made for opendocs_sdk-0.2.0.tar.gz:
Publisher:
release.yml on caichuanwang/OpenDocs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opendocs_sdk-0.2.0.tar.gz -
Subject digest:
fab82254d5a4e1b5c0b8162bcab3a75bf438b06c321c635cf55847274da2d05c - Sigstore transparency entry: 2495065377
- Sigstore integration time:
-
Permalink:
caichuanwang/OpenDocs@1db96be8f38f6884e9ec0872ee42c14e9dbe96ee -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/caichuanwang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1db96be8f38f6884e9ec0872ee42c14e9dbe96ee -
Trigger Event:
push
-
Statement type:
File details
Details for the file opendocs_sdk-0.2.0-py3-none-any.whl.
File metadata
- Download URL: opendocs_sdk-0.2.0-py3-none-any.whl
- Upload date:
- Size: 149.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
994ff1cd0ab159302921d69f88cdd8bf00de079bdf421a7d58df49d65bb68bdf
|
|
| MD5 |
b916481d3818928ace53aa5d81d68b4a
|
|
| BLAKE2b-256 |
87739e5e936cf5f7ec720ad4f80a859e97927b582ae0a682bfc430fd5e46d5f2
|
Provenance
The following attestation bundles were made for opendocs_sdk-0.2.0-py3-none-any.whl:
Publisher:
release.yml on caichuanwang/OpenDocs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opendocs_sdk-0.2.0-py3-none-any.whl -
Subject digest:
994ff1cd0ab159302921d69f88cdd8bf00de079bdf421a7d58df49d65bb68bdf - Sigstore transparency entry: 2495065388
- Sigstore integration time:
-
Permalink:
caichuanwang/OpenDocs@1db96be8f38f6884e9ec0872ee42c14e9dbe96ee -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/caichuanwang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1db96be8f38f6884e9ec0872ee42c14e9dbe96ee -
Trigger Event:
push
-
Statement type: