Указание раскладывания по копиям печатаемых документов: http://rt.etersoft.ru/Ticket/Attachment/127204/58491/wine.jpg ни на что не влияет. Если в документе две страницы и печатаем две копии, должны вылезать листы 1 2 1 2 а вылезают 1 1 2 2
Важно решить, поскольку существенно при большом документообороте.
Вообще есть 2 способа: 1) Приложение само формирует нужное количесво копий и отвечает за раскладку по копиям. 2) Драйвер принтера формирует нужное количесво копий и отвечает за раскладку по копиям. Сейчас, если принтер поддерживает, то используется второй способ (посколько были замечены ошибки при нечётном количестве страниц в первом). Насколько я знаю, приложение (в данном случае 1С) поддерживает правильную раскладку по копиям. Но при этом возникает проблемы с нечётным количеством страниц, поэтому использовать первый способ печати очень нежелательно. Если я правильно понимаю, в wine пока ещё не реализована поддержка раскладки по копиям для драйвера принтера. И где она находится (должна находится) пока ещё требуется выяснить
Если количеством копий управляет драйвер принтера, то сначала идёт проверка: if (lpdm->dmFields & DM_COLLATE) lpdm->dmCollate = (IsDlgButtonChecked(hDlg, chx2) == BST_CHECKED) Проверка не проходит, поэтому нужный бит не выставляется. Установки по умолчанию находятся в wineps.drv/init.c в структуре PSDRV_DEVMODEA DefaultDevmode. Сейчас флаг DM_COLLATE не стоит.
Добавление флага ничего не изменило. добавление в WINSPOOL_GetDefaultDevMode также ничего не даёт
PSDRV_DeviceCapabilities также может возвращать информацию о том поддерживается ли раскладка по копиям. В данном случае она возвращает FALSE. Даже если возвращать TRUE - ничего не меняется Ещё есть функция PRINTDLG_ChangePrinterA. Она берёт необходимые значения из реестра (HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Print\Printers\{Имя принтера}) По ключу DefaultDevMode там содержатся бинарные данные. Если удалить/переименовать этот ключ, то при следующем обращении будет создан новый. Теперь условие if (lpdm->dmFields & DM_COLLATE) проходит. Надо только проверить действительно ли принтер начинает раскладывать по копиям. И если да, то выяснить какие конкретно изменения (кроме реестра) на это повлияли
Нет, раскладки документа по копиям не происходит. Посмотрел в полученный файл PostScript. Никакого упоминания Collate не нашёл. Необходимо найти нормальный PostScript файл, с раскладкой по копиям, и определить что нужно туда добавлять для раскладки по копиям. проверил OpenOffice: 1) Используется Adobe PostScript. Он немного другой 2) Количеством копий и раскладкой по копиям занимается приложение, поэтому в документе вместо двух страниц и указания количества копий = 2 находится 4 уже сформированные в нужном порядке страницы проверил КWrite: При печати в файл галочка "Разобрать по копиям" не активна
Пример можно найти на http://services.renderx.com/lists/xep-support/0245.html Пробовал добавить: mark { << /Collate true >> setpagedevice } stopped cleartomark mark { не помогло. Нашёл место в wine, куда надо добавить соответствующий код. Это функция PSDRV_WriteHeader. Как и ожидалось, так тоже не работает. Скорее всего надо добавлять что-то другое, хотя в примерах было значение true (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6567260)
Попробовал: mark { %%BeginFeature: *LXCollate True << /Collate true >> setpagedevice %%EndFeature } stopped cleartomark не работает Попробовал: mark { %%BeginFeature: *TKCollate True << /Collate true >> setpagedevice %%EndFeature } stopped cleartomark не работает Возникло подозрение, что офисный принтер не поддерживает разбивку по копиям. Проверил. При печати из kwrite всё нормально разбивается. Только вот в полученном PostScript файле нет ни единого упоминания collate.
Ещё попробовал: mark { %%BeginFeature: *TKCollate True << /Collate true >> setpagedevice %%EndFeature } stopped cleartomark не помогло. Вообще, проблемы с режимом когда программа отвечает за формирование нужного количесва копий были замечены только при дуплексной печати с нечётным количеством страниц. Насколько я понимаю, дуплексный режим никак не может сочетаться с разбивкой по копиям. поэтому, если флаг collate стоит, то пускай программа формирует нужное количество копий. В принципе всё должно работать. Только это не правильное решение. Правильней было бы дописать драйвер.
Как написано в документации по PostScript, в заголовок требуется добавлять Requirements: numcopies(2) collate Добавил. Ничего не изменилось
lpr -P hp -# 2 -o Collate=True filename Всё прекрасно печатает. Скорей всего это бага CUPS.
Для начала надо разобраться с функцией ScheduleJob. Она позволяет печатать разными способами. В том числе и через lpr и через CUPS (вызов cupsPrintFile). Надо выяснить через что документ печатается в данном случае
[19:35:33] <Vitaly Lipatov> Почему-то у нас вывод всегда был через dlls/gdi32/printdrv16.c: sprintf(psCmd,"|lpr -T'%s' -P'%s'", buffer, pszOutput+4); dlls/gdi32/printdrv16.c: /* Hack for print to lpr default if output device is empty. TODO: write test and use Windows default device */ Да, действительно не используется. Надо разобраться.
Данный кусок находитсся в CreateSpoolFile(), которая вызывается из OpenJob16(). OpenJob16 тоже находится в gdi32. Возникает вопрос. Как ей передать ещё один параметр для включения collate? Вызывается она из PSDRV_StartDocA. Единственный способ, который я пока вижу - добавлять ещё один бит к параметру LPCSTR lpOutput.
Написал хак. Для печати используется комманда lpr -T'twoPages' -P'hp' -o Collate=True check2.prn collate так не работает. Если collate указывается в коммандной строке, то и количество копий должно указыватсья в коммандной строке, а не в PostScript: lpr -T'twoPages' -P'hp' -# 2 -o Collate=True check2.prn. Передавать ещё одним параметром количество страниц выглядит слишком коряво. Надо попробовать разобраться с функцией ScheduleJob. Возможно удастся пепеписать вывод на печать без использования функций gdi32.
Есть 2 способа печати: напрямую и через спуллер. И зависит это от приложения. 1С использует печать напрямую. С помощью функций StartDoc, EndDoc http://msdn.microsoft.com/en-us/library/dd162865(VS.85).aspx Печать через спуллер вызывается совершенно по-другому. Здесь используются функции StartDocPrinter, EndDocPrinter. ScheduleJob как-раз относится к печати через спуллер. Поэтому при печати из 1с использовать её не получится.
Ещё заметил, что печать через спуллер ещё не реализована. Например, StartPagePrinter сейчас заглушка Сечас ситуация такая: * При вызове StartDoc создаётся и открывается файл. Ещё новое задание добавляется в таблицу заданий принтера. * При вызове EndDoc файл закрывается, и задание удаляется. Пока не совсем разобрался как именно принтеру посылается команда на печать. Вообще идея такова: Переписать систему печати на использование функции lpr. Функции OpenJob16 посылать строку output в которой уже будет содержатся комманда lpr со всеми параметрами (именем принтера, количеством копий и collate) Только вот возникает проблема совместимости с другими программами, использующими OpenJob16 напрямую.
Исходно StartDoc вызывается с параметром output=null если печать идёт на принтер, и output=<имя файла> если печать идёт в файл. Далее, если output == null, output берётся из physDev->job.output. В данном случае output='LPR:HpTest' Значение скорее всего появляется после вызова CUPS_LoadPrinters. Записать туда количество копий и collate не получится. Думаю надо переписать обработку комманды "LPR:" и добавить туда количество копий и collate
Ура! проблема решена. Осталось только привести весь код в порядок и сделать патч
Патч в репозитории eterwine. Всё работает. Ещё раз напомнинаю: Чтобы раскладка по копиям начала работать необходимо УДАЛИТЬ СТАРЫЕ НАСТРОЙКИ из реестра: ключ (HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Print\Printers\{Имя принтера}) нужно удалить DefaultDevMode
(In reply to comment #20) > нужно удалить DefaultDevMode Командой $ wine --removeprinters
*** Bug 3793 has been marked as a duplicate of this bug. ***