Set *DefaultBRColorMode: None in the vendor PPD so every job sends <</UseCIEColor false>>: Brother's Normal/Vivid modes enable the printer's own CIE conversion, which washed the colours out. Add six APPrinterPreset entries mapping print-color-mode and print-quality from driverless (AirPrint/IPP) clients onto the Brother device options; they use the notation CUPS generates itself (Apple metadata as 'key value' pairs, PPD options as '*Name Value'), because key=value strings are silently discarded. print-quality is 3/4/5. Add the PRINTER_OPTIONS env var: whitespace-separated key=value pairs applied as queue defaults on every start via lpadmin -o, validated against the queue's PPD, with warnings instead of a failed startup. Document all of it in the README. The VividNoCIE candidate was dropped after test prints showed no difference from None. Archive the OpenSpec change and sync the printserver/cups spec with the two new requirements.
This commit is contained in:
1 parent
75b68fe438
commit
30670de93b
9 files changed
+319
-33
No files matched your search
File renamed without changes.
+28
-7
@@ -85,6 +85,30 @@ geschickt hat – clientseitige Auswahl gewinnt also weiterhin
|
||||
(`ppd-mark.c`: „as long as the corresponding names are not already defined
|
||||
in the IPP request").
|
||||
|
||||
**Preset-Notation (2026-10-20 empirisch geklärt).** Die Preset-Werte müssen so
|
||||
geschrieben werden, wie CUPS sie selbst erzeugt (`ppd-cache.c`, Funktion
|
||||
`cupsFilePrintf fp "*APPrinterPreset %s: \""`): eine mehrzeilige Zeichenkette,
|
||||
in der Apple-Metadaten als `key value`-**Paare ohne `=`** und PPD-Optionen als
|
||||
`*Name Value`-Paare stehen, jeweils durch Leerzeichen getrennt:
|
||||
|
||||
```
|
||||
*APPrinterPreset MonoNormal/B&W, Normal: "
|
||||
com.apple.print.preset.output-mode monochrome
|
||||
com.apple.print.preset.quality normal
|
||||
*BRPrintQuality Black
|
||||
*TonerSaveMode False
|
||||
"
|
||||
```
|
||||
|
||||
`_ppdCacheCreateWithPPD()` parst den Wert mit `_ppdParseOptions()`, das an
|
||||
Whitespace trennt – `key=value` in einer Zeile würde den *Namen*
|
||||
`key=value` ergeben und der Lookup (`cupsGetOption("com.apple.print.preset.
|
||||
quality", …)`) schlüge fehl. CUPS verwirft das Preset dann **stillschweigend**
|
||||
(`num_presets[…]=0`), was im Test zunächst genau passierte. Verifiziert mit
|
||||
einem libcups-2.4.2-Harness (`_ppd_cache_t` inspiziert) und im
|
||||
`pstops`-Filterpfad. Zusätzlich: IPP-`print-quality` ist **3/4/5**
|
||||
(Draft/Normal/High), nicht 2/5.
|
||||
|
||||
**2. PPD direkt im Repository ändern (nicht zur Build-Zeit patchen).**
|
||||
|
||||
Die Asset-Datei `assets/Brother HL-4150CDN/ppd/BR4150_2.PPD` wird bereits
|
||||
@@ -112,13 +136,12 @@ damit gilt es auch für eine persistente Queue. Fehler pro Token abfangen
|
||||
(`|| log warning`), da `set -eu` sonst den Start abbricht; unbekannte Namen
|
||||
werden verworfen, ohne die übrigen zu blockieren.
|
||||
|
||||
**5. Neue `BRColorMode`-Choice `VividNoCIE` nur unter Vorbehalt.**
|
||||
**5. Neue `BRColorMode`-Choice `VividNoCIE` verworfen.**
|
||||
|
||||
`<</UseCIEColor false /BRColorMode 1>>` – Kombi, die es bisher nicht gibt
|
||||
(`None` lässt `/BRColorMode` unangetastet, `Vivid` erzwingt CIE). Wird als
|
||||
Testdruck gegen `None` verglichen; nur übernommen, wenn der Ausdruck
|
||||
deutlich besser ist. Spezifikation hängt nicht davon ab (Default bleibt
|
||||
`None`, Überschreibung ist ohnehin möglich).
|
||||
(`None` lässt `/BRColorMode` unangetastet, `Vivid` erzwingt CIE). Als
|
||||
Testdruck gegen `None` verglichen (2026-10-20): **nicht unterscheidbar**,
|
||||
daher nicht übernommen. `None` bleibt der einzige geänderte Default.
|
||||
|
||||
## Risks / Trade-offs
|
||||
|
||||
@@ -151,8 +174,6 @@ deutlich besser ist. Spezifikation hängt nicht davon ab (Default bleibt
|
||||
|
||||
## Open Questions
|
||||
|
||||
- Ob `VividNoCIE` mehr Sättigung liefert als `None` – wird im Tasks-Test
|
||||
entschieden; ändert weder Spec (Default bleibt `None`) noch Aufbau.
|
||||
- Ob macOS/iOS den Qualitätsregler als `print-quality` sendet – falls nicht,
|
||||
bleiben die `print-quality`-Presets inert, `print-color-mode`-Presets
|
||||
wirken unabhängig davon (Server-seitig per `lp -o print-quality=…`
|
||||
+4
-4
@@ -41,16 +41,16 @@ Drucker-Queue):
|
||||
Start als Queue-Defaults gesetzt werden – damit überleben
|
||||
PPD-Optionen (z. B. `BRMediaType`, `TonerSaveMode`, `BRColorMode=Vivid`)
|
||||
die Neuerzeugung der Queue.
|
||||
- **Optionale neue PPD-Choice `BRColorMode=VividNoCIE`**
|
||||
(`<</UseCIEColor false /BRColorMode 1>>`) als Testkandidat für noch
|
||||
gesättigtere Ausgabe als `None`; nur behalten, wenn der Testdruck
|
||||
besser ist als `None`.
|
||||
- **README**: neuer Abschnitt, warum der AirPrint-Dialog nur
|
||||
IPP-Standardoptionen zeigt und wie PPD-Optionen gesetzt werden (Env-Var,
|
||||
CUPS-Web-UI, `lp`); Troubleshooting „Farben sind blass" mit der
|
||||
durchgeführten Testreihe; Dokumentation der funktionierenden
|
||||
S/W-Abbildung.
|
||||
|
||||
Verworfen: eine zusätzliche Choice `BRColorMode=VividNoCIE`
|
||||
(`UseCIEColor false` + `/BRColorMode 1`) – die Testdrucke waren von `None`
|
||||
nicht unterscheidbar, siehe `design.md`.
|
||||
|
||||
Kein Bestandteil: Änderungen am Containerfile (die PPD wird bereits
|
||||
installiert), am Verbindungs-/Zertifikatsverhalten oder eine
|
||||
Server-seitige Erzwingung von Graustufen über `pdftops-renderer=gs`
|
||||
File renamed without changes.
+43
-20
@@ -2,29 +2,35 @@
|
||||
|
||||
## 1. PPD: Farbmodus-Default, Presets und Dokumentation
|
||||
|
||||
- [ ] 1.1 `assets/Brother HL-4150CDN/ppd/BR4150_2.PPD`: `*DefaultBRColorMode`
|
||||
- [x] 1.1 `assets/Brother HL-4150CDN/ppd/BR4150_2.PPD`: `*DefaultBRColorMode`
|
||||
von `Normal` auf `None` ändern, alle eigenen Ergänzungen mit
|
||||
`%`-Kommentar (Herkunft/Zweck) markieren.
|
||||
Verifikation: `grep -n 'DefaultBRColorMode\|^% Modified' "assets/Brother HL-4150CDN/ppd/BR4150_2.PPD"`
|
||||
zeigt `*DefaultBRColorMode: None` und den Kommentar.
|
||||
- [ ] 1.2 PPD: sechs `APPrinterPreset`-Einträge ergänzen (Kombinationen
|
||||
color/monochrome × low/normal/high gemäß Tabelle in `design.md`,
|
||||
z. B. `*APPrinterPreset MonoNormal/Schwarz-Weiß Normal:
|
||||
"*com.apple.print.preset.output-mode=monochrome
|
||||
*com.apple.print.preset.quality=normal *BRPrintQuality=Black
|
||||
*TonerSaveMode=False"`).
|
||||
- [x] 1.2 PPD: sechs `APPrinterPreset`-Einträge ergänzen (Kombinationen
|
||||
color/monochrome × low/normal/high gemäß Tabelle in `design.md`).
|
||||
Verifikation: `grep -c '^\*APPrinterPreset' "assets/Brother HL-4150CDN/ppd/BR4150_2.PPD"`
|
||||
ergibt 6, und nach einem Build listet
|
||||
`lpoptions -p <queue> -l` weiterhin alle Optionen ohne
|
||||
PPD-Warnung in `/var/log/cups/error_log`.
|
||||
- [ ] 1.3 PPD: Choice `VividNoCIE` unter `BRColorMode` ergänzen
|
||||
Ergebnis (2026-10-20): Zunächst als einzeilige `key=value`-Strings
|
||||
geschrieben – CUPS verwarf alle sechs stillschweigend
|
||||
(`_ppdParseOptions()` trennt an Whitespace, `key=value` wurde zum
|
||||
*Namen*). Mit libcups-2.4.2-Harness (`_ppd_cache_t`-Inspektion) belegt
|
||||
und auf das von CUPS selbst erzeugte Format umgestellt (mehrzeilig,
|
||||
Apple-Metadaten als `key value`, PPD-Optionen als `*Name Value`).
|
||||
Danach greifen alle sechs im `pstops`-Pfad (siehe 3.x).
|
||||
- [x] 1.3 PPD: Choice `VividNoCIE` unter `BRColorMode` ergänzen
|
||||
(`<</UseCIEColor false /BRColorMode 1>>setpagedevice`) und per
|
||||
Testdruck gegen `None` vergleichen; nur behalten, wenn der Ausdruck
|
||||
deutlich gesättigter ist.
|
||||
Verifikation: `lpoptions -p <queue> -l` zeigt die Choice, die
|
||||
Entscheidung (behalten/entfernen) ist im README-Auswertungs-Abschnitt
|
||||
notiert.
|
||||
- [ ] 1.4 README: Abschnitt „Farben sind blass" (Ursache `UseCIEColor`,
|
||||
Ergebnis (2026-10-20): Testdrucke `BRColorMode=VividNoCIE` (Job 5) und
|
||||
`BRColorMode=None` (Job 6) sind **nicht unterscheidbar** → Choice
|
||||
wieder entfernt (README/Tabelle bereinigt).
|
||||
- [x] 1.4 README: Abschnitt „Farben sind blass" (Ursache `UseCIEColor`,
|
||||
durchgeführte Testreihe mit `lp -o BRColorMode=…`,
|
||||
Ergebnis `None`), Abschnitt „Änderungen an der Hersteller-PPD"
|
||||
(welche Einträge ergänzt wurden und warum) und Abschnitt
|
||||
@@ -35,7 +41,7 @@
|
||||
|
||||
## 2. entrypoint: `PRINTER_OPTIONS`
|
||||
|
||||
- [ ] 2.1 `entrypoint.sh`: `PRINTER_OPTIONS` (Standard leer) nach der
|
||||
- [x] 2.1 `entrypoint.sh`: `PRINTER_OPTIONS` (Standard leer) nach der
|
||||
Queue-Erzeugung in Tokens `key=value` zerlegen und jedes per
|
||||
`lpadmin -o` setzen, an derselben Stelle wie
|
||||
`printer-is-shared`/`-D`/`-d`, bei jedem Start.
|
||||
@@ -43,12 +49,12 @@
|
||||
`PRINTER_OPTIONS="BRColorMode=Vivid TonerSaveMode=False"` und
|
||||
`lpoptions -p <queue> -l` zeigt `Vivid` und `True` als Default
|
||||
(`*Vivid`, `*True`).
|
||||
- [ ] 2.2 Fehler pro Token abfangen, damit `set -eu` den Start nicht
|
||||
- [x] 2.2 Fehler pro Token abfangen, damit `set -eu` den Start nicht
|
||||
abbricht, und warnen.
|
||||
Verifikation: Start mit `PRINTER_OPTIONS="NoSuchOption=Foo"` erzeugt
|
||||
eine Warning-Zeile im Log, der Container erreicht
|
||||
„ready: CUPS on 631/tcp" und `lpstat -r` meldet „scheduler is running".
|
||||
- [ ] 2.3 README: neue Zeile in der Env-Var-Tabelle plus Kurzbeispiel unter
|
||||
- [x] 2.3 README: neue Zeile in der Env-Var-Tabelle plus Kurzbeispiel unter
|
||||
„Environment variables" (inkl. Hinweis `lpoptions -p <queue> -l` zur
|
||||
Entdeckbarkeit der Namen).
|
||||
Verifikation: das Beispiel aus der Tabelle in einen `podman run`-Befehl
|
||||
@@ -56,21 +62,38 @@
|
||||
|
||||
## 3. Integrationstests am laufenden System
|
||||
|
||||
- [ ] 3.1 Image neu bauen und Container starten.
|
||||
- [x] 3.1 Image neu bauen und Container starten.
|
||||
Verifikation: `podman build -t printserver:latest .` endet ohne Fehler,
|
||||
das Log enthält „ready: CUPS on 631/tcp, mDNS on 5353/udp".
|
||||
- [ ] 3.2 S/W-Druck aus dem macOS-Dialog (derselbe Farbjob wie zuvor).
|
||||
Ergebnis (2026-10-20, podman 6.1.4/macOS-VM): Build und Start ok; der
|
||||
Container bindet 631 nur nach
|
||||
`podman machine ssh -- sudo sysctl -w net.ipv4.ip_unprivileged_port_start=631`
|
||||
(rootless VM) – danach „ready".
|
||||
- [x] 3.2 S/W-Druck aus dem macOS-Dialog (derselbe Farbjob wie zuvor).
|
||||
Verifikation: Ausdruck ist schwarz/weiß – vorher kam er farbig heraus.
|
||||
- [ ] 3.3 Farbdruck ohne weitere Optionen aus dem Dialog und per
|
||||
Server-seitig verifiziert (2026-10-20): `print-color-mode=monochrome`
|
||||
→ `<</BRProcessColor 1>>`. Sichtprüfung durch Nutzer (2026-10-20):
|
||||
Testseite 2 ist schwarz/weiß. **Bestanden.**
|
||||
- [x] 3.3 Farbdruck ohne weitere Optionen aus dem Dialog und per
|
||||
`lp -d <queue> test.pdf`.
|
||||
Verifikation: Ausdruck ist so gesättigt wie der bisherige
|
||||
`BRColorMode=None`-Testdruck; `lpoptions -p <queue> -l` zeigt `*None`
|
||||
als Farbmodus-Default.
|
||||
- [ ] 3.4 Qualitätsstufen prüfen.
|
||||
Verifikation: `lp -o print-quality=2 test.pdf` (draft, sichtbar
|
||||
tonersparender) und `lp -o print-quality=5 test.pdf` (high, `CAPT`
|
||||
SuperFine) erzeugen unterscheidbare Ausdrucke gegenüber
|
||||
`print-quality=3`.
|
||||
Verifiziert (2026-10-20): `lpoptions` zeigt `*None`, `pstops` emittiert
|
||||
`<</UseCIEColor false>>` auch ohne Job-Optionen. Sichtprüfung durch
|
||||
Nutzer: Testseite 1 ist kräftig/gesättigt (nicht mehr blass).
|
||||
**Bestanden.**
|
||||
- [x] 3.4 Qualitätsstufen prüfen.
|
||||
Verifikation: `lp -o print-quality=3 test.pdf` (IPP draft, sichtbar
|
||||
tonersparender: `true tonersave`) und `lp -o print-quality=5 test.pdf`
|
||||
(IPP high, `CAPT SuperFine`, `<</BRApt 2 /HWResolution [600 600]>>`)
|
||||
erzeugen unterscheidbare Ausdrucke gegenüber `print-quality=4`
|
||||
(IPP normal). Hinweis: IPP-`print-quality` ist 3/4/5 – nicht 2/5.
|
||||
Verifiziert (2026-10-20): serverseitig im `pstops`-Output (3 →
|
||||
`true tonersave`, 5 → `BRApt 2`); Sichtprüfung durch Nutzer: Seite 3
|
||||
(draft) blass/tonersparend, klar unterscheidbar von 1/4. Seite 1 = 4
|
||||
erwartungsgemäß (SuperFine vs. Fine bei diesem Testmotiv optisch
|
||||
gleich, serverseitig aber gesetzt). **Bestanden.**
|
||||
|
||||
## Workflow follow-up
|
||||
|
||||
Reference in new issue
Block a user