py-printer-server
Remote print server for a USB-connected printer. Python 3.11+, no third-party dependencies. Runs on the machine your printer is plugged into; phones and laptops on the same network upload files to it and print them.
Disclaimer. Provided AS IS, without warranty of any kind, express or implied. Use entirely at your own risk. This tool binds a network port on the machine it runs on and lets an authenticated user upload files and send them to a physical printer attached to that machine. The author accepts no liability for data loss, wasted paper or ink, hardware damage, unauthorised access or disclosure, business interruption, or consequential damages. You are responsible for setting a strong
ADMIN_PASSWORD(the server refuses to start without one), limiting the server to a network you trust, verifying the printer and paper tray before printing, and being authorised to print the files you upload. Not certified for regulated, forensic, safety-critical or high-assurance use. See DISCLAIMER.md; LICENSE is the governing text and prevails where the two differ.
Install
pip install py-printer-server
Run
$env:ADMIN_PASSWORD = "your-strong-password"
py-printer-server
pps is installed as a shorter alias for the same command. No ADMIN_PASSWORD
set? Get a suggestion with:
py-printer-server --generate-password
The server prints its LAN URL on startup, e.g. http://192.168.1.24:8114 --
open that from a phone on the same Wi-Fi, log in, and upload a file.
Options
--port PORT Port (default: 8114)
--spool DIR Spool folder for uploaded files (default: ./spool)
--jobs DIR Archive folder for printed jobs (default: ./jobs)
--list-printers List installed printers (hardware vs virtual) and exit
--dry-run Log what would be printed instead of sending jobs to a printer
--generate-password Print a strong random ADMIN_PASSWORD suggestion and exit
How it works
- Upload one or more files from any device on the network -- they land in a single flat spool folder. There is no folder browsing; uploading is the whole interaction.
- Tick the files you want (or "Print all"), pick a printer, colour/mono, A4, copies and duplex, and press Print.
- Printed files are moved, not deleted, into
jobs\print-job-<timestamp>-<id>\, alongside ajob.jsonrecording what was printed and how -- so nothing needs re-uploading to print again. A file that failed or could not be printed stays in the spool so you can retry it; only successfully printed files are archived.
A job is reported done only when every file actually printed. A mixed result
is partial, and the jobs panel shows the reason next to each file that did
not print.
Only real hardware printers are shown by default (a "Show all printers" checkbox reveals software sinks like Microsoft Print to PDF).
Supported files
| Type | Path |
|---|---|
Plain text / code (.txt .log .csv .md .py .json ...) |
Printed directly by this tool -- full control over colour, copies and duplex. |
PDF and images (.pdf .png .jpg .tif .bmp .gif) |
Handed to Windows' registered handler for that file type via the shell's print verb. |
Office documents (.docx .xlsx .pptx .doc .xls .ppt) |
Same shell handoff, via Word/Excel/PowerPoint. |
Colour, copies and duplex apply fully only to the text path. PDFs, images and Office documents are printed by whichever application Windows has associated with them, and that application builds its own print settings, so those files follow the printer's standing defaults instead. This is a real limitation of printing without a bundled renderer, not a bug.
No third-party dependencies
Everything, including Win32 printer access, uses only the Python standard
library (ctypes bindings to winspool.drv/shell32.dll, http.server,
socketserver). This is a deliberate choice, matching the companion project
py-file-server: fewer things that
can go missing or need a security update on a machine you may not touch again
for a year.
Security
- The server refuses to start unless
ADMIN_PASSWORDis set. - Login attempts are rate-limited (5 failures locks an IP out for 5 minutes).
- Sessions use
HttpOnly,SameSite=Strictcookies with CSRF tokens on every state-changing request. - Windows-only: printer access is unavailable on any other OS.
License
MIT. See LICENSE.
Metadata
Release files for py-printer-server 0.1.0
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 | |
|---|---|---|---|---|
| py_printer_server-0.1.0.tar.gz | 35.6 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| py_printer_server-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 74.6 kB
Release files / py_printer_server-0.1.0.tar.gz
| Download URL | py_printer_server-0.1.0.tar.gz |
|---|---|
| Size | 35.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4e93a0946f251d650d8f2187df6540f8eb3058574cdc3a681efdf7ef8466476b
|
|
BLAKE2b-256 checksum How to use checksums |
731f80040167c34df4ff34274ad115782d84ffa7e16d67304b84f098c6e86efb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.5
|
Release files / py_printer_server-0.1.0-py3-none-any.whl
| Download URL | py_printer_server-0.1.0-py3-none-any.whl |
|---|---|
| Size | 39.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e2a7d0d1f976a196a0042e5fd5e69eef29e17a67f149aa00dea3943450ab56ee
|
|
BLAKE2b-256 checksum How to use checksums |
a7d531119797eea9520c3d5c818568bb1588938f75e07b8e8cf9842ceb981bcd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.5
|
Security for py-printer-server 0.1.0
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.