Reflow
State-of-the-art PDF/DOCX to semantic HTML converter with strong layout preservation.
Install
pip install -e .
Optional ML features (layout detection, OCR, table transformer):
pip install -e '.[ml]'
Quick Start
reflow convert input.pdf -o output.html
With OCR and guardrails:
reflow convert input.pdf \
--ocr \
--max-pages 200 \
--max-output-mb 50 \
--max-raster-mp 40 \
--device cpu \
-o output.html
Reliability Guardrails
Reflow now supports resource limits to make production behavior predictable:
max_pages: fail fast when document scope is too large.max_output_bytes: fail fast when generated HTML exceeds configured size.max_raster_megapixels: caps raster operations to avoid memory spikes.- Atomic output writes: output files are written safely via temp-file replace.
Observability
- Structured diagnostics callback (
diagnostics_callback) can capture stage timings and pipeline stats. - CLI prints timing/stats summary by default (
--emit-stats/--no-emit-stats).
Edge Case Handling
- Invalid page selections are validated against document page count.
- Scanned pages can trigger OCR automatically when no extractable text is found.
- Layout/table/OCR model failures degrade gracefully with warnings instead of hard crash.
- Broken text encoding spans are rasterized to preserve visual fidelity.
API
import reflow
html = reflow.convert(
"sample.pdf",
ocr=True,
layout_detection=True,
table_recognition=True,
max_pages=100,
max_output_bytes=20 * 1024 * 1024,
)
Testing
pytest -q
With coverage gate (same as CI):
pytest --cov=reflow --cov-report=term-missing --cov-fail-under=80
Golden snapshot tests:
pytest -m golden
Update golden snapshots intentionally:
REFLOW_UPDATE_GOLDENS=1 pytest -m golden
Benchmarking
Single document:
reflow benchmark sample.pdf --repeat 3 --output-json bench.json
Directory benchmark:
reflow benchmark ./pdfs --glob "*.pdf" --repeat 2 --output-json bench.json
Benchmark output includes min/median/max latency, output-size stats, and per-run stage diagnostics.
CI
GitHub Actions CI is configured in .github/workflows/ci.yml and runs tests with coverage threshold enforcement.
Notes
- Python 3.12+
- Best results for complex layouts require optional ML dependencies.
Metadata
Release files for pyreflow 0.4.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| pyreflow-0.4.2.tar.gz | 172.6 kB | Without provenance | Details for pyreflow-0.4.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| pyreflow-0.4.2-py3-none-any.whl | Python 3 | none | any | Details for pyreflow-0.4.2-py3-none-any.whl |
Total release size: 247.6 kB
Release files / pyreflow-0.4.2.tar.gz
| Download URL | pyreflow-0.4.2.tar.gz |
|---|---|
| Size | 172.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fc5c1ec8d5c6aaa4e12319cbfad62c561c279c2d8a12258744775b00a9c619e5
|
|
BLAKE2b-256 checksum How to use checksums |
865c2e8c9d4faa1db305e6dd904de6c99d7ad0d45dc93c7ec85c294b0fe942d3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.2
|
Release files / pyreflow-0.4.2-py3-none-any.whl
| Download URL | pyreflow-0.4.2-py3-none-any.whl |
|---|---|
| Size | 75.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
46f0e6dfc1a28550e1ac3a67f652bfc819218785c99d4e17868597f97d669ec2
|
|
BLAKE2b-256 checksum How to use checksums |
47a2f219dd78b94263514dda422044a737fc79f05894c4aa166b82aeecf8a6b8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.2
|
Security for pyreflow 0.4.2
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.