LAN PDF Printer turns a macOS machine into a LAN-visible printer that saves incoming jobs as PDFs instead of printing them.
It uses macOS's built-in ippeveprinter service to advertise an IPP Everywhere printer over Bonjour/DNS-SD, accepts PDF print jobs, and writes them into a folder on the host Mac. In practice, this lets a Windows 11 machine discover a printer on your local network, print to it, and have the "printed" output appear as PDFs on the Mac.
- Host OS: macOS only
- Client support: tested with Windows 11 on the same LAN
- Installer: not yet; setup is command-line based
- Scope: PDF-only job handling, no PostScript/PCL/raster conversion
- Advertises a printer on your local network
- Accepts IPP print jobs
- Saves each job as a PDF to a configured folder
- Runs in the foreground or as a per-user LaunchAgent
- Normalizes page order for Windows jobs that arrive with face-up ordering metadata
- macOS with
/usr/bin/ippeveprinter - Python 3.13+
- A client on the same local network
- For the tested path: Windows 11 as the printing client
-
Clone the repo.
-
Copy the sample config:
cp config.example.toml config.toml
-
Edit
config.tomlto choose your printer name and output folder. -
Install the package:
python3 -m pip install . -
Verify the setup:
printtopdf doctor
-
Run the printer:
printtopdf run
-
On Windows 11, add the printer and send a test job.
The app reads config.toml from the project root by default. Start by copying config.example.toml.
printer_name = "Home LAN Printer"
output_dir = "~/Documents/RemotePrinterPDFs"
spool_dir = "~/Library/Application Support/PrintToPDF/spool"
port = 8631
location = "Home Office"
log_file = "~/Library/Logs/PrintToPDF/remote-printer.log"Field reference:
printer_name: the name users see when they add the printeroutput_dir: where saved PDFs are writtenspool_dir: temporary working directory used by the printer serviceport: IPP service portlocation: human-readable location string shown to clientslog_file: JSON-lines log for service starts and saved/rejected jobs
Check the configuration, show the IPP URI, and verify local DNS-SD visibility:
printtopdf doctorRun the printer in the foreground:
printtopdf runInstall and load the per-user LaunchAgent:
printtopdf install-launch-agentThe LaunchAgent writes ~/Library/LaunchAgents/com.printtopdf.remote-printer.plist, starts at login, and keeps the printer running for that user session.
-
Open Settings > Bluetooth & devices > Printers & scanners.
-
Wait briefly to see whether the configured printer name appears automatically.
-
If discovery is delayed, add it manually with:
ipp://<your-mac-local-hostname>.local:8631/ipp/print -
Print a test document.
-
Check
output_diron the Mac for the new PDF.
printtopdf doctor prints the exact IPP URI using the Mac's current local host name.
- Make sure the printer service is actually running on the Mac.
- Run
printtopdf doctorand confirm DNS-SD is visible. - Allow incoming connections for Python or Terminal if macOS prompts for firewall access.
- Confirm the Mac and Windows machine are on the same LAN.
- Check
log_fileforjob_savedorjob_rejectedentries. - Manually add the printer with the IPP URI if auto-discovery is flaky.
- Current builds normalize page order for jobs that arrive with
output-bin=face-up. - If you still hit this, keep the log entry and the sample PDF; that means the client is using a different ordering signal.
Use:
launchctl print gui/$(id -u)/com.printtopdf.remote-printerThen inspect log_file.
printtopdf runstartsippeveprinterippeveprinteradvertises the printer and spools incoming jobs- a small Python hook validates the incoming document
- accepted jobs are saved into
output_dir - metadata is written to
log_file
This keeps LAN PDF Printer small and uses macOS's built-in IPP tooling instead of a custom print server.
Run the test suite:
python3 -m unittest discover -s testsRun the local IPP smoke test:
RUN_IPP_TESTS=1 python3 -m unittest tests.test_integration- macOS host only
- no GUI
- no installer yet
- PDF-only handling
- no authentication
- intended for trusted local networks