Могу ли я отправлять задания на печать непосредственно из программы Python на IP-адрес сервера печати CUPS? - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть два компьютера linux с фиксированными IP-адресами:

  1. Сервер печати, на котором подключенный принтер используется совместно через CUPS .
    (Сервер имеет IPадрес «192.168.1.2», а принтер называется «test_printer».)
  2. Компьютер, на котором запущено приложение python, который должен иметь возможность использовать этот сервер печати. ​​

К сожалению, распространение принтера через CUPS, кажется, не работает надежно (возможно, из-за структуры сети).

Могу ли я отправлять задания печати непосредственно из программы python на сервер печати CUPS?
Если да, не могли бы вы привести небольшой пример?

Теоретически, я бы просто отправил правильно отформатированные данные на IP-адрес + порт, но я не получил его на работу...


Вот подходы, которые я нашел до сих пор, и мои проблемы с ними:

  • command 'lpr'

    import subprocess
    
    lpr = subprocess.Popen("usr/bin/lpr", stdin=subprocess.PIPE)        # on some distros the command is 'lp'
    lpr.stdin.write("hello world\n")
    lpr.stdin.close()
    

    Полагается на распространение принтера через CUPS.


  • Python Module Pycups

    import cups
    
    with open("/home/user/Documents/some.txt", "w") as f:
        f.write("hello world\n")
    
    conn = cups.Connection()
    conn.printFile("test_printer", "/home/user/Documents/some.txt", "some_title", {})
    

    Прежде чем я смогу использовать принтер, я должен сначала добавить его, что, в свою очередь, зависит от распространения через CUPS.
    Также я не получил conn.addPrinter() для работы.


  • модуль python python-escpos / python-printer-escpos

    import escpos.printer
    
    p = escpos.printer.Network("192.168.1.2", port=631)        # port 9100 seems not to work.
    p.text("hello world\n")
    p.close()
    

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

    # The traceback was produced in the interactive shell.
    Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
        File "/home/user/.local/lib/python3.6/site-package/escpos/printer.py", line 214, in close
            self.device.shutdown(socket.SHUT_RDWR)
    OSError: [Errno 107] Transport endpoint is not connected
    



Я использую Python 3.6.7.
Сервер печати использует CUPS 2.2.1.

1 Ответ

0 голосов
/ 14 февраля 2019

Не будучи программистом Python, я не могу предоставить пример кода.

Но я могу дать вам несколько других советов:

  1. Ваше предположение, что «теоретически, [....] просто отправляйте правильно отформатированные данные на IP-адрес + порт» неверно.

    Если вы отправляете что-то, вы должны «поговорить по IPP» с сервером CUPS(да, через IP-адрес + порт 631).Но просто отправить файл намного меньше, чем говорить IPP.

    Иначе, вы можете использовать 'netcat IPaddress port-no < filename' для печати в любую очередь CUPS (что может быть серьезной проблемой безопасности).

    Таким образом, вы ДОЛЖНЫ использовать некоторые IPP-способной библиотеки, если вы хотите интегрировать вашу программу с IPP / CUPS

  2. Одной из альтернатив может быть то, что вы позволите вашей программе выполнить «IPP talk to CUPS» с помощью инструмента CLI, который способен

    Взгляните на ippsample код Рабочей группы по принтерам (PWG), которая разработала IPP.То есть в "бета" все еще, но уже полностью пригодныйВсе его двоичные файлы являются утилитами командной строки (CLI):

    • Предоставляет вспомогательный инструмент ippfind.Если вы запустите его без каких-либо параметров, он распечатает список доступных сервисов IPP (серверы печати и / или принтеры), напечатав их соответствующие URI IPP.

    • Он предоставляет ippserver командная строка, которая может запустить полноценный, как вы уже догадались, IPP-сервер, предоставляющий любую функцию, которую вы хотите.

    • Затем в качестве клиента IPP включается ipptool.Вы можете запустить 'ipptool -f myprintfile -t -v ipp://cupsserver/printers/test_printer print-job.test' для отправки "myprintfile" в очередь "test_printer" на "cupsserver" (приведено на примере IPPURI ipp: // cupsserver / printers / test_printer ) и смотреть, как он говорит IPP с CUPS, пока он это делает.

См. Также мойASCIIcast "[TUTORIAL] Пример программного обеспечения IPP (сделан с AppImage)" здесь .{https://asciinema.org/a/155588}. Подсказка: если он воспроизводится слишком быстро, чтобы следить за экранами и вовремя понимать их, используйте кнопку «пауза», читайте со своей скоростью, затем возобновите воспроизведение.

...