Skip to main content

LiteParse Python

Python bindings for LiteParse — fast, lightweight PDF and document parsing with spatial text extraction.

Installation

pip install liteparse

This also installs the lit CLI command.

Quick Start

from liteparse import LiteParse

parser = LiteParse()
result = parser.parse("document.pdf")
print(result.text)
print(f"Source document pages: {result.total_pages}")

# Access structured data
for page in result.pages:
    print(f"Page {page.page_num}: {len(page.text_items)} text items")

Markdown Output

LiteParse can render documents directly to Markdown including headings, tables, lists, images, and links reconstructed from the spatial layout. Great for feeding LLMs and RAG pipelines. The rendered Markdown is returned on result.text:

parser = LiteParse(
    output_format="markdown",   # "json" | "text" | "markdown"
    image_mode="placeholder",   # "placeholder" | "off" | "embed"
    extract_links=True,         # render [text](url) link syntax (default: True)
)
result = parser.parse("document.pdf")
print(result.text)  # rendered Markdown

Reconstruction quality varies with document complexity.

Configuration

All options are passed to the constructor:

parser = LiteParse(
    ocr_enabled=True,              # Enable OCR (default: True)
    ocr_language="eng",            # Tesseract language code
    ocr_server_url=None,           # HTTP OCR server URL (optional)
    tessdata_path=None,            # Path to tessdata directory (optional)
    max_pages=1000,                # Max pages to parse
    target_pages="1-5,10",         # Specific pages (optional)
    extract_screenshots=False,      # Return parsed pages as PNG bytes
    continue_on_page_error=False,   # Skip broken pages and return page_errors
    dpi=150,                       # Rendering DPI
    output_format="json",          # "json" | "text" | "markdown"
    image_mode="placeholder",      # Markdown image handling: "placeholder" | "off" | "embed"
    extract_images=True,           # Extract image bytes + metadata (default: False)
    image_output_dir="./images",   # Write images and return name/path metadata (optional)
    extract_links=True,            # Render [text](url) links in markdown output
    keep_headers_footers=False,    # Keep running headers/footers in markdown output
    keep_clipped_text=False,       # Keep text hidden by clips (e.g. table-cell overflow)
    extract_vector_graphics=False, # Opt-in shapes + merged H/V lines per page
    extract_annotations=False,     # Include page annotations in structured output
    extract_form_fields=False,      # Include AcroForm widget fields and values
    extract_structure_tree=False,   # Include tagged-PDF logical structure
    preserve_very_small_text=False, # Keep tiny text
    extract_text_metadata=False,    # Opt in to MCID, font metrics, colors, char codes, and trailing_space_generated
    password=None,                 # Password for protected documents
    quiet=False,                   # Suppress progress output
    num_workers=4,                 # Concurrent OCR workers
)

When extract_images=True, image extraction is enabled. image_output_dir requires that explicit opt-in and writes the extracted bytes to disk. Each result.images entry includes its page bbox, intrinsic pixel dimensions, rotation, format, name, and path. Valid source JPEGs are preserved, exact duplicates reuse one file, and JSON CLI output contains metadata only (no base64 image data). image_mode controls Markdown presentation only and does not imply extraction. With extract_images=False, lightweight Markdown placement refs are still collected and result.images stays empty.

When extract_annotations is enabled, each parsed page has an annotations list containing the subtype, contents, author/title, PDF date strings, viewport-space rectangle and quadpoint rectangles, and URI for external link annotations. It is independent of extract_links, which controls Markdown link rendering. The field is None when extraction is disabled.

When extract_structure_tree=True, each page has a structure_tree containing all tagged-PDF roots and recursive elements with type, ID, actual/alternate text, title, typed attributes, MCIDs, children, and referenced link annotations. Untagged pages have an empty roots list; the field is None when disabled.

Every result also carries creator/producer from the PDF /Info dictionary. With extract_document_metadata=True, result.doc_meta adds a provenance object with dates, PDF version/security, signature state, incremental-save markers, trailer ID comparison, the catalog's XMP packet (capped at 64 KiB; skipped for sources over 16 MiB), and source size. It is off by default because it streams the whole source file, and it is None for inputs converted from a non-PDF format. These document fields are API-only and do not alter default CLI JSON.

