Как отправить данные на современный принтер? PDF, PostScript, HPGL и т.д.

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

В старые времена существовали два основных типа принтеров: принтеры HP, которые понимали принтеры HPGL и Postscript. Таким образом, вы можете отправить распечатку на любом из этих двух языков, и принтер преобразует ваш код в точки на странице. Вы также можете вставлять растровое изображение в виде двоичных данных. Например, в HPGL (или PCL) вы можете дать команду, которая в основном говорит: "Пожалуйста, распечатайте это растровое изображение, и вот растровые данные", за которым следует гигантская капля двоичных данных. Очевидно, что если вы это сделаете, объем данных, поступающих на принтер, будет намного больше и может задушить принтер. У Postscript была такая же способность. Если вы печатали текст, вы могли бы сказать принтеру распечатать текст "xyz" в шрифте TimesNewRoman (или что-то еще), и принтер рассчитает все точки для вас (это означает, что принтер должен был знать шрифт, или вам пришлось загрузить шрифт на принтер раньше времени).

Теперь, поскольку я понимаю формат PDF, он похож на Postscript, но он не является языком Postscript и может включать только "объекты". Так, например, в Postscript вы можете сделать цикл и сказать "распечатать этот круг 50 000 раз", перемещая его точное местоположение. В PDF я понимаю, что вы не можете этого сделать, вам нужно указать каждый круг как отдельный "объект".

Итак, как работают современные принтеры? Могу ли я отправить HPGL/PCL на принтер? Все ли принтеры теперь стандартизированы на Postscript? Если да, значит ли это, мой лучший вариант - создать Postscript, а затем отправить это raw на принтер? Если я отправляю Postscript, мне нужно каким-то образом сказать принтеру, что это Postscript каким-то образом?

В Windows я знаю "стандартный" способ печати, который предназначен для запроса возможностей устройства и запроса контекста устройства, тогда вы можете рисовать линии, фигуры и текст, используя вызовы Windows в этом контексте. Однако, очевидно, это чрезвычайно примитивно по сравнению с Postscript (или HPGL/PCL). Есть ли способ, которым я могу либо напрямую связаться с драйвером принтера, либо сказать Windows: "вот мой код Postscript, пожалуйста, передайте его на принтер для печати"?

Ответ 1

'Так, например, в Postscript вы можете сделать цикл и сказать "распечатать этот круг 50 000 раз", перемещая его точное местоположение. В PDF я понимаю, что вы не можете этого сделать, вам нужно указать каждый круг как отдельный "объект".

На самом деле, правда немного больше относится к средней земле между двумя крайностями, которые вы описали.

  • Это правда: в отличие от PostScript, PDF не является языком программирования (не говоря уже о Turing-complete), и вы не можете определить "петли".

  • Кроме того, вы не должны указывать каждый круг (или встроенное изображение или другой графический объект) отдельно. Вы можете точно определить, как рисовать круг (или изображение или что-то еще) один раз, а затем повторно использовать это определение в других местах страницы или в документе PDF. Это называется "ссылкой на объект". При повторном использовании объекта вы можете отличать разные его свойства по-разному (цвет, масштабирование, вращение), изменяя некоторые текущие "enviromental" определения (например, состояние графики, которое включает CTM, текущую матрицу преобразования).


О некоторых из ваших других моментов:

  • Нет, никогда не было только двух типов принтеров: HPGL и PostScript.

  • Даже в прежние времена существовали дюжины разных языков принтера. PCL был более популярным, чем HPGL. Не забывать все патентованные изобретения разных языков принтера. Когда-либо слышал о AFP, расширенной функции печати? Этот язык напечатан - и все еще печатает! - больше листов бумаги, чем когда-либо. Он больше не является запатентованным, но он был изобретен IBM для печати на хостах с использованием простых данных переменных данных для целей биллинга в основном... Когда-либо слышал о ESC/P? KPDL? XPS?

  • Да, вы все равно можете отправить HPGL на принтер, но не на каждый принтер. Принтер всегда должен быть наделен полномочиями, по крайней мере, для одного из языков, которые вы можете создавать и отправлять.

  • Да, в настоящее время существуют модели принтеров, которые могут напрямую использовать PDF. Но они все еще не являются преобладающим типом. Некоторые из них "обманывают" и по-прежнему имеют в качестве основного встроенного интерпретатора механизм PostScript: они берут PDF и молча конвертируют его в PostScript. Другие могут обрабатывать PDF без возврата к PostScript.


'В Windows я знаю "стандартный" способ печати, который предназначен для запроса возможностей устройства и запроса контекста устройства, тогда вы можете рисовать линии, фигуры и текст, используя вызовы Windows в этом контексте.

