A local WebSocket print client for Odoo, zero footprint.
Project description
Odoo Local Print Client
A secure, zero-footprint local printing client for Odoo. This client connects to your Odoo instance via WebSockets, listens for print jobs on the Odoo Bus, and pipes documents directly to your local Linux print spooler (CUPS) without ever saving files to disk.
Features
- Zero Footprint (In-Memory Printing): Documents are decoded in RAM and piped directly to
stdinof the OS print command. No temporary files are created, ensuring maximum data privacy (GDPR compliant). - PDF and ZPL support: Handles standard PDF documents as well as ZPL label files (sent raw to label printers such as Zebra).
- High Security:
- Validates magic bytes:
%PDFfor PDF files,^XAfor ZPL files. - Uses strict Base64 decoding.
- Prevents OS Command Injection by executing subprocesses safely without
shell=True.
- Validates magic bytes:
- Configurable Channel: Subscribe to any Odoo Bus channel via environment variable or CLI argument, allowing multiple clients to listen on different channels simultaneously.
- Firewall Friendly: Uses WebSockets to initiate an outbound connection to Odoo. No inbound ports need to be opened on the client's local network.
- Environment Variables (.env): Securely manage Odoo credentials without hardcoding them.
Prerequisites
- Linux OS (Ubuntu, Debian, etc.)
- CUPS (Common UNIX Printing System) installed and running. The
lpcommand must be available in the system path. - Python 3.7+
Installation
From PyPI
pip install odoo-print-client
From source
- Clone the repository and navigate into it:
git clone https://github.com/forgeflow/odoo-print-client.git cd odoo-print-client
- (Optional but recommended) Create and activate a virtual environment:
python3 -m venv venv source venv/bin/activate
- Install the package:
pip install -e .
Configuration
Create a .env file in the directory from which you will run the client:
ODOO_URL=http://localhost:8069
ODOO_DB=your_database_name
ODOO_USER=print_service_user
ODOO_PASSWORD=your_super_secure_password
ODOO_CHANNEL=your_odoo_channel
Secure the file so only the owner can read it:
chmod 600 .env
Note: It is highly recommended to create a dedicated Odoo user (e.g.,
print_service) with minimal access rights solely for authenticating this client, rather than using the admin account.
Usage
Once installed and configured, run:
odoo-printer
The client loads credentials from the .env file, authenticates via JSON-RPC, establishes the WebSocket connection, and listens for incoming print jobs on the configured channel.
CLI arguments
All options can be overridden via command-line arguments:
odoo-printer \
--url "https://odoo.example.com" \
--db "prod" \
--user "print_service" \
--password "secret" \
--channel "printer_office_1"
| Argument | Env variable | Description |
|---|---|---|
--url |
ODOO_URL |
Odoo base URL |
--db |
ODOO_DB |
Odoo database name |
--user |
ODOO_USER |
Odoo username |
--password |
ODOO_PASSWORD |
Odoo password |
--channel |
ODOO_CHANNEL |
Odoo Bus channel to subscribe to |
Running multiple instances
To serve multiple printers or locations, run one instance per channel with different .env files or by passing --channel directly:
odoo-printer --channel "printer_warehouse" &
odoo-printer --channel "printer_office" &
How it works (Odoo side)
This client expects a specific JSON payload sent through bus.bus on the configured channel. You will need a custom Odoo module to intercept the print action and send the payload.
Bus message structure
{
"type": "print_job",
"payload": {
"printer_name": "Name_of_CUPS_Printer",
"file_type": "pdf",
"file_data": "JVBERi0xLjQKJcOkw7zDts..."
}
}
| Field | Required | Values | Description |
|---|---|---|---|
printer_name |
No | Any CUPS printer name | Omit to use the system default printer |
file_type |
No | pdf (default), zpl |
Determines how the file is processed |
file_data |
Yes | Base64 string | Strictly Base64-encoded file content |
PDF jobs
Validated against the %PDF magic bytes and sent to CUPS via lp.
ZPL jobs
Validated against the ^XA ZPL start-of-label marker and sent to CUPS via lp -o raw, bypassing raster processing so the raw ZPL stream reaches the label printer directly.
License
Project details
Release history Release notifications | RSS feed
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 odoo_print_client-0.0.1.tar.gz.
File metadata
- Download URL: odoo_print_client-0.0.1.tar.gz
- Upload date:
- Size: 8.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
968f2bb6040d7330dfbdd473c2151dd9cf9f208d9ea929e8211b685535f3fa35
|
|
| MD5 |
9a2a1c2f9ef5297a2afa609e6029ce03
|
|
| BLAKE2b-256 |
2de4e515db8028e6a3dfda9a6872b5e3e64de67641343c1d514be4c1cb025be1
|
File details
Details for the file odoo_print_client-0.0.1-py3-none-any.whl.
File metadata
- Download URL: odoo_print_client-0.0.1-py3-none-any.whl
- Upload date:
- Size: 9.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
18e04878af4188ba1a47e8661b689fdaa260d9fa66a013e3a9262d5dd1f14f97
|
|
| MD5 |
f06f55886d012f1d6b76f8c79a531ece
|
|
| BLAKE2b-256 |
b8ae22fdb9242b7107e2c244fcb8d69dffbca39e2ccdbce47c380bf9c3b99ba2
|