Reflex PDF viewer component and app.
Project description
Reflex PDF Viewer + App
This repository includes the source (under /src) for a Python package reflex_pdf that provides both
- a reusable Reflex custom component package
reflex_pdf.componentsand - a standalone Reflex application
reflex_pdf_app.apps.
Prerequisites
- Python, including
pip.
reflex-pdf.components
A PDF viewer component for Reflex, built on top of react-pdf.
Install
pip install reflex-pdf
Use in your Reflex app
import reflex as rx
from reflex_pdf import Document, Page
class State(rx.State):
current_page: int = 1
n_pages: int = 1
@rx.event
def load_success(self, info: dict):
self.n_pages = info.get("numPages", 1)
def index():
return rx.vstack(
rx.heading("Reflex PDF preview", size="8"),
Document.create(
Page.create(page_number=State.current_page),
file="https://mozilla.github.io/pdf.js/web/compressed.tracemonkey-pldi-09.pdf",
on_load_success=State.load_success,
),
)
app = rx.App()
app.add_page(index)
Add this to your rxconfig.py:
import reflex as rx
config = rx.Config(
app_name="your_app",
frontend_packages=["react-pdf@9.1.1"],
)
Standalone app: reflex_pdf_app
Run from the repository root:
python -m reflex_pdf.apps.run_app
This script will:
- Prepare runtime directories for Reflex state and build artifacts
- Ensure bun is available for Reflex frontend builds
- Ensure Node.js is available (>= 20.19.0 in dev mode, >= 22.14.0 in prod single-port mode)
- Start the app in
src/reflex_pdf/apps/using the current Python environment
Run modes:
- local default:
devmode on frontend3000and backend8000 - Codespaces default:
prod single-portmode on3000
Environment overrides:
REFLEX_RUN_MODE:devprod-single-port
REFLEX_TRANSPORT:websocketpolling
REFLEX_FRONTEND_PORTandREFLEX_BACKEND_PORT(dev mode)REFLEX_SINGLE_PORT(prod single-port mode)
For Codespaces, single-port mode avoids separate backend tunnel auth for /_event.
The launcher defaults REFLEX_TRANSPORT=polling in Codespaces for compatibility with forwarded-port browser sessions.
Backend event endpoint
This app already uses Reflex's built-in backend event endpoint (/_event) for all state updates (for example State.set_pdf_url).
Because /_event is Reflex's internal event transport rather than a FastAPI route, it is not exposed through Swagger/OpenAPI by default.
For MFE-style integration, the host can set the PDF URL from the same browser session in either of these ways:
- Initial URL in iframe source query string:
https://<viewer-host>/?pdf=<encoded_pdf_url>
- Runtime updates via
postMessageto the iframe:
iframe.contentWindow.postMessage(
{ type: "reflex-pdf:set-url", url: "https://example.com/file.pdf" },
"*",
);
Both approaches update only that user session (no separate backend request needed).
Query-string rule: only one parameter is accepted (
Example that must be encoded:
- raw (invalid):
/?pdf=https://example.com/file.pdf?token=abc&download=1 - encoded (valid):
/?pdf=https%3A%2F%2Fexample.com%2Ffile.pdf%3Ftoken%3Dabc%26download%3D1
The viewer uses a single URL state (pdf_url) for both initialization and runtime updates:
?pdf=...initializespdf_urlwhen the page loads.postMessagewith{ type: "reflex-pdf:set-url", url }updates that samepdf_urlin-session.
For automation/integration testing outside the browser session, you can post the same event with post_pdf_url_event:
from reflex_pdf.apps.event_test_client import post_pdf_url_event
post_pdf_url_event("http://127.0.0.1:3000", "https://mozilla.github.io/pdf.js/web/compressed.tracemonkey-pldi-09.pdf")
Development
pip install -e .
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
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 reflex_pdf-0.0.1-py3-none-any.whl.
File metadata
- Download URL: reflex_pdf-0.0.1-py3-none-any.whl
- Upload date:
- Size: 10.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a2662a71acc7d98b9f7dd08ca28522eef39f402b1ac80d942ceda543202ef657
|
|
| MD5 |
e9f913f8a5b0b61990465c087e4ab713
|
|
| BLAKE2b-256 |
c4d96c4c00c9ae3bcced20ed61cbc4dd028400176ca42b72836387ea0053d24e
|