Проблемы печати файлов PostScript с помощью команд PJL с использованием gsprint

Мы разработали собственное решение для печати, которое позволяет пользователям управлять своими отпечатками (аудит / объединение / просмотр / отправка на несколько принтеров) и т. Д.... но у нас возникают проблемы с самым концом процесса - окончательной печатью.

В настоящее время наше решение хранит документы (оригинальные и после объединения) в формате PDF. Нам нужно иметь возможность отправлять эти документы на определенный принтер и в некоторых случаях (когда пользователь выбрал опцию) распечатать страницу 1 в лоток 8, а остальные - в лоток 1. Мы не можем разделить PDF-файлы и распечатать их отдельно, так как они также должны быть сшиты принтером как одно задание.

Наша идея состояла в том, чтобы преобразовать файлы PDF в файлы PostScript с использованием ghostscript, затем вставить команды PJL в PostScript и затем распечатать этот измененный файл PostScript с помощью gsprint.

К сожалению, сочетание ghostscript, postscript, PJL и gsprint, похоже, не работает. Команды PJL, которые мы пробуем, которые мы МОЖЕМ заставить работать в текстовых файлах, отправляемых на принтер с помощью команды windows copy, похоже, не имеют такого же эффекта, когда они помещаются в файлы PostScript и печатаются с использованием gsprint.

Может кто-нибудь заметить какие-либо отвратительные недостатки в том, что мы делаем с PostScript, или иметь представление о том, почему рабочий процесс PostScript->PJL amend->gsprint у нас может не работать?

Было очень трудно найти примеры в Интернете, поэтому вполне возможно, что наше размещение команд PJL неверно.

(// комментарии не в окончательном файле)

<ESC>%-12345X@PJL JOB<ESC>&l8H           //start job printing first page 
@PJL ENTER LANGUAGE = Postscript         //to tray 8 (letterhead)
@PJL COMMENT CANPJL SET STAPLE=ONEUPLEFT //indicate the document should be stapled
%!PS-Adobe-3.0                           //start of PostScript file proper
---
%%PageTrailer                            //end of first page
<ESC>%-12345X@PJL EOJ<ESC>%-12345X       //end the first job
%%Page: 2
<ESC>%-12345X@PJL JOB<ESC>&l7H           //start 2nd job to print remaining
---                                      //pages to tray 1 (plain)
---
%%EOF
<ESC>%-12345X@PJL EOJ<ESC>%-12345X       //end 2nd job

Затем мы берем этот модифицированный PostScript и используем gsprint следующим образом:

gsprint -noquery -ghostscript gswin32c -printer "printer" "C:\postscriptfile.ps"

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

Надеюсь, понятно, чего мы пытаемся достичь. Любая помощь будет принята с благодарностью.

Заранее спасибо.

PS: Все наши принтеры являются принтерами Canon.

Редактировать:

После приведенного ниже ответа KenS кажется, что логический рабочий процесс должен быть PDF->PCL->add PJL->send to printer с "copy"

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

Если мы возьмем двухстраничный PDF, созданный Microsoft Word, преобразуем его в PCL с помощью ghostscript, затем отредактируем этот файл PCL с помощью Notepad++, добавив следующее:

<ESC>%-12345X@PJL JOB NAME = "My Print Job Name"<CR><LF>
@PJL SET DUPLEX = ON
@PJL SET OUTBIN = LOWER
@PJL ENTER LANGUAGE = PCL
...original PCL data...
<ESC>%-12345X@PJL EOJ<CR><LF>
<ESC>%-12345X

документ выходит из нижнего выходного лотка, но не дуплексируется. Но что еще более странно, принтер печатает намного дольше, когда DUPLEX = ON, чем точно такую ​​же работу с DUPLEX = OFF, и кажется, что он делает что-то другое внутри.

Есть идеи?

2 ответа

Я думаю, вы неправильно понимаете, как работает gsprint. Он принимает входной файл, отображает его в растровое изображение, рисует это растровое изображение на соответствующем холсте, а затем использует систему печати Windows для печати этого холста на принтере. Он вообще не имеет никакого контроля над принтером, в результате чего вложение всего, что должно управлять принтером (в отличие от рендеринга), не будет иметь никакого эффекта.

Кроме того, PJL ассоциируется с принтерами HP PCL, а не с принтерами PostScript. Хотя ваш PJL может работать на принтере PCL, поскольку он обрабатывает каждую страницу как отдельное задание, он вообще не будет работать на принтере PostScript и может привести к ошибке в зависимости от того, переводчик ли игнорирует команды PJL или нет.

Чтобы управлять принтером, вам необходимо определить, какой тип ввода поддерживает принтер (PostScript или PCL), затем вам нужно преобразовать PDF-файл в эту форму, а затем вставить соответствующие последовательности управления. В случае принтера PCL вы можете разумно использовать PJL, для принтеров PostScript вы должны управлять этим с помощью оператора setpagdevice. Предполагая, что у вас есть файл Windows .WPD или.PPD для вашего принтера, вы можете найти соответствующие последовательности управления или распечатать несколько тестовых файлов и проверить их содержимое.

Мимоходом; Вы говорите, что команды, которые вы используете, работают при отправке текстовых файлов на принтер. Это означает, что принтер, по крайней мере, понимает PJL и почти наверняка является принтером PCL. Вы не можете отправить текст на принтер PostScript, это вызовет ошибку, потому что PostScript - это язык программирования, и у вас будут синтаксические ошибки с любым случайным фрагментом текста. Однако вы можете отправить текст на принтер PCL, который предполагает, что все, что не начинается с 0x1B (escape), является просто текстом для печати.

Поэтому использование Ghostscript для вывода PCL, вставка вашего PJL, как описано выше, и последующая отправка результата непосредственно на принтер, вероятно, должны работать. Конечно, определение конца каждой страницы может быть более сложным в файле PCL.

У нас была похожая проблема, вот как мы это делали, используя ghost script и PJL

http://reddymails.blogspot.com/2014/07/how-to-print-documents-using-java-how.html

Также на bfo.com есть несколько коммерческих jar-файлов, которые делают то же самое без скрипта-призрака и в чистом Java-стиле. Но за это надо платить:)

Другие вопросы по тегам