Parsing from Bytes

Pass raw PDF bytes directly — useful for web uploads or downloaded files:

with open("document.pdf", "rb") as f:
    result = parser.parse(f.read())
print(result.text)

Worker Pool and Hard Timeouts

PDFium is not thread-safe, so in-process parses serialize on a process-global lock. For high-throughput services, or cases where you need to enforce a timeout, run parses in a pool of persistent worker processes instead:

from liteparse import LiteParse, ParseTimeoutError

parser = LiteParse(pool_size=4, parse_timeout=15)
parser.warm_up()  # optional: pre-initialize workers (~60ms total)

try:
    result = parser.parse("document.pdf")
except ParseTimeoutError as e:
    print(f"killed rogue document: {e.source} (deadline {e.timeout}s)")

parser.close()  # or use `with LiteParse(...) as parser:`

Screenshots

Generate PNG screenshots of document pages:

screenshots = parser.screenshot("document.pdf", page_numbers=[1, 2, 3])
for s in screenshots:
    print(f"Page {s.page_num}: {s.width}x{s.height}")
    with open(f"page_{s.page_num}.png", "wb") as f:
        f.write(s.image_bytes)

Document Complexity

Before committing to a full parse, check whether a document needs OCR or heavier processing. is_complex is a cheap, text-layer-only pass that returns one entry per page with a needs_ocr verdict and the signals behind it — useful for routing documents to different pipelines, rejecting ones you can't handle, or estimating cost.

parser = LiteParse()
pages = parser.is_complex("document.pdf")

if any(p.needs_ocr for p in pages):
    # Route to the OCR-enabled pipeline
    result = parser.parse("document.pdf")
else:
    # Cheap path — skip OCR entirely
    result = LiteParse(ocr_enabled=False).parse("document.pdf")

# Inspect why specific pages were flagged
for page in pages:
    if page.needs_ocr:
        print(f"Page {page.page_number}: {', '.join(page.reasons)}")

reasons is one of "scanned", "no-text", "sparse-text", "embedded-images", "garbled", "vector-text", or "annotation-text". Raw bytes work here too.

Supported Formats

  • PDF (.pdf)
  • Microsoft Office (.docx, .xlsx, .pptx, etc.) — requires LibreOffice
  • OpenDocument (.odt, .ods, .odp) — requires LibreOffice
  • Images (.png, .jpg, .tiff, etc.)
  • And more!

CLI

The Python package includes the lit CLI:

lit parse document.pdf
lit parse document.pdf --format json -o output.json
lit parse document.pdf --format json --extract-annotations
lit parse document.pdf --format json --extract-form-fields
lit screenshot document.pdf -o ./screenshots
lit batch-parse ./input ./output
lit is-complex document.pdf

Metadata

Release files for liteparse 2.19.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for liteparse 2.19.0
File Size Uploaded Provenance Actions
liteparse-2.19.0.tar.gz 688.6 kB Without provenance Details for liteparse-2.19.0.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for liteparse 2.19.0
File Actions
liteparse-2.19.0-cp310-abi3-win_arm64.whl CPython 3.10 abi3 Windows ARM64 Details for liteparse-2.19.0-cp310-abi3-win_arm64.whl
liteparse-2.19.0-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details for liteparse-2.19.0-cp310-abi3-win_amd64.whl
liteparse-2.19.0-cp310-abi3-musllinux_1_2_x86_64.whl CPython 3.10 abi3 Linux musl 1.2+ x86-64 Details for liteparse-2.19.0-cp310-abi3-musllinux_1_2_x86_64.whl
liteparse-2.19.0-cp310-abi3-manylinux_2_28_x86_64.whl CPython 3.10 abi3 Linux glibc 2.28+ x86-64 Details for liteparse-2.19.0-cp310-abi3-manylinux_2_28_x86_64.whl
liteparse-2.19.0-cp310-abi3-manylinux_2_28_aarch64.whl CPython 3.10 abi3 Linux glibc 2.28+ ARM64 Details for liteparse-2.19.0-cp310-abi3-manylinux_2_28_aarch64.whl
liteparse-2.19.0-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details for liteparse-2.19.0-cp310-abi3-macosx_11_0_arm64.whl
liteparse-2.19.0-cp310-abi3-macosx_10_12_x86_64.whl CPython 3.10 abi3 macOS 10.12+ x86-64 Details for liteparse-2.19.0-cp310-abi3-macosx_10_12_x86_64.whl