Не предполагайте, что термин "контекст устройства" означает, что Windows напрямую разговаривает с оборудованием принтера, чтобы запросить возможности и запросить контекст устройства. Иногда это происходит, иногда нет. Он всегда полагается на некоторое программное обеспечение под названием "драйвер принтера" (который также контролирует, какой язык принтера должен печатать данные). Драйвер принтера может запросить устройство и спросить "У вас есть блок двусторонней печати? У вас есть устройство для сшивания?" а затем сгенерировать требуемый контекст устройства для задания.

Только очень современный подход, IPP Everywhere, разработанный Рабочая группа принтера", сможет избавиться от большей части того, что должны были сделать старые драйверы для конкретных моделей модели, и начнет полагаться в основном на прямой допрос устройство до "без водителя" завершает точные данные печати, которые должны быть переданы на физическое устройство.

Но IPP Everywhere пока еще не пользуется большой популярностью ни у поставщиков, ни у админов, ни у пользователей. Но это произойдет, как только компьютеры будут забыты, и 95% вычислительных устройств будут супермобильными...

Ответ 2

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

Позвольте мне попытаться добавить все, что, возможно, отсутствовало в моем первоначальном ответе.


"В старые времена существовали два основных типа принтеров: принтеры HP, которые понимали принтеры HPGL и Postscript."

Даже в прежние времена было больше типов принтеров, или, скорее, языков описания страниц... но PCL, HP/GL и PostScript, возможно, были наиболее важными для большинства людей, имеющих дело с технологиями печати. ​​

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

Нет, это не срабатывало во всех случаях.

Это работает только тогда, когда принтер понимает оба этих языка (что некоторые из более дорогих моделей HP сделали).

Некоторые модели принтеров (даже в старые времена) понимают только HP/GL. Некоторые из них поняли только конкретную версию PCL (PCL, FWIW, это полное семейство языков принтера, состоящее из около десятка членов: и некоторые из более новых имеют едва ли какие-либо генетические общие основания с более старыми - за исключением того, что маркетинг HP выбрал, чтобы назвать их PCL6 или PCL XL).

"Итак, как работают современные принтеры? Могу ли я по-прежнему отправлять HPGL/PCL на принтер"

Да, это работает так же:

  • Если ваш "современный принтер" понимает HP/GL, вы можете отправить ему данные HP/GL.
  • Если он понимает PCL, вы можете отправить PCL.
  • Если он понимает PostScript, вы можете отправить PostScript.
  • Если он понимает PDF, вы можете отправить PDF.
  • Если он понимает XPS (когда-либо слышал об этом?!?), вы можете отправить XPS.
  • Однако, если он понимает только PCL3 (ну, значит, это не современный принтер:), вы не можете отправить PCL6e...

Если устройство понимает любую комбинацию этих языков, вы можете отправлять все, что понимаете.

"Теперь, поскольку я понимаю формат PDF, он похож на Postscript, но он не является языком Postscript и может включать только" объекты ". Так, например, в Postscript вы можете сделать цикл и сказать" print этот круг 50 000 раз ", перемещая его точное местоположение. В PDF я понимаю, что вы не можете этого сделать"

Вы правы, PDF (в отличие от PostScript), не является языком программирования. Было конструктивное решение, что PDF не должен понимать петлевые или условные конструкции (в то время как PostScript - PostScript - это даже Turing-complete в качестве языка программирования, что означает: все, что программируется вообще, может быть записано как программа PostScript).

Итак, пока вы можете определить круг (или даже очень сложный графический объект) только один раз как объект PDF:

  • Вы не можете выразить длинный цикл через очень короткий программный оператор, сообщающий визуализатору показать этот объект во время каждой итерации.
  • Вместо этого вы должны вручную указывать каждую итерацию отдельно (где вы можете вызвать предварительный рендеринг объекта, который будет показан).

Но вы не правы, заявив, что "формат PDF... похож на Postscript". Это не. PDF файл получен из той же графической модели, что и PostScript. Но об этом.

PDF-слова для операторов разные. Структура типичного PDF полностью отличается от PostScript.

Самое главное, что PDF расширил графическую модель, которую он унаследовал от PostScript (плюс, он добавил некоторые другие аспекты для типичного электронного документа). Он развивался в нескольких направлениях:

  • Со временем в нем появилось больше цветовых пространств.
  • Он поддерживает больше типов шрифтов.
  • Он реализовал функции "прозрачности" для всех рисованных объектов.
  • Появилась концепция "слоев" ( "необязательные группы контента", OCG, в формате PDF).
  • В нем представлены интерактивные элементы (кнопки, ссылки, гиперссылки, поля формы).
  • Он поддерживает более разные схемы сжатия.
  • Он может использовать гораздо более богатый набор метаданных документа.
  • В нем представлены цветовые профили ICC и полномасштабное управление цветом ICC.
  • ... плюс еще несколько.

