Ein Linux-System übernimmt zwei Rollen gleichzeitig: Es stellt einen virtuellen Netzwerkdrucker bereit (CUPS + CUPS-PDF) und teilt den PDF-Ausgabeordner als Windows-Netzlaufwerk (Samba). Windows-Clients drucken in einen Netzwerkdrucker – das Ergebnis ist eine PDF-Datei, die sofort im Netzlaufwerk erscheint.
Windows-Client
│
│ 1. Druckt auf Netzwerkdrucker (IPP / Port 631)
▼
Linux-Server ── CUPS empfängt den Druckauftrag
│
│ 2. CUPS-PDF wandelt PostScript → PDF
▼
/mnt/sata/smb/pdf/
│
│ 3. Samba teilt den Ordner als \\server\pdf
▼
Windows-Client
Öffnet \\server\pdf – PDF ist fertig
| Komponente | Aufgabe |
|---|---|
| Samba (smbd) | Teilt Verzeichnisse als Windows-Netzlaufwerke (SMB/CIFS-Protokoll) |
| CUPS | Druckserver – empfängt Druckaufträge von Windows per IPP |
| cups-pdf | Virtuelles Druckermodul – konvertiert eingehende PostScript-Daten in PDF |
| AppArmor | Sicherheitsmodul das einschränkt, wohin CUPS schreiben darf – muss für den PDF-Pfad erweitert werden |
sudo apt update sudo apt install -y samba samba-common-bin
Optionaler Benutzer mit Samba-Passwort (für passwortgeschützte Shares):
# Linux-Systembenutzer muss bereits existieren
sudo smbpasswd -a BENUTZERNAME
Den neuen Share ans Ende der /etc/samba/smb.conf anfügen:
[pdf] comment = PDF Printer Output path = /mnt/sata/smb/pdf browseable = yes read only = no guest ok = yes guest only = yes force user = nobody force group = users create mask = 0664 directory mask = 0775
# Syntaxprüfung – sollte "Loaded services file OK" melden
sudo testparm -s
sudo systemctl enable --now smbd
sudo systemctl restart smbd
guest ok = yes) – er dient nur als Ablagefach für eigene Druckausgaben im lokalen Netz. In einem öffentlichen Netz Passwortschutz ergänzen (guest ok = no, valid users = BENUTZERNAME).
sudo apt install -y cups cups-pdf
# Eigenen Benutzer zur CUPS-Admingruppe hinzufügen
sudo usermod -a -G lpadmin $USER
usermod neu anmelden oder newgrp lpadmin ausführen, damit die Gruppenmitgliedschaft aktiv wird.
Standardmäßig schreibt cups-pdf die PDFs in /var/spool/cups-pdf/${USER}. Das wird auf den Samba-Share umgebogen:
# Aktuelle Out-Zeile anzeigen
grep "^Out" /etc/cups/cups-pdf.conf
# Alt: # Out /var/spool/cups-pdf/${USER} # Neu: Out /mnt/sata/smb/pdf
sudo sed -i 's|^Out .*|Out /mnt/sata/smb/pdf|' /etc/cups/cups-pdf.conf
CUPS lauscht standardmäßig nur auf localhost. Für den Netzwerkdrucker muss es auf allen Interfaces hören und Drucker nach außen freigeben:
# Netzwerkzugriff und Druckerfreigabe aktivieren sudo cupsctl --remote-any --share-printers # Optional: Server-Alias für Hostnamen im LAN (z. B. gmk.lan) sudo cupsctl --server-name gmk.lan
Falls der Linux-Hostname per mDNS oder lokales DNS nicht auflösbar ist, den Alias manuell in cupsd.conf eintragen:
ServerAlias gmk.lan
sudo systemctl restart cups
AppArmor beschränkt, welche Dateipfade CUPS beschreiben darf. Da /mnt/sata/smb/pdf nicht im Standard-Profil steht, wird CUPS ohne diesen Schritt stillschweigend am Schreiben gehindert.
})# Pfad anpassen wenn dein Ausgabeordner woanders liegt
sudo tee -a /etc/apparmor.d/usr.sbin.cupsd <<'EOF'
/mnt/sata/smb/pdf/ rw,
/mnt/sata/smb/pdf/** rw,
EOF
tee -a hängt die Zeilen ans Ende der Datei an – das kann außerhalb der schließenden } landen und das Profil ungültig machen. Danach kurz prüfen: sudo apparmor_parser -p /etc/apparmor.d/usr.sbin.cupsd
Sicherer: Profil manuell bearbeiten und die zwei Zeilen vor die letzte } einfügen:
sudo nano /etc/apparmor.d/usr.sbin.cupsd
/mnt/sata/smb/pdf/ rw, /mnt/sata/smb/pdf/** rw,
sudo systemctl restart apparmor sudo systemctl restart cups
Im Browser https://<Server-IP>:631/admin öffnen und mit dem Linux-Benutzerkonto einloggen.
Network-PDF-PrinterVirtueller PDF-DruckerLAN/mnt/sata/smb/pdf/ erscheinen.
Netzlaufwerk verbinden (für den PDF-Ausgabeordner):
\\<Server-IP>\pdf (oder \\gmk.lan\pdf)Netzwerkdrucker hinzufügen:
https://<Server-IP>:631/printers/Network-PDF-Printersudo apt install avahi-daemon). Dann taucht er in der Druckerliste ohne manuelle URL auf.
Vom Windows-Client aus ein beliebiges Dokument auf den neuen Netzwerkdrucker drucken. Danach:
# PDF-Datei erschienen? ls -lh /mnt/sata/smb/pdf/ # CUPS-Druckerwarteschlange anzeigen lpstat -p -d # Letzte Druckaufträge sudo journalctl -u cups --since "5 min ago" | tail -20
Vom Windows-Client aus das Netzlaufwerk öffnen – die neue PDF-Datei sollte dort erscheinen.
| Problem | Lösung |
|---|---|
| CUPS-Webinterface nicht erreichbar | Firewall prüfen: sudo ufw allow 631/tcp. CUPS-Status: sudo systemctl status cups. Lauscht CUPS auf allen Interfaces? ss -tlnp | grep 631 |
| Druckauftrag bleibt hängen / keine PDF | AppArmor-Block prüfen: sudo journalctl -u cups | grep -i denied. Pfade in /etc/apparmor.d/usr.sbin.cupsd korrekt eingetragen und AppArmor neu geladen? |
| Kein Schreibrecht auf /mnt/sata/smb/pdf | Eigentümer prüfen: ls -la /mnt/sata/smb/pdf – muss nobody:users sein. CUPS läuft als nobody: ps aux | grep cups |
| Windows findet Netzlaufwerk nicht | Samba läuft: sudo systemctl status smbd. Config testen: sudo testparm. SMB-Port offen: sudo ufw allow samba. Verbindung direkt per IP testen: \\192.168.x.x\pdf |
| Windows zeigt "Zugriff verweigert" beim Drucker | CUPS-Druckerfreigabe aktiv? cupsctl | grep share muss share-printers=1 zeigen. Drucker-URL in Windows auf korrekte Schreibweise prüfen (Groß-/Kleinschreibung beachten) |
| PDF enthält nur leere Seiten | Falscher Windows-Druckertreiber gewählt. MS Publisher Imagesetter (Generic, PostScript) verwenden – kein PCL-Treiber |
| ServerAlias-Fehler im CUPS-Log | ServerAlias in cupsd.conf muss dem Hostnamen entsprechen, den der Browser in der URL nutzt. Mit IP ansprechen umgeht das Problem komplett. |
sudo journalctl -u cups -u smbd --since "10 min ago" -f