Total release size: 87.1 MB

Release files / liteparse-2.19.0.tar.gz

Download URL liteparse-2.19.0.tar.gz
Size 688.6 kB
Tags Source
SHA-256 checksum
How to use checksums
b90f6cb350611853f6142edafefb715b5973ca8a2998e36b8837781332a089de
BLAKE2b-256 checksum
How to use checksums
1dc1562179f34bc184cb874d7f4fefb23c6f471d007c9cb5e5a1df47d4a73c3e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / liteparse-2.19.0-cp310-abi3-win_arm64.whl

Download URL liteparse-2.19.0-cp310-abi3-win_arm64.whl
Size 10.6 MB
Tags CPython 3.10 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
6daddd5770a56761ab4f0afd6b96d5a8670c845c9df06882a67eafcc21c05242
BLAKE2b-256 checksum
How to use checksums
1f4f0a200526b7858704ed6841c46702cc417bb27aa56fff579a6f5ab3a037ff
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / liteparse-2.19.0-cp310-abi3-win_amd64.whl

Download URL liteparse-2.19.0-cp310-abi3-win_amd64.whl
Size 11.1 MB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
f58b5e1eda4ac2fbcc17346c9e40162ed9e99c7a8bad95dff50f336e4bbb2f6f
BLAKE2b-256 checksum
How to use checksums
7824ff81674f6d338199e27ba5dd545925202e3bca8ea371acaa42818a652c7c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / liteparse-2.19.0-cp310-abi3-musllinux_1_2_x86_64.whl

Download URL liteparse-2.19.0-cp310-abi3-musllinux_1_2_x86_64.whl
Size 16.1 MB
Tags CPython 3.10 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
1c09f7911d502e044c8f41807213534808ffbd40a64d8abce053ef0699c6d5a1
BLAKE2b-256 checksum
How to use checksums
f7c3d96ec3444733d03a22a8cad1b592bce0501feef8f26e5e2a0ed88bc50f71
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / liteparse-2.19.0-cp310-abi3-manylinux_2_28_x86_64.whl

Download URL liteparse-2.19.0-cp310-abi3-manylinux_2_28_x86_64.whl
Size 13.0 MB
Tags CPython 3.10 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
8d1663f742fd4b8e504ebea757a219658b10755088a619243858e376f9f98531
BLAKE2b-256 checksum
How to use checksums
fe43492849721200c35822e5f6eb6517170bd306bc5cfe96ba1bbf910b67e837
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / liteparse-2.19.0-cp310-abi3-manylinux_2_28_aarch64.whl

Download URL liteparse-2.19.0-cp310-abi3-manylinux_2_28_aarch64.whl
Size 12.7 MB
Tags CPython 3.10 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
7eea6b66ff5b718f4672c45032ba642e836aef005f782836c73b261f2991a57f
BLAKE2b-256 checksum
How to use checksums
b9d0ded0c9c41d71d90fe6ac9889d952ef44d89099d3b85301d8952d316abfcc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / liteparse-2.19.0-cp310-abi3-macosx_11_0_arm64.whl

Download URL liteparse-2.19.0-cp310-abi3-macosx_11_0_arm64.whl
Size 11.2 MB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
52742af76cbf7dfb4b451d417eb99d87d1dacfceb2bfb89849db5e6b052f2618
BLAKE2b-256 checksum
How to use checksums
79b196128effcacc673e35a0313e34ca461199d08cdc3cb3e04807e461bd1c02
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / liteparse-2.19.0-cp310-abi3-macosx_10_12_x86_64.whl

Download URL liteparse-2.19.0-cp310-abi3-macosx_10_12_x86_64.whl
Size 11.8 MB
Tags CPython 3.10 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
ffbc26835590160313fec3736c762ae57088d806adc4395dc87090e4e5607993
BLAKE2b-256 checksum
How to use checksums
d615403d15c29c40c9a20352d632ff0c679b907f0e7c17294607a313b0d8099f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Security for liteparse 2.19.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

2.19.0 This release

8 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page