22 votes

Impossible d'imprimer sur un autre bac à papier via IPP

J'essaie d'imprimer un document sur le deuxième bac à papier avec IPP (Internet Printing Protocol). J'utilise ce npm IPP-Bibliothèque .

Mais à chaque fois que j'essaie d'imprimer un document, l'imprimante affiche un message indiquant que je dois ajouter du papier dans le premier bac à papier et la sortie de la console dit Printed: successful-ok .

var ipp = require("ipp");
var PDFDocument = require("pdfkit");
var concat = require("concat-stream");

var doc = new PDFDocument;
doc.text("Hello World");

doc.pipe(concat(function (data) {
    var printer = ipp.Printer("MY_URL");

    var file = {
        "operation-attributes-tag": {
            "requesting-user-name": "admin",
            'attributes-charset': 'utf-8',
            'attributes-natural-language': 'de'
        },
        "printer-attributes": {
            "media-col": {
                "media-source": "tray-2"
            },
        },
        data: data
    };
    printer.execute("Print-Job", file, function (err, res) {
        console.log("Printed: " + res.statusCode);
    });
}));

doc.end();

L'autre variante que j'ai essayée est la suivante (à partir de aquí ):

var PDFDocument = require("pdfkit");
let fs = require('fs')
var ipp = require('ipp');
var uri = "http://10.1.205.71";

var msg = new Buffer(
  '0200'+ //Version
  '000201e6d5f2'+
  '01'+ //Operation attributes tag (your information in the Operation attributes might be different)
    '47'+ //charset tag
    '0012'+ //length
    '617474726962757465732d63686172736574'+ //attributes-charset
    '0005'+ //length
    '7574662d38'+ //utf-8
    '48'+ //natural language tag
    '001b'+ //length
    '617474726962757465732d6e61747572616c2d6c616e6775616765'+//attributes-natural-language
    '0002'+//length
    '656e'+ //en
    '45'+ // URI tag
    '000b'+ //length
    '7072696e7465722d757269'+ //printer-uri
    '0012'+//length
    '687474703a2f2f31302e312e3230352e3731'+//http://10.1.205.71
    '49'+ //mimeMediaType tag
    '000f'+ //length
    '646f63756d656e742d666f726d6174'+ //document format
    '000f'+ //length
    '6170706c69636174696f6e2f706466'+ //application/pdf
  '02'+ //job attributes tag
    '34'+ //begin collection
      '0009'+ //length
      '6d656469612d636f6c'+ //media-col
      '0000'+ //value length
      '4a'+ //collection entry
      '0000'+ //name length
      '000c'+ //value length
      '6d656469612d736f75726365'+ //media-source
      '44'+ // collection entry
      '0000'+ //name length
      '0006'+ //value length
      '747261792d32'+ //tray-2
    '37'+ //end of collection
    '00000000'+ //name length and value length
  '03', 'hex');

var doc = new PDFDocument;
doc.text("Hello World");

var buffers = [];
doc.on('data', buffers.push.bind(buffers));
doc.on('end', function(){
  var buf = Buffer.concat(buffers);
  var catBuf = Buffer.concat([msg, buf]);
  ipp.request(uri, catBuf, function(err, res){
    if(err){
      return console.log(err);
    }
    console.log(JSON.stringify(res,null,2));
  });
});
doc.end();

Mais ensuite j'ai eu ce message d'erreur :

