2017-09-21 1 views
1

J'essaie d'exécuter une commande LPR pour imprimer un fichier PDF. Le code que j'utilise est en cours d'exécution à partir d'un clic sur un bouton dans une application Windows Forms.C# - Commande LPR pour imprimer des fichiers PDF

code:

var command = @"lpr –S 192.168.1.245 –P DAILY C:\Test.pdf"; 
ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd", "/c " + command); 
procStartInfo.RedirectStandardOutput = true; 
procStartInfo.UseShellExecute = false; 
procStartInfo.RedirectStandardError = true; 
procStartInfo.CreateNoWindow = true; 

// start process 
Process proc = new Process(); 
proc.StartInfo = procStartInfo; 
proc.Start(); 

proc.WaitForExit(); 

// read process output 
string cmdError = proc.StandardError.ReadToEnd(); 
string cmdOutput = proc.StandardOutput.ReadToEnd(); 

Le programme est en cours d'exécution en tant que programme x64, il peut trouver dans le programme lpr dossier C: \ Windows \ System32.

Lorsque le code exécute la chaîne d'erreur est vide et la chaîne de sortie contient les éléments suivants (même résultat que si l'exécution de la commande a été lpr /?)

sortie:

envoie un travail d'impression à une imprimante réseau

Utilisation: [-J travail] lpr -S imprimante -P serveur [classe C] [option -o] [-x] [-d] nom

Options: Nom du serveur -S ou ipaddress de l'hôte fournissant un service lpd -P imprimante Nom de la file d'attente d'impression classe C classification d'emploi pour une utilisation sur la page de garde -J travail Nom du travail à imprimer sur la page de garde option -o Indique le type du fichier (par défaut suppose un fichier texte) Compatibilité avec -x 4.1.x SunOS et avant -d Envoyer un fichier de données premier

Si je copier et coller la commande exactement comme apparaît dans le code et le colle dans une fenêtre de commande, même si c'est la même fenêtre de commande que l'application ouverte, cela fonctionne très bien.

Quelqu'un a-t-il un aperçu de la raison pour laquelle cela se produirait? Merci d'avance!

+0

Remplacer cmd par lpr et mettre le reste des paramètres dans la propriété proc.Parameters – Bestter

+0

j'ai essayé d'appeler directement au lieu de lpr par cmd, comme @Bestter suggère, mais obtenir exactement la même sortie. –

Répondre

2

J'ai été capable de le comprendre. Si elle aide quelqu'un d'autre, le code qui fonctionne est

var command = @"lpr -S 192.168.1.245 -P ""DAILY"" ""C:\Test.pdf"""; 
ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd", "/C " + command); 
procStartInfo.RedirectStandardOutput = true; 
procStartInfo.UseShellExecute = false; 
procStartInfo.RedirectStandardError = true; 
procStartInfo.CreateNoWindow = true; 

// start process 
Process proc = new Process(); 
proc.StartInfo = procStartInfo; 
proc.Start(); 

proc.WaitForExit(); 

// read process output 
string cmdError = proc.StandardError.ReadToEnd(); 
string cmdOutput = proc.StandardOutput.ReadToEnd(); 

Notez que le nom de file d'attente et nom de fichier sont entourés par des guillemets. Mon autre problème était que j'avais d'abord copié la commande à partir d'un e-mail afin que le tiret soit faux, j'ai dû supprimer et taper manuellement les tirets dans la commande pour qu'il soit reconnu. Si vous regardez vraiment dans la question d'origine, vous pouvez voir le tableau de bord est légèrement plus long. Pour plus d'informations sur la disponibilité de la commande lpr, en particulier si vous exécutez une application 32 bits sur une machine 64 bits, reportez-vous aux références suivantes.

Référence 1: lpr command not working from my C# program in Win 7

Référence 2: http://www.tomshardware.com/forum/240019-44-error-windows