Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

Copies ignored when printing from Chromium with duplex (splix PPD lacks *Collate; CUPS chain passes NumCopies correctly)

Fermée Adaptée aux débutants
#33 9 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
76/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
cpp
Domaine
devtools

Piste de recherche

Commencez dans src/rastertoqpdl.cpp et include/request.h pour suivre comment la valeur du nombre de copies de CUPS arrive dans Request, puis lisez src/printer.cpp, où l’en-tête du travail PJL est émis. Ajoutez le nombre de copies demandé à l’en-tête du travail lorsqu’il est supérieur à un, et confirmez qu’un travail de deux copies inclut @PJL SET COPIES=2, tandis qu’un travail d’une copie reste inchangé.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Summary

rastertoqpdl silently drops the number of copies requested by the application: every job prints exactly one copy, no matter what "copies" value is passed through CUPS. This is most visible when printing from a browser (Chromium/Edge: duplex + N copies → only one sheet comes out), but it affects every client that requests copies through the CUPS job options, including plain lp -n 2.

Root cause
  • src/rastertoqpdl.cpp reads the copies count from the CUPS filter argv[4] and stores it in the Request object (Request::_copiesNr, set in loadRequest()).
  • But _copiesNr / copiesNr() is never read anywhere afterwards.
  • The copy count that actually ends up in the QPDL page header (src/qpdl.cpp: header[0x2..0x3] = page->copiesNr()) is taken from the CUPS raster page header (src/document.cpp: page->setCopiesNr(header.NumCopies)), which raster producers leave at 1.

Net effect: the requested copies count is discarded.

How to reproduce
lp -n 2 -d <splix-driven-queue>   # a one-page job prints exactly one copy

Observed on a Samsung ML-2160 (USB), splix 2.0.2, CUPS 2.4.16, Ubuntu 26.10.

Suggested fix

Let the printer engine duplicate the job: emit @PJL SET COPIES=N in the PJL job header when N > 1. Engine-side duplication keeps per-copy duplex collation correct, whereas duplicating page data inside the QPDL stream would break collation for duplex jobs.

The following patch against 2.0.2 was built and verified on an ML-2160: after applying it, a 2-copy job stream contains @PJL SET COPIES=2, while 1-copy jobs are untouched.

--- splix-pristine/include/request.h
+++ splix-patched/include/request.h
@@ -110,6 +110,10 @@
           */ 
         Duplex                  duplex() const {return _duplex;}
         /**
+          * @return the number of copies requested for this job.
+          */
+        unsigned long           copiesNr() const {return _copiesNr;}
+        /**
           * @return TRUE if it's a reversed duplex. Otherwise it returns FALSE.
           */
         bool                    reverseDuplex() const {return _reverseDuplex;}
--- splix-pristine/src/printer.cpp
+++ splix-patched/src/printer.cpp
@@ -272,6 +272,11 @@
             break;
     }
  
+    // Honor the number of copies requested by the application (CUPS argv[4]):
+    // the engine duplicates the job, which keeps duplex collation correct.
+    if (request.copiesNr() > 1)
+        printf("@PJL SET COPIES=%lu\n", request.copiesNr());
+
     // Set some job options
     if (request.ppd()->get("MediaType").isNull())
         printf("@PJL SET PAPERTYPE=OFF\n");

Happy to prepare a proper PR if that helps.

Langage dominant
C++
Étoiles
54
Forks
20
Métriques de merge des PR
Aucune PR mergée en 30 j

Préparer son environnement

Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de OpenPrinting/splix

Toutes les issues de OpenPrinting/splix

Issues similaires

Plus d'issues C++

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.