"Все ли принтеры теперь стандартизированы в Postscript?"

Нет.

В любом случае более современные принтеры предпочитают PDF поверх PostScript (хотя они все еще могут поддерживать возможности обработки PostScript в качестве резервной опции). Но лучше спросите своего поставщика или изучите их руководства по маркетингу.

"Если это так, значит, мой лучший вариант - создать Postscript, а затем отправить его на принтер?"

Это никогда не было вашим лучшим вариантом, даже в "старые времена"!

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

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

Эти функции работы не обязательно могут контролироваться "raw PostScript". Чтобы управлять определенными параметрами задания на печать с большинством моделей принтеров PostScript, вы имели два способа:

  • Вставьте выражения << ...vendor-specific or generic PS-code...>> setpagedevice фрагментов PostScript в поток данных задания, будь то на документе или на отдельных уровнях страницы.

    Какой конкретный setpagedevice необходим для конкретной функции, которая должна быть выполнена конкретной моделью принтера, определена в PPD (сокращение от PostScript Printer Description) файла соответствующего драйвера принтера PostScript. Этот файл .ppd должен быть предоставлен соответствующим продавцом рядом с его драйверами (принтерами) принтера. PPD - это формат файла определенный Adobe. В какой-то мере он расширяет язык PostScript и позволяет поставщикам "изобретать" свои собственные функции, когда речь идет о сложных настройках заданий.

  • Префикс фактических данных печати (отправить как PostScript) с заголовком PJL (сокращенно для языка заданий принтера), состоящий из нескольких (или нескольких десятков) строк для вызова определенных функций задания.

PJL был первоначально изобретен HP и использовался для PCL, но он был быстро адаптирован другими поставщиками для других языков принтера. Поэтому в настоящее время вы можете использовать строки заголовка PJL для большинства принтеров, которые могут печатать PostScript, PCLxx, HP/GL или PDF, потому что они обычно поддерживаются большинством вендоров. В этом случае последняя PJL-строка сообщает принтеру, на каком языке имеются данные реальной работы: PostScript, PCLxxx, PDF, HP/GL, что угодно... по заявлению вроде:

    ESC%[email protected] ENTER LANGUAGE = PostScript 

"Если я отправляю Postscript, мне нужно каким-то образом сказать принтеру, что это Postscript?"

См. предыдущий, но один абзац выше, если вы предварительно исправите свое задание с помощью заголовка PJL.

Для чистого PostScript-принтера вы скорее использовали бы операторы <<..>>setpagedevice. И такой принтер автоматически поймет PostScript...

Это также поможет, если вы указали модели принтера, которые у вас есть на вашем устройстве.

"В Windows я знаю" стандартный "способ печати, который предназначен для запроса возможностей устройства и запроса контекста устройства, тогда вы можете рисовать линии, фигуры и текст, используя вызовы Windows в этом контексте".

Это на самом деле то, как он работает также с принтерами PostScript в Windows (ну, более новые XPS или OXPS так как Windows 8 немного отличается...). Как правило, "возможности устройства" известны и депонируются соответствующим драйвером принтера. Когда вы закончите рисовать линии, фигуры и текст с помощью вызовов Windows, драйвер преобразует эти вызовы в PostScript и отправит их на принтер.

Это отличается от того, как он работает в Linux, Unix или Mac OS X:

  • В Linux (и Unix) каждое приложение должно создавать описания страниц PostScript, которые оно хочет отправить на принтер самостоятельно. Для этого нет "драйвера". Если конечный принтер-получатель не поддерживает PostScript, CUPS автоматически преобразует его в формат описания страницы, зависящий от поставщика или модели, из полученного PostScript. (Некоторые приложения могут создавать один из языков PCL.)

  • В Mac OS X приложения обычно генерируют PDF как формат очереди печати (и CUPS автоматически конвертирует этот файл на другой язык принтера на основе драйвера принтера поставщика, который обычно включает в себя фильтр pdf-to-someting CUPS по мере необходимости).

"Однако, очевидно, это чрезвычайно примитивно по сравнению с Postscript (или HPGL/PCL).

Я не понимаю, почему вы должны описывать это как "чрезвычайно примитивный" в этом контексте.

"Есть ли способ, которым я могу либо напрямую связаться с драйвером принтера, либо сказать Windows:" вот мой код Postscript, пожалуйста, передайте его на принтер для печати "?

Как я уже говорил ранее: в Windows приложение обычно не генерирует сам код PostScript [^ 1], если он хочет печатать на принтере PostScript и не генерирует какой-либо другой конкретный принтер (за исключением конечного устройства, являющегося XPS-принтером). Как правило, он генерирует EMF как буферный формат и позволяет подсистеме печати (и драйверу принтера) заботиться о любых преобразованиях, которые могут необходимо.

