PDF-Drucker
Linux als virtueller PDF-Drucker für Windows-Clients via CUPS + Samba
← Projekte
⬡
Wie es funktioniert

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.

Ablauf
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
KomponenteAufgabe
Samba (smbd)Teilt Verzeichnisse als Windows-Netzlaufwerke (SMB/CIFS-Protokoll)
CUPSDruckserver – empfängt Druckaufträge von Windows per IPP
cups-pdfVirtuelles Druckermodul – konvertiert eingehende PostScript-Daten in PDF
AppArmorSicherheitsmodul das einschränkt, wohin CUPS schreiben darf – muss für den PDF-Pfad erweitert werden
Inhalt
  1. Samba installieren
  2. PDF-Ausgabeordner anlegen
  3. Samba konfigurieren
  4. CUPS + cups-pdf installieren
  5. PDF-Ausgabepfad in CUPS-PDF setzen
  6. CUPS für Netzwerkzugriff konfigurieren
  7. AppArmor-Profil erweitern
  8. Drucker im CUPS-Webinterface hinzufügen
  9. Windows-Client verbinden
  10. Testen
  11. Troubleshooting
Teil 1 – Samba (Netzlaufwerk)
1
Samba installieren
bash
sudo apt update
sudo apt install -y samba samba-common-bin

Optionaler Benutzer mit Samba-Passwort (für passwortgeschützte Shares):

bash
# Linux-Systembenutzer muss bereits existieren
sudo smbpasswd -a BENUTZERNAME
ℹ Der PDF-Share wird im nächsten Schritt als Guest-Share eingerichtet – kein Samba-Passwort nötig. Ein Benutzer ist nur relevant, wenn du zusätzliche passwortgeschützte Shares anlegen möchtest.
2
PDF-Ausgabeordner anlegen

CUPS-PDF schreibt die fertigen PDF-Dateien in diesen Ordner. Samba teilt ihn mit Windows-Clients. Der Ordner braucht Schreibrechte für den CUPS-Prozess (nobody):

bash
# Pfad anpassen falls dein Storage woanders liegt
sudo mkdir -p /mnt/sata/smb/pdf
sudo chown -R nobody:users /mnt/sata/smb/pdf
sudo chmod -R 2775 /mnt/sata/smb/pdf
✓ Das Sticky-Bit (2775) stellt sicher, dass neue Dateien die Gruppe users erben – so können alle Gruppenmitglieder die PDFs lesen.
3
Samba konfigurieren

Den neuen Share ans Ende der /etc/samba/smb.conf anfügen:

/etc/samba/smb.conf – Share-Block 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
bash – Konfiguration testen und Samba neu starten
# Syntaxprüfung – sollte "Loaded services file OK" melden
sudo testparm -s

sudo systemctl enable --now smbd
sudo systemctl restart smbd
ℹ Der Share ist absichtlich ohne Passwort (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).
Teil 2 – CUPS + virtueller Drucker
4
CUPS und cups-pdf installieren
bash
sudo apt install -y cups cups-pdf

# Eigenen Benutzer zur CUPS-Admingruppe hinzufügen
sudo usermod -a -G lpadmin $USER
⚠ Nach usermod neu anmelden oder newgrp lpadmin ausführen, damit die Gruppenmitgliedschaft aktiv wird.
5
PDF-Ausgabepfad in cups-pdf.conf setzen

Standardmäßig schreibt cups-pdf die PDFs in /var/spool/cups-pdf/${USER}. Das wird auf den Samba-Share umgebogen:

bash
# Aktuelle Out-Zeile anzeigen
grep "^Out" /etc/cups/cups-pdf.conf
/etc/cups/cups-pdf.conf – Zeile ändern
# Alt:
# Out /var/spool/cups-pdf/${USER}

# Neu:
Out /mnt/sata/smb/pdf
bash – Änderung per sed vornehmen
sudo sed -i 's|^Out .*|Out /mnt/sata/smb/pdf|' /etc/cups/cups-pdf.conf
6
CUPS für Netzwerkzugriff freischalten

CUPS lauscht standardmäßig nur auf localhost. Für den Netzwerkdrucker muss es auf allen Interfaces hören und Drucker nach außen freigeben:

bash
# 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:

/etc/cups/cupsd.conf – Zeile ergänzen (oberhalb der ersten <Location>-Sektion)
ServerAlias gmk.lan
bash
sudo systemctl restart cups
ℹ Das CUPS-Webinterface ist danach unter https://<IP-des-Servers>:631 erreichbar. Der selbstsignierte HTTPS-Zertifikat-Fehler im Browser kann ignoriert werden.
7
AppArmor-Profil für CUPS erweitern

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.

bash – Pfad ans Ende des Profils anfügen (vor der schließenden })
# 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:

bash
sudo nano /etc/apparmor.d/usr.sbin.cupsd
Einfügen vor der letzten } im Profil
  /mnt/sata/smb/pdf/ rw,
  /mnt/sata/smb/pdf/** rw,
bash – Profil neu laden
sudo systemctl restart apparmor
sudo systemctl restart cups
8
Drucker im CUPS-Webinterface hinzufügen

Im Browser https://<Server-IP>:631/admin öffnen und mit dem Linux-Benutzerkonto einloggen.

  1. Administration → Add Printer klicken
  2. In der Liste CUPS-PDF (Virtual PDF Printer) auswählen → Continue
  3. Name vergeben, z. B. Network-PDF-Printer
    Beschreibung: Virtueller PDF-Drucker
    Standort: LAN
  4. Share This Printer aktivieren → Continue
  5. Bei Make: Generic auswählen → Continue
  6. Bei Model: Generic CUPS-PDF Printer (no options) auswählen → Add Printer
  7. Standardoptionen übernehmen → Set Default Options
✓ Den Drucker direkt im Webinterface testen: Maintenance → Print Test Page. Eine PDF-Datei sollte in /mnt/sata/smb/pdf/ erscheinen.
Teil 3 – Windows-Client
9
Windows-Client verbinden

Netzlaufwerk verbinden (für den PDF-Ausgabeordner):

  1. Windows-Explorer öffnen → Dieser PC → Netzlaufwerk verbinden
  2. Pfad eingeben: \\<Server-IP>\pdf (oder \\gmk.lan\pdf)
  3. Verbindung bei Anmeldung wiederherstellen aktivieren → Fertig stellen

Netzwerkdrucker hinzufügen:

  1. Einstellungen → Bluetooth & Geräte → Drucker & Scanner → Drucker hinzufügen
  2. Der gewünschte Drucker ist nicht aufgeführt klicken
  3. Freigegebenen Drucker über seinen Namen auswählen wählen und eingeben:
    https://<Server-IP>:631/printers/Network-PDF-Printer
  4. Bei der Treiberauswahl: Generic → MS Publisher Imagesetter
    (Standard-PostScript-Treiber – funktioniert zuverlässig mit CUPS-PDF)
  5. Drucker benennen und als Standard setzen falls gewünscht
ℹ Windows findet den Drucker manchmal automatisch per mDNS/Bonjour, wenn Avahi auf dem Linux-Server läuft (sudo apt install avahi-daemon). Dann taucht er in der Druckerliste ohne manuelle URL auf.
10
Testen

Vom Windows-Client aus ein beliebiges Dokument auf den neuen Netzwerkdrucker drucken. Danach:

bash – auf dem Linux-Server prüfen
# 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.

Fehlersuche
!
Troubleshooting
ProblemLö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.
bash – alle relevanten Logs auf einmal
sudo journalctl -u cups -u smbd --since "10 min ago" -f