{ 
Error
    at new IppResponseError (/Users/alex/dev/print/printing/node_modules/ipp/lib/request.js:72:17)
    at ClientRequest.<anonymous> (/Users/alex/dev/print/printing/node_modules/ipp/lib/request.js:40:8)
    at Object.onceWrapper (events.js:293:19)
    at emitOne (events.js:96:13)
    at ClientRequest.emit (events.js:191:7)
    at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:522:21)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:99:23)
    at Socket.socketOnData (_http_client.js:411:20)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:191:7)
  name: 'IppResponseError',
  statusCode: 400,
  message: 'Received unexpected response status 400 from the printer',
  stack: 'Error\n    at new IppResponseError (/Users/alex/dev/print/printing/node_modules/ipp/lib/request.js:72:17)\n    at ClientRequest.<anonymous> (/Users/alex/dev/print/printing/node_modules/ipp/lib/request.js:40:8)\n    at Object.onceWrapper (events.js:293:19)\n    at emitOne (events.js:96:13)\n    at ClientRequest.emit (events.js:191:7)\n    at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:522:21)\n    at HTTPParser.parserOnHeadersComplete (_http_common.js:99:23)\n    at Socket.socketOnData (_http_client.js:411:20)\n    at emitOne (events.js:96:13)\n    at Socket.emit (events.js:191:7)' }
400 'response'

Mon imprimante ne supporte pas l'IPP, mais je l'ai partagée sur mon Macbook, qui fournit un service IPP pour toutes les imprimantes partagées. Si j'utilise le premier bac à papier et qu'il y a du papier dedans, tout va bien, mais pour mon projet, il est nécessaire d'imprimer sur d'autres bacs également.

La liste d'attributs renvoyée par Get-Printer-Attributes liste parmi les autres bacs le deuxième papier comme supporté media-source mais uniquement le premier bac à papier fonctionne.

Quelqu'un a-t-il une idée pour réussir à imprimer sur un autre bac à papier ?

Mise à jour : J'ai également essayé une autre imprimante, mais j'ai obtenu la même erreur.

Mise à jour 22.06.17 : C'est toujours confus et je n'ai aucune idée de la façon de résoudre ce problème.

4voto

Patrick Roberts Points 405

Il semble que cette demande de retrait pourrait être en mesure de résoudre le problème que vous rencontrez. En attendant que l'auteur de ipp fusionne la demande de retrait, vous pouvez mettre à jour votre paquetage npm pour pointer vers ce patch en exécutant la commande suivante dans le répertoire de votre projet :

npm i --save ipp@github:jaymcaliley/ipp

0voto

Tal Avissar Points 1135

La réponse à la demande que vous envoyez est un code d'état 400 pour la demande qui a été envoyée à l'imprimante.

Vous pouvez le voir ici sur la ligne 30 .

Cela peut être dû à une configuration de pare-feu ou à un mauvais paramétrage du réseau.

Vous devez spécifier correctement l'URL de l'imprimante comme dans cet exemple et vérifier si cette URL est valide et si l'imprimante y répond :

  var printer = ipp.Printer("http://NPI977E4E.local.:631/ipp/printer");

0voto

Batajus Points 1200

Ça fait un moment que je n'ai pas demandé d'aide. Merci à tous pour leur contribution =)

J'ai essayé toutes les solutions suggérées ici et sur Github, mais aucune d'entre elles n'a fonctionné, mais j'ai trouvé une solution pour résoudre mon problème.

var ipp = require("ipp");
var PDFDocument = require("pdfkit");
var concat = require("concat-stream");

var doc = new PDFDocument;
doc.text("Hello World");

doc.pipe(concat(function (data) {
    var printer = ipp.Printer("MY_URL");

    var file = {
        "operation-attributes-tag": {
            "requesting-user-name": "admin",
            'attributes-charset': 'utf-8',
            'attributes-natural-language': 'de'
        },
        "printer-attributes": {
            // OLD WAY WHICH DOES NOT WORK
            //"media-col": {
            //    "media-source": "tray-2"
            //},
        },
        // SOLUTION 
        "job-attributes-tag":{
            "media":  ["tray-2"]
        },
        data: data
    };

    printer.execute("Print-Job", file, function (err, res) {
        console.log("Printed: " + res.statusCode);
    });

}));

doc.end();

J'ai essayé ça, parce que aquí (4.2.11) est media décrit avec :

Les valeurs pour "média" incluent moi les plateaux et les formulaires électroniques, de sorte qu'un seul attribut spécifie le support.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X