2012-05-21 73 views
9

¿Cuál es el mejor enfoque para imprimir (un pdf existente, en mi caso) en una impresora de LAN directamente desde php? Hasta ahora no he tenido éxito en hacer que algo funcione, pero no estoy seguro de qué dirección seguir. Estoy ejecutando Apache en Windows SBS 2008, PHP 5.3.9.Impresora de impresión en red de PHP

Enfoques yo sepa hasta ahora:

  • shell_exec()
  • phpprintipp - Este parece ser el mejor enfoque para mí si pudiera conseguir que funcione
  • php_printer.dll - ninguna corriente existe dll

Parece que esta debería ser una tarea simple que tiene un enfoque ampliamente aceptado, pero hasta ahora no lo encuentro. ¡Gracias!

+2

No estoy seguro si esto es posible en su caso, pero para evitar todo tipo de problemas Al tratar de pasar del servidor web a la impresora, estamos utilizando el modo FTP de las impresoras para lograr esto. Acabamos de volcar el pdf en el asunto de ftp-spool que tiene la propia impresora, y listo (una vez que puedes convertir todo a PDF obviamente). Solo es útil si su impresora admite esto, entonces es por eso que recibe un comentario, no una respuesta;) – Nanne

+1

Use 'php_printer.dll'. ¿Qué pasa con eso? ¿Por qué no funciona para ti? No reinvente la rueda hablando directamente con impresoras IP. – Brad

+0

¿Por qué no dejas que el SO maneje la impresora? ¿Qué sucede si la secuencia de comandos está intentando presionar esa 'impresora predeterminada' y la red (o la ruta a la impresora) no está disponible? – PenguinCoder

Respuesta

3

Esta es una tuerca difícil de romper. He tenido mis propias aventuras en la impresión de Windows de Ruby y se me ocurrieron algunas soluciones potenciales que funcionan al invocar un comando externo, que en PHP-land es system() o exec() (no olvides escapeshellcmd()/escapeshellarg()) tienden a hacer esto es más fácil, especialmente en Windows). Todos ellos asumen que Windows conoce la impresora y se puede hacer referencia a ella por su nombre.

  1. Puede literalmente a redirigir el archivo a la impresora en red, por ejemplo:

    copy /b \path\to\filename.pdf > \\Printer_Machine\Printer_Queue 
    

    El interruptor /b especifica un archivo binario, pero estoy 80% seguro que no es estrictamente ahora, en 2012.

  2. Usted puede intentar el comando print:

    print /d:\\Printer_Machine\Printer_Queue \path\to\filename.pdf 
    

    \d significa "dispositivo". Realmente no he probado este y no estoy seguro de si funciona con PDF o solo, debido a sus orígenes DOS, archivos de texto.

  3. instalar Adobe Reader y usar sus instalaciones de línea de comandos:

    AcroRd32.exe /t \path\to\filename.pdf "Printer Name" "Driver Name" "Port Name" 
    

    No estoy seguro de si su entorno de servidor puede acomodar lector, pero esta es la solución que he tenido más éxito con. Puede encontrar documentation here (PDF, página 24). Printer Name y Driver Name debe coincidir exactamente con lo que ve en las propiedades de la impresora en el Panel de control. Port_Name generalmente se puede omitir, creo.

  4. Imprimir utilizando Ghostscript. Nunca he intentado esto en Windows pero el documentation is here y hay more info here.El comando es algo como esto:

    gswin32.exe -sDEVICE=mswinpr2 -sOutputFile="%printer%Printer Name" \path\to\filename.pdf 
    

    mswinpr2 se refiere a los controladores de impresión propias de Windows' (ver el segundo enlace de arriba), '%printer%' es literal y necesaria y 'Printer Name' debe, de nuevo, que coincida con el nombre de la impresora desde el Panel de control exactamente. Ghostscript tiene muchas, muchas opciones y es probable que tenga que pasar algún tiempo configurándolas.

Por último, un consejo general: Puede registrar una impresora de red con un nombre de dispositivo con el net use de comandos, por ejemplo:

C:\> net use LPT2 \\Printer_Machine\Printer_Queue /persistent:yes 

Este debe permitirá utilizar LPT2 o LPT2: en lugar de \\Printer_... con la mayoría de los comandos.

¡Espero que sea útil!

+0

Gracias por la respuesta. La opción 1 (copiar) hizo que la impresora imprimiera, pero solo una hoja decía "1 archivo (s) copiado". y no imprimió mi pdf. Con la opción 2 (imprimir) siempre obtengo una "impresora que no puede inicializar el dispositivo". Con la opción 3 (Adobe Reader) pude imprimir correctamente desde el símbolo del sistema en el servidor, pero no obtengo nada cuando corro desde PHP. Hice eco de la línea que estoy pasando al ejecutivo, y coincide exactamente con lo que ingresé manualmente, pero no ocurre nada. ¿Alguna idea sobre eso? – Tim

+0

Supongo que es un problema de ruta, ya sea al archivo PDF o al ejecutable; ¿Cuál fue el resultado de AcroRd32.exe cuando lo ejecutó con 'exec()'? –

+0

Tim, ¿enviaste un 'control + z' (EOF) a tu impresora después de la copia? – Brad

1

No estoy seguro si esto funciona para todas las impresoras, pero esto hace el trabajo de enviar archivos ZPL a una impresora de etiquetas Zebra:

<?php 
if(($conn = fsockopen('192.168.10.112',9100,$errno,$errstr))===false){ 
    echo 'Connection Failed' . $errno . $errstr; 
} 

$data = <<<HERE 
    ^XA 
    ^FT50,200 
    ^A0N,200,200^FDTEST^FS 
    ^FT50,500 
    ^A0N,200,200^FDZebra Printer^FS 
    ^XZ 
HERE; 

#send request 
$fput = fputs($conn, $data, strlen($data)); 

#close the connection 
fclose($conn); 
?> 
Cuestiones relacionadas