Печат чрез IPP без драйвери (IPP клиент)

Имам устройство/уред, за което не можете да инсталирате драйвери. Бих искал да добавя възможност за поддръжка на мрежови/IPP/AirPrint принтери, като накарам потребителя да добави IP адресите.

Тъй като не печатам през Windows (което би използвало IPP), как да използвам IPP сам? Има ли C# клиент (или някаква библиотека на Windows), който ви позволява да взаимодействате с IPP принтери с IPP протокола?


person Paul Knopf    schedule 07.10.2013    source източник
comment
Търся същото. Разбрах основата на UPnP печатането, но разглеждането на IPP/AirPrint с малък успех досега. Моля, актуализирайте публикацията си, ако постигнете някакъв напредък.   -  person earthling    schedule 21.10.2013
comment
Ще го направя. В мрежата няма буквално НИЩО. Apple е изключително затворен относно действителния мрежов договор между принтер/устройство. Не мога да намеря нищо в IPP. Четох някъде, че AirPrint е разширение на IPP, така че ако можем да разберем IPP, тогава трябва да сме златни.   -  person Paul Knopf    schedule 22.10.2013
comment
Уведомете ме, ако намерите нещо.   -  person Paul Knopf    schedule 22.10.2013
comment
Намерихте ли нещо по въпроса?   -  person user319862    schedule 04.01.2014


Отговори (2)


Има няколко реализации на IPP клиент и IPP библиотеки, налични за различни езици за програмиране (java/php/python). Практично решение може да бъде използването на ipptool, наличен на http://cups.org/software.php . Създайте ipp-command-file, наречен printjob.ipp:

{
 OPERATION Print-Job
 GROUP operation-attributes-tag
  ATTR charset attributes-charset utf-8
  ATTR language attributes-natural-language en
  ATTR uri printer-uri $uri
 FILE $filename
}

Сега трябва да можете да отпечатате PDF файл, като използвате тези опции:

ipptool -tv -f mydoc.pdf ipp://192.168.2.207 printjob.ipp

Уверете се, че принтерът (или сървърът за печат) поддържа формата на документа, който изпращате. Предполагам, че сте запознати с това как да изпълните външна команда във вашето приложение.

Въпреки че ipptool се предоставя от CUPS, той работи перфектно с всеки IPP принтер. Проверете RFC 3510 или документацията на вашия принтер за подходящия printer-uri- схема или използвайте ippfind.

Опитните разработчици трябва да могат да реализират операцията за печат в предпочитания от тях език за програмиране и екосистема. Приложих случая на използване от по-горе в kotlin със 100 реда код: https://github.com/gmuth/ipp-printjob-kotlin.

Това е моята минимална реализация на PrintJob в Java: https://github.com/gmuth/ipp-printjob-java

