Skip to main content

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 stdin of 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: %PDF for PDF files, ^XA for ZPL files.
    • Uses strict Base64 decoding.
    • Prevents OS Command Injection by executing subprocesses safely without shell=True.
  • 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 lp command must be available in the system path.
  • Python 3.7+

Installation

From PyPI

pip install odoo-print-client

From source

  1. Clone the repository and navigate into it:
    git clone https://github.com/forgeflow/odoo-print-client.git
    cd odoo-print-client
    
  2. (Optional but recommended) Create and activate a virtual environment:
    python3 -m venv venv
    source venv/bin/activate
    
  3. 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

LGPL-3.0

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

odoo_print_client-0.0.1.tar.gz (8.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

odoo_print_client-0.0.1-py3-none-any.whl (9.6 kB view details)

Uploaded Python 3

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

Hashes for odoo_print_client-0.0.1.tar.gz
Algorithm Hash digest
SHA256 968f2bb6040d7330dfbdd473c2151dd9cf9f208d9ea929e8211b685535f3fa35
MD5 9a2a1c2f9ef5297a2afa609e6029ce03
BLAKE2b-256 2de4e515db8028e6a3dfda9a6872b5e3e64de67641343c1d514be4c1cb025be1

See more details on using hashes here.

File details

Details for the file odoo_print_client-0.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for odoo_print_client-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 18e04878af4188ba1a47e8661b689fdaa260d9fa66a013e3a9262d5dd1f14f97
MD5 f06f55886d012f1d6b76f8c79a531ece
BLAKE2b-256 b8ae22fdb9242b7107e2c244fcb8d69dffbca39e2ccdbce47c380bf9c3b99ba2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page