web-dev-qa-db-fra.com

PHP Imprimer sur une imprimante réseau

Ce que j'essaye de faire

Imprimez un document PDF sur une imprimante réseau en transmettant des paramètres d'impression pour des éléments tels que la couleur, l'orientation, le duplex, etc.

Plus d'information

  • Nous avons plusieurs imprimantes réseau, pour lesquelles les IP sont static et sont connus (c'est-à-dire 192.168.0.10)
  • J'ai trouvé un document contenant une liste de paramètres/options pouvant être transmise à l'imprimante pour modifier les paramètres d'impressionici (dont la plupart se trouvent à la page 25).
  • Nous créons un processus par lequel nous allons imprimer un document en noir et blanc SAUF la deuxième page. Cela signifie que première page, ainsi que la page 3 et au-delà sont imprimés en noir et blanc; page 2 doit être imprimé en couleur. (Cela est dû au coût de l’impression couleur et nos autres pages ne contiennent pas de couleur. Par conséquent, leur impression en couleur est EXTRÊMEMENT inutile et environ 8 fois plus chère. Ce processus imprimera des milliers de pages chaque mois, ce qui représente beaucoup de $$$)

Qu'est-ce que j'ai été & ltsomewhat & gt réussi avec

Je me suis connecté à l'une des imprimantes (192.168.0.10 - Ricoh MP C5503 [si vous devez vraiment savoir]) et ajouté un accès FTP.
Imprimer un document en utilisant la commande Invite sous Windows fonctionne!

> ftp 192.168.0.10
> User (192.168.0.10:(none)): username
> Password: password
> put path\to\file.pdf filetype=PDF
> bye

Ce que j'ai essayé de faire

Attempt 1 en utilisant la fonction exec () de PHP
J'ai essayé BEAUCOUP de façons de faire fonctionner exec, mais en vain. Je n'ai pas été en mesure d'exécuter des commandes multilignes à l'aide de la fonction exec de PHP (idéalement, exécutant les opérations suivantes). Lors de l'exécution de exec () à l'intérieur, je ne peux pas me connecter à FTP car chaque ligne doit être exécutée après l'exécution de la ligne précédente. Je n'ai rien trouvé en ligne (plusieurs recherches Google ne donnent aucun résultat [sauf comment afficher en écho plusieurs lignes de sortie de cmd et non comment insérer plusieurs lignes de commande successivement])

> ftp 192.168.0.10
> User (192.168.0.10:(none)): username
> Password: password
> put path\to\test.pdf filetype=PDF
> bye

Attempt 2 en utilisant la fonction exec () de PHP
J'ai essayé d'exécuter la commande ftp en transmettant un fichier texte comme le suggèrent certaines réponses sur this post. Cette solution ne fonctionne pas comme prévu. Lorsque vous exécutez ftp -i -s:test.txt à partir d'une invite de commande, cela fonctionne. en PHP, ce n'est pas le cas.

Fichier PHP

exec("ftp -i -s:test.txt");

Fichier texte (test.txt)

open 192.168.0.10
username
password
put test.pdf filetype=PDF
bye

Attempt 3 en utilisant les fonctions FTP de PHP
Ce que je ne peux pas comprendre maintenant, c'est comment envoyer le fichier à l’imprimante via FTP et comment définir les paramètres de l’imprimante

$ftp = [
    'server'   => gethostbyaddr('192.168.0.10'),
    'username' => 'username',
    'password' => 'password',
];
$conn = ftp_connect($ftp['server']);
$login = ftp_login($conn, $ftp['username'], $ftp['password']);
if (is_readable($file)) {
    if (ftp_put($conn, $file, $file, FTP_ASCII)) {
        echo 'Successfully executed command';
    }
    else {
        echo 'Failed execution of command';
    }
}
else {
    echo 'File is not readable';
}

Idéalement...

Je recherche une solution qui fonctionnerait à la fois sur les systèmes Windows et Linux, car nous sommes également en train de passer de IIS à NGINX (Dieu merci ...). La méthode qui, à mon avis, serait la meilleure implémentation utilise ftp pour Windows et rcp ou rsh pour Linux (puisque la documentation de l'imprimante que j'ai jointe sous Plus d'informations dans le Ce que j'essaie de faire section mentionne ces méthodes pour l’impression).

J'aimerais aussi si nous n'avions pas à générer des fichiers txt ou un autre type de fichier pour pouvoir imprimer ces documents. Nos utilisateurs peuvent traiter des centaines de fichiers à la fois, ce qui, je le comprends, nous permet de nommer chaque fichier txt, puis de les supprimer une fois le script exécuté, bien que je préfère de loin une solution propre dans laquelle nous pouvons transmettre des paramètres tels que printer ( Adresse IP ou nom de la fonction gethostbyaddr()), nom d'utilisateur, mot de passe, fichier à imprimer, options (couleur, duplex, type de fichier, orientation, reliure, etc.). Nous utilisons MDPF pour générer nos fichiers PDF. Une méthode permettant de placer le fichier sans le créer réellement sur notre serveur, où nous aurions ensuite à le supprimer, serait préférable (par exemple, MPDF string pièce jointe pour courrier électronique) mais elles ne sont pas obligatoires.

Aditionellement

La solution doit fonctionner avec PHP.

Je continuerai à étudier davantage de méthodes pour imprimer des documents sur des imprimantes réseau après l'avoir postée jusqu'à ce qu'une solution viable _ ait été trouvée et mis à jour mon envoi en conséquence après chaque tentative.

Toute aide à ce sujet est grandement appréciée.



Édite


Méthodes infructueuses

Méthode: PHP Fonctions de l'imprimante

Les fonctions printer permettent l’impression, mais elles ne permettent pas de contrôler les travaux d’impression (options telles que l’impression couleur/noir et blanc, le type de fichier, le recto verso, etc.). Ainsi, cette option (à moins que quelqu'un ait un "hack", ne fonctionnera pas)

Méthode: JavaScript/AJAX

Bien que JavaScript/AJAX fonctionne pour l’impression (et autorise les paramètres d’impression), nous traiterons potentiellement des centaines de pages à la fois et le transfert de tâches d’impression à plusieurs imprimantes (par exemple, dans différents bureaux). L'idée est d'automatiser notre impression pour ce processus et pour les processus futurs.


Méthodes non testées

Méthodes: pas encore testé

16
ctwheels

Essaye ça:

$ftp = ftp_connect('192.168.0.10');
if(ftp_login($ftp,'username','password')){
    if(ftp_put($ftp,'filetype=PDF','yourfile.pdf',FTP_BINARY)){
        echo 'success';
    }
}

Faites-moi savoir ce que vous obtenez.

Mise à jour: depuis manuel de l'imprimante à la page 19, Vous pouvez utiliser la commande suivante pour envoyer un fichier et définir les options du périphérique en même temps:

ftp> put file1 filetype=postscript,tray=tray1,copies=3,resolution=600

Dans cet exemple, file1 est le nom du fichier local que vous souhaitez envoyer, filetype=postscript,tray=tray1,copies=3,resolution=600 est le nom du fichier distant . Pour être précis, la commande FTP réelle est la suivante:

STOR filetype=postscript,tray=tray1,copies=3,resolution=600

En utilisant les fonctions FTP de PHP, le code PHP est:

ftp_put($ftp,'filetype=postscript,tray=tray1,copies=3,resolution=600','file1',FTP_BINARY);

$ftp est le descripteur de connexion d'un appel réussi à ftp_connect().

Pour reprendre mon premier exemple, le code devient:

$ftp = ftp_connect('192.168.0.10');
if(ftp_login($ftp,'username','password')){
    if(ftp_put($ftp,'filetype=postscript,tray=tray1,copies=3,resolution=600','file1',FTP_BINARY)){
        echo 'success';
    }
}

Essaie.

2
Rei

Bien qu'une bonne partie de mon essai n'ait pas réussi à imprimer sur une imprimante réseau et ne puisse pas trouver la solution appropriée. De plus, Shell_exec ("AcroRd32.exe") et via "other pdfprinter" ne fonctionne pas car mon serveur WAMP nécessite une autorisation spéciale pour les programmes à interface graphique. Maintenant, j'ai enfin trouvé une solution qui fonctionne pour moi. 

Ceci est pour la solution Windows uniquement

Télécharger PDFtoPrinter

Code à imprimer sur une imprimante réseau/locale

$command = escapeshellcmd('PDFtoPrinter YOURFILE.PDF "\\\YOURSERVERNAME\YOURPRINTERNAME"');
$output = Shell_exec($command);
echo $output;
0
Bhadresh