% Конструируем новое имя для задания.
% Входной параметр на вершине стека - имя файла (без пути).
% После выполнения на вершине стека будет новое имя в формате:
% "[ X копий ?! ] <Имя задачи> ( <ширина> x <длина> мм HH:MM/DD)"
/funcConstructJobName {
count 1 lt {
/funcConstructJobName errordict /stackunderflow get exec
} if
% Проверяем количество копий страницы, указанное в файле:
statusdict /NumCopies get exec dup 1 gt
{
% Вставляем предупреждение перед имененем задания, если в файле указана больше, чем одна копия:
([ ) exch ( ) cvs //funcCombineStrings exec
/copies //funcLocalizedLabel exec //funcCombineStrings exec
( ] ) //funcCombineStrings exec
exch //funcCombineStrings exec
}
{
pop
} ifelse
% Добавляем размеры страницы и текущее время:
[
( \( )
% ширина:
//funcPageWidthInPoints exec 72 div 25.4 mul round cvi ( ) cvs
( x )
% высота:
//funcPageHeightInPoints exec 72 div 25.4 mul round cvi ( ) cvs
/mm //funcLocalizedLabel exec
% время:
//funcDayTimeAndDay exec
(\))
] //funcArrayToString exec
//funcCombineStrings exec
% Сравниваем размеры страницы и ширину пленки, добавляем предупреждения, если нужно:
//funcPageWidthInPoints exec //funcMediaWidthInPoints exec gt
{
//funcPageHeightInPoints exec //funcMediaWidthInPoints exec gt
{
% ( не пролазит!)
/wider_than_media //funcLocalizedLabel exec
}
{
% ( поверни меня!)
/need_rotation //funcLocalizedLabel exec
} ifelse
}
{
//funcPageHeightInPoints exec //funcPageWidthInPoints exec gt
//funcPageHeightInPoints exec //funcMediaWidthInPoints exec le and
{
% ( поверни меня!)
/need_rotation //funcLocalizedLabel exec
}
{
() % вроде все ок (пустая строка)
} ifelse
} ifelse
//funcCombineStrings exec
} bind def
% Процедура включает чекбокс "Disable output" в окне "Output Controller/Monitor"
% в том случае, если активная очередь пуста. Это сделано для того, чтобы случайно
% не вывести на фотонаборе непроверенное задание.
% (Если же активная очередь не пуста и чекбокс снят - то это означает,
% что вы выводите и рипуете одновременно, поэтому вывод отключаться не будет.):
/procDisableOutputIfActiveQueueIsEmpty {
/HqnThroughputControl /ProcSet findresource
begin
0 { pop 1 add } pgbactiveforall
0 eq {
(%pgb%) currentdevparams /OutputState get
(Off) ne {
false pgbenable
(********** Output disabled.\n) print
} if
} if
end
} bind def
% Получить полное имя файла (с путем) из объекта-файла:
% <file-stream> funcFilenameFromFile (filename)
/funcFilenameFromFile {
4096 string statusdict /filename get exec pop
} bind def
% Стартовая процедура создания имени задания:
/procMain_SmartJobname {
% Отключим вывод непроверенного задания:
//procDisableOutputIfActiveQueueIsEmpty exec
//globaldict /pinptz_jobname known {
% Если имя задания уже сохранено в глобальном словаре (при обработке
% первой сепарации задания), то сразу берем это имя:
//globaldict /pinptz_jobname get
}
{
1183615869 internaldict /fileObject known {
% Если обрабатывается обычный файл, то берем его из внутреннего словаря:
1183615869 internaldict /fileObject get
% Получаем полное имя файла (с путем):
//funcFilenameFromFile exec
% Ожидаем, пока файл увеличивается в размере и пока последний байт файла равен нулю:
dup (r) file
{
2 copy exch dup
% Проверка увеличения длины файла.
% Примечание: собственно эта проверка не особо важна,
% поскольку рип уже делает такую проверку для файлов из горячих папок
% (см. Input Controller->Edit->Type=SpoolFolder->Configure->Time to wait for file to stabilize.)
status pop pop pop exch pop % получили длину файла
300 //procSleep exec % ждем 0.3 секунды
exch status pop pop pop exch pop % получили длину файла еще раз
dup 4 1 roll % len2 file len1 len2
eq {
% Если длина файла не растет, то (по крайней мере, под Windows) это еще не означает,
% что файл уже полностью записан.
% Поэтому здесь проверяется последний байт - для .ps и .pdf он (обычно) не равен нулю.
dup 3 -1 roll
1 sub setfileposition
read
{
0 ne { exit } if % все хорошо, прерываем ожидание.
}
{
exit % не смогли прочитать - просто выходим
} ifelse
}
{
pop pop
} ifelse
( Waiting for file... ) ==
2000 //procSleep exec % ждем 2 секунды
} loop
closefile
}
{
% Если задание - не обычный файл, а передано через стандарный поток, возьмем его:
serverdict /stdin get
% Получаем имя потока:
//funcFilenameFromFile exec
} ifelse
% Оставляем только имя файла без пути:
/HqnLocal /ProcSet findresource /StripFileName_1 get exec
% Конструируем новое имя задания:
//funcConstructJobName exec
% Перенесем строку с построенным именем задания в глобальную виртуальную память:
currentglobal true setglobal exch dup length string copy exch setglobal
% Сохраняем ссылку в глобальном словаре:
//globaldict /pinptz_jobname 2 index put
} ifelse
% Для установки имени задания имеются jobname в statusdict и JobNameUTF8 в %pagebuffer%.
% Но никакой разницы на ECRM RIPMate 7.2 под Windows XP, к сожалению, не видно -
% в окне лога буквы UTF-8 отображаются неправильно во всех вариантах.
% Устанавливаем наше имя задания в JobNameUTF8:
(%pagebuffer%) << /JobNameUTF8 3 index >> setdevparams
% Заменяем также и имя задания в словаре statusdict:
statusdict /jobname 3 -1 roll put
} bind def
<<
% Все элементы словаря StartRender трактуются рипом как процедуры
% и выполняются перед рипованием каждой сепарации сепарированного файла
% или один раз для композитного. Процедуры выполняются в алфавитном порядке.
/StartRender <<
/main_StartRender {
% (\n<<<<<<< main_StartRender begin >>>>>\n) print //procPrintStack exec
//procMain_SmartJobname exec
% (\n<<<<<<< end main_StartRender >>>>>\n) print //procPrintStack exec
} bind
>>
% /EndRender <<
% /main_EndRender {
% (\n<<<<<<< EndRender >>>>>\n) print
% } bind
% >>
% /StartJob <<
% /main_StartJob {
% (\n<<<<<<< StartJob >>>>>\n) print
% statusdict /jobname (< StartJob >) put
% } bind
% >>
>> setpagedevice
end
%%EOF