Или вы говорите: "У меня есть готовый файл PostScript (сгенерированный в другом месте), который я хочу распечатать на PostScript-принтере?" Если это так, просто выполните команду типа lpr -S remoteserver -P printername "-o l" jobfile.ps из окна DOS.

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

  • SNMP. Если ваше устройство имеет сетевой интерфейс (ethernet/wifi) и понимает простой протокол сетевого управления, вы можете запросить его через этот канал и получить ответные ответы на любые вопросы типа SNMP, которые вы задаете. На простом языке (язык SNMP выглядит несколько иначе):

    • Каковы ваши текущие уровни чернил?
    • Каков максимальный размер носителя, который вы можете обрабатывать?
    • Сколько лотков для бумаги у вас есть?
    • Каков уровень заполнения лотка 1?
    • Сколько страниц вы когда-либо печатали в свое время? Сколько с момента последней загрузки?
    • Какие языки принтера вы можете обрабатывать?
    • Какой протокол передачи данных печати вы поддерживаете? HPJETDIRECT/AppSocket? LPR/LPD? IPP?
    • Есть ли у вас доступ к жесткому диску?
    • Сколько у вас RAM?
    • Какие другие клиенты печати подключены к вам в настоящее время?
    • ... и многое другое.
  • Запросы PJL. Некоторые из приведенных выше сведений также можно получить, отправив несколько строк простых операторов PJL на принтер (и оценив ответы).

  • IPP-запросы. Протокол интернет-печати также поддерживает запросы возможностей устройства (, если устройства могут разговаривать с IPP).

Еще раз: "Есть ли способ, которым я могу... сказать Windows:" вот мой код Postscript, пожалуйста, передайте его на принтер для печати "?

Вы даже можете обойти Windows полностью и использовать утилиту netcat.exe (иногда также называемую nc.exe) для отправки файла задания на принтер:

  • Отправьте задание PostScript на сетевой принтер, который ждет TCP-порт 9100 для входящих заданий:

    cat filename.ps | netcat.exe -h printer-ip-address-or-hostname -p 9100
    

    Точно так же для PCL или любых заданий формата... IF принтер знает этот формат. Какой точный TCP-порт, который вам нужно адресовать, зависит от вашей конкретной модели (посмотрите ее в руководстве). Как вы создаете PostScript, PCL или любой другой файл для принтера, зависит от вас.


[^ 1]... за исключением некоторых программ Adobe, таких как Acrobat, которые действительно могут генерировать собственный PostScript.

Ответ 3

Я думаю о pdf как скомпилированном постскрипте в основном тот же материал, если не тот же самый материал, который только один компилируется в двоичные капли, а другой - ascii.

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

PCL довольно распространен для принтеров, отличных от HP, а также для HP. Но универсального ответа нет. Вам по-прежнему приходится обращаться к принтеру по принтеру и посмотреть, какой из них поддерживает и/или что было куплено в качестве дополнения для него, а затем из этого списка, что администратор разрешил на нем. то, конечно, говорят версии любых языков.

вот что такое CUPS. один способ абстрагироваться и скрывать эти детали.

Ответ 4

В среде Windows общим форматом является WMF. Металлический файл Windows. WMF представляет собой комбинацию векторной и битовой карты.

Формат WMF был сделан MS для работы с Windows GDI для восстановления изображения. Файлы WMF содержат все необходимое для восстановления изображения, поэтому их можно преобразовать в любой другой графический формат.

Производитель принтера обычно создает свой собственный набор команд принтера. Они могут принять решение с дефакто стандартом и разыгрывать сделку с патентом/владельцем авторских прав.

Если вы создаете принтер Postscript, ваш дайвер преобразует WMF в Postscript.

Приложение Windows через Windows GDI API создает метаданные (WMF), а драйвер Windows, написанный производителем принтера, переводит WMF в собственные команды принтера.

Microsoft, год назад вчера (15 мая 2014 г.), выпустила спецификацию WMF в общественное достояние: Формат метафайла Windows PDF

Когда у вас есть данные "Raw" (например, Postscript, HPGL), которые будут правильно интерпретироваться принтером, вы должны обойти драйвер изготовителей.

Чтобы обойти драйвер принтера, используйте драйвер Generic/Text Only.

Это устраняет драйвер из картинки, и вы можете отправить "Исходные данные".

Затем вы должны отправить все коды, созданные драйвером, которые предназначены для облегчения вашей работы.

Ответ 5

Если вы хотите полностью автоматизировать процесс печати, установите FolderMill (http://www.foldermill.com/). Эта программа автоматически преобразует печатные документы в требуемый формат, выбирает бесплатный принтер и создает задание на печать.