Проблемы печати файлов 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-стиле. Но за это надо платить:)