person IPP Nerd    schedule 28.01.2015
comment
Не е необходимо принтерът да поддържа формата на документа, който изпращате.! Това е CUPS, който трябва да поддържа формата на документа. (Вашият команден ред предполага, че печатате през CUPS сървър, а не директно към IPP принтер -- защо иначе бихте използвали ipp://localhost/printers/laser като URI?). CUPS автоматично ще въведе файла, който сте изпратили, и автоматично ще създаде верига за филтриране на подходящ файлов формат, за да генерира типа файл на заданието, който принтерът иска. Можете да изпратите PDF с ipptool и целевият принтер може да бъде PCL устройство. CUPS ще се погрижи за необходимите преводи.... - person Kurt Pfeifle; 30.10.2015
comment
Първоначалният въпрос на Пол не е свързан с CUPS. Вярно е, че някои (по-добри) принтери или сървъри за печат използват application/octet-stream като формат на документа по подразбиране и следователно трябва автоматично да въвеждат получените данни. Печатът без драйвери работи най-добре с PDF и принтери, които приемат PDF (напр. LaserJet M175nw или imagePRESS C7010VP). Използването на CUPS не може да се счита за печат без драйвер, тъй като самият CUPS винаги се нуждае от драйвер или филтър. Хората, които задават въпроси относно IPP или печатането без драйвери, са склонни да избягват междинен софтуер като CUPS. - person IPP Nerd; 23.11.2015
comment
Първоначалният въпрос на Пол не е свързан с CUPS. Вярно. -- Отговорът ви обаче предполага, че работата преминава през CUPS. IPP URI схемата, която използвате, не съвпада с НИКОЕ URI на IPP устройство за печат, което познавам (и знам повече от сто). Но съвпада с това, което използва CUPS. - person Kurt Pfeifle; 24.11.2015
comment
Ако искате да използвате IPP URI за директно адресиране на печатащо устройство, тогава използвайте ipp://printername-or-ip/ или ipp://printername-or-ip/ipp или ipp://printername-or-ip/printer/ или ipp://printername-or-ip/ipp/port1 или ipp ://printername-or-ip/ipp/print. Те покриват около 95% от всички реални IPP устройства там. За съжаление, това не е наистина стандартизирано. (Никое от устройствата, които някога съм тествал, не поддържа ipp://printername-or-ip/printers/queuename ). - person Kurt Pfeifle; 24.11.2015
comment
Между другото, примерът по-горе най-вероятно няма да работи, ако IPP принтерът, на който се опитвате да изпратите файла, е CUPS опашка: защото тогава имате нужда и от допълнителен ред 'ATTR name requesting-user-name $user'. Освен това повечето хардуерни IPP принтери също искат да знаят кой потребител печата... - person Kurt Pfeifle; 09.12.2018
comment
Говорих за CUPS (ако IPP принтерът, към който се опитвате да изпратите файла, е CUPS опашка), и не казах, че всеки хардуерен IPP принтер го изисква, но Говорих за повечето от тях... - person Kurt Pfeifle; 26.12.2018
comment
Вие приемате, че CUPS прилага IPP във всички детайли 1:1. Това предположение е погрешно. Освен това, ако спецификацията казва ТРЯБВА, не приемайте, че CUPS НЕ го прави. -- Не разбирам каква част от твърденията ми смятате за неверни... - person Kurt Pfeifle; 26.12.2018

IPP примерен софтуер

Междувременно IPP примерен софтуер (който включва ipptool споменато по-горе) е отделен проект в Github. Сега е под егидата на Printer Working Group (PWG), органът, който стандартизира IPP (Internet Printing протокол).

Докато софтуерът в момента все още е в бета версия, той вече е много функционален. Той доставя два основни инструмента на командния ред:

  1. ippserver. Стартирайте го (със съответните опции) и ще имате пълноценно копие на IPP сървър във вашата мрежа, служещо като виртуален IPP принтер (или IPP сървър, хостващ множество виртуални IPP опашки), който можете да използвате, за да тествате всяка (или себе си -написан) IPP клиентски софтуер срещу.

  2. ipptool. Това е IPP клиентска програма, която може да изпраща произволна комбинация от IPP заявки до всеки IPP екземпляр в мрежата (CUPS сървър, ippserver, IPP-съвместим принтерен хардуер) и да валидира своите отговори. Софтуерът се доставя с няколко подготвени текстови файла, съдържащи примерни IPP заявки, всички със суфикс .test за техните имена на файлове.

За вашата цел можете да изпълните тези команди:

  1. ipptool -t -v ipp://xxx.xxx.xxx.xxx/ipp/print get-printer-attributes.test. Тази команда ще отправи запитване към всеки IPP принтер относно поддържаните IPP атрибути. Това трябва да включва елемент, разказващ за неговата предполагаема поддръжка на IPP версии. Например докладване като ipp-versions-supported (1setOf keyword) = 1.0,1.1,2.0.

  2. ipptool -t -v ipp://xxx.xxx.xxx.xxx/ipp/print ipp-1.1.test. Тази команда ще изпълни пълен пакет за проверка на принтера, за да тества съответствието му с IPP-1.1 в реалния свят.

  3. ipptool -t -v ipp://xxx.xxx.xxx.xxx/ipp/print ipp-2.0.test. Тази команда ще изпълни пълен пакет за валидиране срещу принтера, за да тества съответствието му с IPP-2.0 в реалния свят.

  4. ipptool -t -v ipp://xxx.xxx.xxx.xxx/ipp/print ipp-2.0.test. Тази команда ще изпълни пълен пакет за валидиране срещу принтера, за да тества съответствието му с IPP-2.0 в реалния свят.

  5. ipptool -t -v ipp://xxx.xxx.xxx.xxx/ipp/print ipp-2.1.test. Тази команда ще изпълни пълен пакет за проверка на принтера, за да тества съответствието му с IPP-2.2 в реалния свят.

  6. ipptool -t -v ipp://xxx.xxx.xxx.xxx/ipp/print ipp-2.2.test. Тази команда ще изпълни пълен пакет за проверка на принтера, за да тества съответствието му с IPP-2.2 в реалния свят.

  7. ipptool -t -v ipp://xxx.xxx.xxx.xxx/ipp/print ipp-everywhere.test. Тази команда ще изпълни пълен пакет за валидиране на IPP Everywhere (който е най-новият IPP стандарт) срещу принтера, за да тества съответствието му с IPP Everywhere в реалния свят.


AppImage на IPP примерния софтуер

За да улесня този тип тестване за вас, създадох готов изпълним AppImage от софтуера IPP Sample, който трябва да може да се изпълнява директно (не е необходима „инсталация“!) на всички дистрибуции на x86_64 Linux.

Можете да го използвате на (почти) всяка Linux система, без да имате инсталиран CUPS или ippsample!

AppImage е вградил всички основни изпълними инструменти на командния ред на IPP Примерния софтуерен проект. Тези изпълними файлове ще се изпълняват като 'подкоманди' на AppImage. Вижте по-надолу за примери.

  1. Изтегляне:

    wget https://github.com/KurtPfeifle/ippsample/releases/download/continuous/ippsample-x86_64.AppImage
    
  2. Направете AppImage изпълним (и по избор го преименувайте на ippsample):

    chmod a+x ippsample-x86_64.AppImage
    mv ippsample-x86_64.AppImage ippsample
    
  3. Разгледайте вградения помощен екран:

    ./ippsample --ai-usage
    
  4. Стартирайте го:

    ./ippsample ipptool -t -v ipp://xxx.xxx.xxx.xxx/ipp/print ipp-2.0.test
    
  5. Намерете всички IPP-съвместими принтери наблизо:

    ./ippsample ippfind
    

    ще даде s.th. като:

    ipp://HPA0B3CCF051B9.local:631/ipp/printer
    ipp://lenjessie2.local:8444/ipp/print
    ipp://mbp14.papercut-ipv4.local:631/printers/OJ6500
    ipp://mbp14.papercut-ipv4.local:631/printers/libreoffice-pin-code-drucker
    
  6. Изберете един принтер, отпечатайте задание:

    ./ippsample ipptool       \
            -tv               \
            -f ./printjob.pdf \
             ipp://HPA0B3CCF051B9.local:631/ipp/printer \
             print-job.test
    

ASCIinema ASCIIcast

Ето (по-стар) ASCIinema ascii-cast, действащ като илюстрация на това, за което писах, и как да използвате примерния софтуер на IPP (и неговия AppImage):

asciicast< /a>

person Kurt Pfeifle    schedule 08.12.2018
comment
@IPPGeek: Сега го прави, сега дори маниаците могат да го възпроизведат. - person Kurt Pfeifle; 10.12.2018