Подтвердить что ты не робот

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

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

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

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

  • У нас есть несколько сетевых принтеров, для которых IP s статические и известные (т.е. 192.168.0.10)
  • Я нашел документ, содержащий список параметров/опций, который можно передать принтеру для изменения параметров печати здесь (большинство из них можно найти на стр. 25)
  • Мы создаем процесс, с помощью которого мы будем печатать документ в черно-белом EXCEPT на второй странице. Это означает, что первая страница, , а также страница 3 и выше напечатаны в черно-белом; страница 2 должна быть напечатана в цвете. (Это связано со стоимостью цветной печати, плюс наши другие страницы не содержат цвета, поэтому их печать в цвете EXTREMELY бессмысленна и примерно на 8 раз дороже. Этот процесс будет печатать тысячи страниц каждый месяц, что добавляет много $$$)

Что мне было &ltsomewhat &gt успешно с

Я вошел в один из принтеров (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. Это решение работает не так, как ожидалось. При запуске 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 с использованием функций FTP 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 (так как документация принтера, прикрепленная в разделе "Дополнительная информация" в разделе "Что я пытаюсь сделать", упоминает эти методы для печати).

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

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

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

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

Любая помощь в этом отношении приветствуется.

<ч/ " > <ч/" >

редактирует


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

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

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

Метод: JavaScript/AJAX

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


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

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

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

Ответ 1

Попробуйте следующее:

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

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

Обновить из руководство по принтеру на стр. 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-функции FTP, код 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';
    }
}

Попробуйте.