it-swarm.com.ru

PHP Печать на сетевой принтер

Что я пытаюсь сделать

Распечатайте документ PDF на сетевом принтере, передавая параметры печати для таких вещей, как цвет, ориентация, дуплекс и т.д.

Дополнительная информация

  • У нас есть несколько сетевых принтеров, для которых IP s являются статическими и известными _ (т.е. 192.168.0.10)
  • Я нашел документ, содержащий список параметров/опций, который можно передать на принтер для изменения параметры печатиздесь (большинство из которых может можно найти на странице 25)
  • Мы создаем процесс, посредством которого мы будем печатать документ в черно-белом режиме, КРОМЕ второй страницы. Это означает, что первая страница, а также страница 3 и далее являются напечатаны в черно-белые; стр. 2 должно быть напечатано в цвет. (Это происходит из-за стоимости цветной печати, плюс другие наши страницы не содержат цвета, поэтому печатать их в цвете ЧРЕЗВЫЧАЙНО бессмысленно и примерно в 8 раз дороже - этот процесс будет печатать тысячи страниц каждый месяц, что составляет много $$$)

Что я добился и чего добился успеха?

Я вошел в один из принтеров (192.168.0.10 - Ricoh MP C5503 [если вы действительно должны знать]) и добавил доступ по FTP
Печать документа с помощью командной строки в Windows работает!

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

Что я пытался сделать

Попытка 1 с использованием PHP-функции exec ()
Я пробовал МНОГИЕ способы заставить exec работать, но безрезультатно. Я не смог запустить многострочные команды, используя PHP-функцию exec (в идеале, запускать следующее). При запуске следующего внутри exec () я не могу подключиться к FTP, так как каждая строка должна выполняться после запуска предыдущей строки. Я ничего не нашел в Интернете (несколько поисков в Google не дают результатов [кроме как вывести несколько выходных строк из cmd, а не как последовательно вставить несколько строк cmd])

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

Попытка 2 с использованием PHP-функции exec ()
Я попытался запустить команду ftp, передав текстовый файл, как подсказывают некоторые ответы на this post. Это решение не работает, как ожидалось. При запуске ftp -i -s:test.txt из командной строки это работает; в PHP это не так.

PHP-файл

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

Текстовый файл (test.txt)

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

Попытка 3 с использованием PHP-функций FTP
Сейчас я не могу понять, как отправить файл на принтер через ftp и как настроить параметры принтера.

$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';
}

В идеале...

Я ищу решение, которое бы работало как в системах Windows, так и в Linux, поскольку мы также находимся в процессе перехода от IIS к NGINX (слава богу ...). Метод, который я считаю наилучшей реализацией, использует ftp для Windows и rcp или rsh для Linux (поскольку документация к принтеру, которую я прикрепил в разделе Дополнительная информация в разделе Что я пытаюсь сделать, упоминает эти методы для печати).

Я также хотел бы, чтобы нам не нужно было создавать текстовые файлы или файлы другого типа для печати этих документов. Наши пользователи могут обрабатывать сотни файлов одновременно, и, насколько я понимаю, мы можем однозначно назвать каждый текстовый файл, а затем удалить после успешного запуска сценария, хотя я бы предпочел чистое решение, в котором мы можем передать такие параметры, как принтер ( IP-адрес или имя из функции gethostbyaddr()), имя пользователя, пароль, файл для печати, параметры (например, цвет, дуплекс, тип файла, ориентация, привязка и т.д.). Мы используем MDPF для генерации наших PDF файлов, поэтому предпочтительнее использовать метод, который поместил бы файл без фактического создания его на нашем сервере, где нам затем пришлось бы его удалить (т.е. MPDF string вложение для электронной почты), но это не обязательно.

Дополнительно

Решение должно работать с PHP.

После публикации я продолжу исследовать другие способы печати документов на сетевых принтерах, пока не будет найдено решение viable, и буду обновлять свое сообщение соответствующим образом после каждой попытки.

Любая помощь по этому поводу очень ценится.



Правки


Неудачные методы

Метод: PHP Функции принтера

функции принтера do допускают печать, однако они не позволяют контролировать задания печати (такие параметры, как цветная/черно-белая печать, тип файла, дуплекс и т.д.). Таким образом, эта опция (если у кого-то нет «хака», работать не будет)

Метод: JavaScript/AJAX

Хотя JavaScript/AJAX будет работать для печати (и разрешать настройки печати), мы будем обрабатывать потенциально сотни страниц одновременно, и эта обработка может передавать задания на печать на несколько принтеров (то есть в разных офисах). Идея состоит в том, чтобы автоматизировать нашу печать для этого процесса и для будущих процессов.


Непроверенные методы

Методы: еще не проверено

  • Использование IPP (согласно @Dezza: Dezza )
  • Использование PrintNode (согласно @odedta: odedta )
16
ctwheels

Попробуй это:

$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';
    }
}

Дайте мне знать, что вы получите.

Update: from руководство по эксплуатации принтера на стр. 19, Вы можете использовать следующую команду для отправки файла и одновременной настройки параметров устройства:

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

В этом примере file1 - это имя локального файла, который вы хотите отправить, filetype=postscript,tray=tray1,copies=3,resolution=600 - имя удаленного файла . Точнее, фактическая команда FTP:

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

Используя PHP-функции PHP, код PHP:

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

Где $ftp - дескриптор соединения от успешного вызова ftp_connect().

Поместив это в мой первый пример, код становится:

$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';
    }
}

Попробуйте.

2
Rei

Хотя большая часть моей попытки не удалось напечатать на сетевом принтере и не может найти правильное решение. Также Shell_exec («AcroRd32.exe») и через «other pdfprinter» не работает, так как мой WAMP-сервер требует специального разрешения для программ с графическим интерфейсом. Теперь я наконец нашел решение, которое работает для меня. 

Это только для Windows, решение

Скачать PDFtoPrinter

Код для печати на сетевом/локальном принтере

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