Direct Print PDF - Client Polling
by okkype@gmail.com https://linkedin.com/in/okky-permana-sihipo$ 49.35
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Lines of code | 1848 |
| Technical Name |
direct_print_ok |
| License | OPL-1 |
| Website | https://linkedin.com/in/okky-permana-sihipo |
| Versions | 16.0 17.0 18.0 19.0 |
🖨️ Direct Print PDF & Dot Matrix Client
Automated, Silent Background Printing from Odoo Without Browser Dialogs
✨ Core Module Capabilities
⚡ Zero-Click Printing
Bypass the browser download step and standard print dialog completely. Jobs are processed silently in the background.
🖥️ Cross-Platform GUI
Lightweight client program built in Python, fully compatible with Windows and Linux workstation terminals.
🔌 Epson & Dot Matrix Optimizations
Modes to render vector PDFs, text streams (RAW), or monochrome raster images formatted specifically for Dot Matrix printers.
🔒 Secure Offline Queue
Secure client-pull model requires no external incoming NAT/port configuration. Print jobs are deleted immediately after spooling.
⚙️ Architecture & Print Flow
The module links Odoo's QWeb reporting engine directly with local desktop hardware:
- Print Triggered: A user clicks a report action (like printing an Invoice or Pick List) from the Odoo backend interface.
- Queue Hook: Odoo's
ir.actions.reportintercepts the call, renders the PDF, and places the base64-encoded file inside a database print queue (ir.actions.report.queue) tagged with the target Device ID. - Client Polling: The Python client runs locally on the terminal computer and queries the secure endpoint
/report/direct/<unique_id>at a set interval. - Spool & Cleanup: The client retrieves the base64 data, decodes it, formats the printer-specific commands (such as converting vector PDF elements to 1-bit monochrome grids), spools it to the printer queue, and Odoo unlinks the queue entry immediately.
📦 Odoo Server-Side Configuration Manual
Our Direct Print engine inherits three key core components within the Odoo backend.
1. Report Settings (ir.actions.report)
Every report has a new Print tab containing print routing settings (only visible for qweb-pdf reports):
- Default Behavior:
•Send to Client: Standard PDF download in browser.
•Open Print Dialog: Automatically prompts browser printing window.
•Queued to Hook: Silent printing. Pushes the rendered PDF directly to the database spool queue instead of downloading. - Printer Unique IDs: Link specific physical station IDs (e.g.
DEV-19472) to this report. Under each ID, you can specify one or more Odoo Users. If specified, only print commands triggered by those users are routed to that printer; if left empty, the queue is shared. - Report Queue: Displays currently queued pending jobs for this report, showing the target Device ID and the base64-encoded document binary.
- Download Client: A button that triggers a direct download of the Tkinter Python print client (
print.py).
2. Paper Format Settings (report.paperformat)
Accessible via Settings > Technical > Paper Formats. The view is extended to include Default Behavior, Printer Unique IDs, and the Download Client button. This enables default print routings mapped to paper dimensions (e.g. formatting a thermal receipt to automatically output to the POS receipt printer).
3. Document Layout (base.document.layout)
Integrates the direct print configuration options directly inside Odoo's Document Layout setup wizard, ensuring printer connections can be quickly mapped during initial company styling.
4. Access & Security Rules
The module exposes secure, public model permissions (via ir.model.access.csv) allowing standard users full read, write, create, and delete actions for queue records (ir.actions.report.queue) and printer IDs (report.paperformat.unique). All print operations run securely over standard HTTP/HTTPS channels.
🖥️ Desktop Client Configuration Guide
The desktop client (located in static/src/exe/print.py) runs a Tkinter GUI and polls Odoo for prints.
Client Prerequisites & Installation
Ensure Python 3.8+ is installed on the terminal computer. Navigate to the client folder and install libraries via requirements.txt:
Core client dependencies include:
requests: Polls Odoo endpoints securely.PyMuPDF (fitz): High-performance PDF processing, text coordinates extraction, and rendering (completely replacing legacy slow packages).Pillow: Handles image pixel maps for print rasterizations.pywin32: Needed only on Windows hosts to interact with the Win32 Print API (win32print).
Interactive GUI Configuration Modal
Launch the client dashboard using python print.py. Click the Configuration button on the top-right to open the modal configurations. Dynamic visibility hiding prevents settings clutter:
| Field Label | Key Parameter | Validation Rule / Notes |
|---|---|---|
| Device ID | UNIQUE_ID |
Unique station name. Auto-generated on first boot from registry or machine-id. Matches ID registered in Odoo. |
| Base URL | URL_BASE |
Endpoint domain. Format: https://erp.company.com/report/direct. |
| Database | DATABASE |
Optional multi-database routing. Keep blank if your Odoo instance is single-database. |
| Poll Interval (sec) | INTERVAL_SECONDS |
Polling cycle. Mandated as a positive integer ≥ 1. |
| Print Mode | PRINT_MODE |
Select pdf (standard office/vector), dotmatrix (low-dpi receipt rendering), or txt (raw plain text). |
| Orientation | PRINT_ORIENTATION |
Select default, portrait, or landscape (90-degree rotate). |
| Printer Name | WINDOWS_PRINTER_NAME / LINUX_PRINTER_NAME |
Matches local OS printer names. If empty, the client uses the system's default printer. |
| PDF Method (Windows) | WINDOWS_PDF_PRINT_METHOD |
Select raw (PCL rendering) or sumatra_pdf (portable silent wrapper execution). |
| Dot Matrix Settings | DOT_MATRIX_LPI / DOT_MATRIX_SCALE |
Line vertical spacing (usually 6 or 8) and scaling float (default: 0.6) for monospaced printer alignments. |
| Layout size & Margins | PAGE_WIDTH_MM / PAGE_HEIGHT_MM / margins |
Co-dependency Validation: If any single dimension/margin is filled, then all 6 fields (Width, Height, Top, Bottom, Left, Right) must be filled as valid float values. Or keep all blank for auto-boundary detection. |
📞 Premium Technical Support & License
Author: okkype@gmail.com
Website: linkedin.com/in/okky-permana-sihipo
License: OPL-1 (Odoo Proprietary License)
Version: 18.0.0.0.1
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module