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

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

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

  • У нас есть несколько сетевых принтеров, для которого IPс статичный и известный (т.е. 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, передав текстовый файл в ответ на некоторые этот пост предлагаю. Это решение не работает, как ожидалось. При беге 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 вложение строки для электронной почты), но это не обязательно.

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

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

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




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

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

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

Метод: JavaScript / AJAX

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


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

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

  • С помощью IPP (согласно @Dezza: Dezza)
  • С помощью PrintNode (согласно @odedta: odedta)

16

Решение

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

$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-функции 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

Другие решения

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

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

Скачать PDFtoPrinter

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

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

По вопросам рекламы [email protected]