Parxy is a document processing gateway providing a unified interface to interact with multiple document parsing services, exposing a unified flexible document model suitable for different levels of text extraction granularity.
- Unified API to parse documents with different providers
- Unified flexible hierarchical document model (
page → block → line → span → character) - Supports both local libraries (e.g., PyMuPDF, Unstructured) and remote services (e.g., LlamaParse, LLMWhisperer, PdfAct)
- Extensible: easily integrate new parsers in your own code
- Trace the execution for debug purposes
- Pair with evaluation utilities to compare extraction results (coming soon)
Requirements
- Python 3.12 or above (Python 3.10 and 3.11 are supported on best-effort).
Next steps
Parxy is available as a standalone command line and a library. The quickest way to try out Parxy is via command line using uvx.
Use with minimal footprint (fewer drivers supported):
uvx parxy --helpUse all supported drivers:
uvx parxy[all] --helpSee Supported services for the list of included drivers and their extras for the installation.
You can install Parxy globally using either pip or uv. If you prefer you can execute without installation using uvx.
# Using pip
pip install parxy # Basic installation
pip install parxy[all] # All drivers included
# Using uv
uv pip install parxy # Basic installation
uv pip install parxy[all] # All drivers included
# Using uvx
uvx parxy # Basic installation
uvx parxy[all] # All drivers includedOnce installed, you can use the parxy command to:
parxy parse: Extract text content from documents with customizable granularity levels (page, block, line, span, or character)parxy markdown: Convert documents into Markdown format, with optional combining of multiple documentsparxy drivers: List available document processing driversparxy env: Create a configuration file with default settingsparxy docker: Generate a Docker Compose configuration for self-hosted services
Example usage:
# Extract text from a PDF using the default driver
parxy parse document.pdf
# Convert multiple PDFs to markdown and combine them
parxy markdown --combine -o output/ doc1.pdf doc2.pdf
# List available drivers
parxy drivers
# Create default configuration
parxy envSee Using the Parxy Command Line Interface or run parxy --help for more information about available commands and options.
- Install, all or the driver you need
# Install all supported drivers via Pip
pip install parxy[all]
# add to your project using when using UV
uv add parxy[all]You can also install optional parser backends depending on your needs (e.g. PyMuPDF, Unstructured, LlamaParse):
- Add the env variables when needed
Some services require an api key. Parxy support those as environment variables. You can create a .env file in your project root.
# LlamaParse
PARXY_LLAMAPARSE_API_KEY=
# Unstract LLMWhisperer
PARXY_LLMWHISPERER_API_KEY=- Call the driver
from parxy_core.facade import Parxy
# Parse a document using the default driver
doc = Parxy.parse('path/to/document.pdf')
# Print basic information
print(f"Pages: {len(doc.pages)}")
print(f"Title: {doc.metadata.title}")
# Parse a document using a specific driver
Parxy.driver(Parxy.LLAMAPARSE).parse('path/to/document.pdf')For more information take a look at our Getting Started with Parxy tutorial.
| Service or Library | Support status | Extra | Local file | Remote file |
|---|---|---|---|---|
| PyMuPDF | Live | - | ✅ | ✅ |
| PdfAct | Live | - | ✅ | ✅ |
| Unstructured library | Preview | unstructured_local |
✅ | ✅ |
| Landing AI Agentic Document Extraction | Preview | landingai |
✅ | ✅ |
| LlamaParse | Preview | llama |
✅ | ✅ |
| LLMWhisperer | Preview | llmwhisperer |
✅ | ✅ |
| Unstructured.io cloud service | Planned | |||
| Chunkr | Planned | |||
| Docling | Planned |
...and more can be added via the live extension!
Live Extension allow to add new drivers or create custom configuration of the current drivers directly in your app code.
- Create a class that inherits from
Driver
from parxy_core.drivers import Driver
from parxy_core.models import Document
class CustomDriverExample(Driver):
"""Example custom driver for testing."""
def _handle(self, file, level="page") -> Document:
return Document(pages=[])- Register it in Parxy using the
extendmethod
Parxy.extend(name='my_parser', callback=lambda: CustomDriverExample())- Use it
Parxy.driver('my_parser').parse('path/to/document.pdf')More on the live extension in our How to Add a New Parser to Parxy guide.
Thank you for considering contributing to Parxy! You can find how to get started in our contribution guide.
Interested in adding a new parser to the supported list, take a look at our How to Add a New Parser to Parxy guide.
Parxy uses UV as package and project manager.
- Clone the repository
- Sync all dependencies with
uv sync --all-extras
All Parxy code is located in the src directory:
parxy_corecontains the drivers implementations, the models and the facade and factory to access Parxy featuresparxy_clicontains the module providing the command line interface
Parxy uses optional dependencies to track user oriented dependencies that enhance functionality. Dependency groups are reserved for development purposes. When supporting a new driver consider defining it's dependencies as optional to reduce Parxy's footprint.
The question What’s the difference between optional-dependencies and dependency-groups in pyproject.toml? give a nice overview of the differences.
Parxy is tested using Pytest. Tests, located under tests folder, run for each commit and pull request.
To execute the test suite run:
uv run pytestYou can run type checking and linting via:
uv run ruff checkPlease review our security policy on how to report security vulnerabilities.
The project is provided and supported by OneOff-Tech (UG) and Alessio Vertemati.
Parxy is licensed under the GPL v3 licence.
- Copyright (c) 2025-present Alessio Vertemati, @avvertix
- Copyright (c) 2025-present Oneoff-tech UG, www.oneofftech.de
- All contributors