Укажите отработанное время

Отработанное время:
Продуктивное время:
Bug 2843 - Документы не раскладываются по копиям   Make a simular bug
Summary: Документы не раскладываются по копиям
Status: CLOSED FIXED
Alias: None
Product: WINE@Etersoft
Classification: Продукты (Products)
Component: Печать ; Диалог печати (show other bugs)
Version: 1.0.9
Hardware: PC All
: P3 normal
Target Milestone: ---
Assignee: Виталий Перов
QA Contact:
URL:
Whiteboard:
Keywords:
: 3793 (view as bug list)
Depends on: 4721
Blocks: 42 443 3688 3803 6009
  Show dependency treegraph
 
In work:
Reported: 2008-11-07 22:27 MSK by Vitaly Lipatov
Modified: 2010-09-30 17:42 MSD (History)
2 users (show)

See Also:
Заявки RT: 8880
Связано с:
Дата напоминания:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Vitaly Lipatov 2008-11-07 22:27:25 MSK
Указание раскладывания по копиям печатаемых документов:
http://rt.etersoft.ru/Ticket/Attachment/127204/58491/wine.jpg
ни на что не влияет.
Если в документе две страницы и печатаем две копии, должны вылезать листы
1 2 1 2
а вылезают
1 1 2 2
Comment 1 Vitaly Lipatov 2009-01-22 10:56:29 MSK
Важно решить, поскольку существенно при большом документообороте.
Comment 2 Виталий Перов 2009-01-22 15:13:55 MSK
Вообще есть 2 способа:
1) Приложение само формирует нужное количесво копий и отвечает за раскладку по копиям.
2) Драйвер принтера формирует нужное количесво копий и отвечает за раскладку по копиям.

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

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

Если я правильно понимаю, в wine пока ещё не реализована поддержка раскладки по копиям для драйвера принтера. И где она находится (должна находится) пока ещё требуется выяснить 
Comment 3 Виталий Перов 2009-01-22 15:43:14 MSK
Если количеством копий управляет драйвер принтера, то сначала идёт проверка:

if (lpdm->dmFields & DM_COLLATE)
    lpdm->dmCollate = (IsDlgButtonChecked(hDlg, chx2) == BST_CHECKED)

Проверка не проходит, поэтому нужный бит не выставляется.

Установки по умолчанию находятся в wineps.drv/init.c в структуре PSDRV_DEVMODEA DefaultDevmode.
Сейчас флаг DM_COLLATE не стоит.
Comment 4 Виталий Перов 2009-01-22 15:56:32 MSK
Добавление флага ничего не изменило.

добавление в WINSPOOL_GetDefaultDevMode также ничего не даёт
Comment 5 Виталий Перов 2009-01-22 17:31:47 MSK
PSDRV_DeviceCapabilities также может возвращать информацию о том поддерживается ли раскладка по копиям. В данном случае она возвращает FALSE. Даже если возвращать TRUE - ничего не меняется

Ещё есть функция PRINTDLG_ChangePrinterA. Она берёт необходимые значения из реестра (HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Print\Printers\{Имя принтера})
По ключу DefaultDevMode там содержатся бинарные данные.
Если удалить/переименовать этот ключ, то при следующем обращении будет создан новый.
Теперь условие if (lpdm->dmFields & DM_COLLATE) проходит.
Надо только проверить действительно ли принтер начинает раскладывать по копиям.
И если да, то выяснить какие конкретно изменения (кроме реестра) на это повлияли

Comment 6 Виталий Перов 2009-01-22 18:03:00 MSK
Нет, раскладки документа по копиям не происходит.

Посмотрел в полученный файл PostScript. Никакого упоминания Collate не нашёл.

Необходимо найти нормальный PostScript файл, с раскладкой по копиям, и определить что нужно туда добавлять для раскладки по копиям.

проверил OpenOffice:
1) Используется Adobe PostScript. Он немного другой
2) Количеством копий и раскладкой по копиям занимается приложение, поэтому в документе вместо двух страниц и указания количества копий = 2 находится 4 уже сформированные в нужном порядке страницы

проверил КWrite:
При печати в файл галочка "Разобрать по копиям" не активна
Comment 7 Виталий Перов 2009-01-22 20:53:10 MSK
Пример можно найти на 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)
Comment 8 Виталий Перов 2009-01-23 15:50:44 MSK
Попробовал:
mark {
%%BeginFeature: *LXCollate True
<< /Collate true >> setpagedevice
%%EndFeature
} stopped cleartomark

не работает

Попробовал:
mark {
%%BeginFeature: *TKCollate True
<< /Collate true >> setpagedevice
%%EndFeature
} stopped cleartomark

не работает


Возникло подозрение, что офисный принтер не поддерживает разбивку по копиям.
Проверил. При печати из kwrite всё нормально разбивается. Только вот в полученном PostScript файле нет ни единого упоминания collate.
Comment 9 Виталий Перов 2009-01-23 17:37:09 MSK
Ещё попробовал:
mark {
%%BeginFeature: *TKCollate True
<< /Collate true >> setpagedevice
%%EndFeature
} stopped cleartomark

не помогло.


Вообще, проблемы с режимом когда программа отвечает за формирование нужного количесва копий были замечены только при дуплексной печати с нечётным количеством страниц.
Насколько я понимаю, дуплексный режим никак не может сочетаться с разбивкой по копиям. поэтому, если флаг collate стоит, то пускай программа формирует нужное количество копий. В принципе всё должно работать. Только это не правильное решение. Правильней было бы дописать драйвер.

Comment 10 Виталий Перов 2009-01-23 18:20:33 MSK
Как написано в документации по PostScript, в заголовок требуется добавлять
Requirements: numcopies(2) collate

Добавил. Ничего не изменилось
Comment 11 Виталий Перов 2009-01-23 18:43:51 MSK
lpr -P hp -# 2 -o Collate=True filename

Всё прекрасно печатает. Скорей всего это бага CUPS.
Comment 12 Виталий Перов 2009-01-23 19:09:37 MSK
Для начала надо разобраться с функцией ScheduleJob.
Она позволяет печатать разными способами. В том числе и через lpr и через CUPS (вызов cupsPrintFile). Надо выяснить через что документ печатается в данном случае
Comment 13 Виталий Перов 2009-01-23 19:48:18 MSK
[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 */

Да, действительно не используется. Надо разобраться.
Comment 14 Виталий Перов 2009-01-24 11:24:11 MSK
Данный кусок находитсся в CreateSpoolFile(), которая вызывается из OpenJob16().
OpenJob16 тоже находится в gdi32.

Возникает вопрос. Как ей передать ещё один параметр для включения collate?

Вызывается она из PSDRV_StartDocA.

Единственный способ, который я пока вижу - добавлять ещё один бит к параметру LPCSTR lpOutput.
Comment 15 Виталий Перов 2009-01-24 13:06:48 MSK
Написал хак. Для печати используется комманда

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.
Comment 16 Виталий Перов 2009-03-02 14:30:38 MSK
Есть 2 способа печати: напрямую и через спуллер. И зависит это от приложения.

1С использует печать напрямую. С помощью функций StartDoc, EndDoc
http://msdn.microsoft.com/en-us/library/dd162865(VS.85).aspx

Печать через спуллер вызывается совершенно по-другому. Здесь используются функции StartDocPrinter, EndDocPrinter.
ScheduleJob как-раз относится к печати через спуллер. Поэтому при печати из 1с использовать её не получится.
Comment 17 Виталий Перов 2009-03-02 15:57:44 MSK
Ещё заметил, что печать через спуллер ещё не реализована.

Например, StartPagePrinter сейчас заглушка

Сечас ситуация такая:
* При вызове StartDoc создаётся и открывается файл. Ещё новое задание добавляется в таблицу заданий принтера.
* При вызове EndDoc файл закрывается, и задание удаляется.

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

Вообще идея такова:
Переписать систему печати на использование функции lpr.
Функции OpenJob16 посылать строку output в которой уже будет содержатся комманда lpr со всеми параметрами (именем принтера, количеством копий и collate)
Только вот возникает проблема совместимости с другими программами, использующими OpenJob16 напрямую.
Comment 18 Виталий Перов 2009-03-02 17:47:30 MSK
Исходно StartDoc вызывается с параметром output=null если печать идёт на принтер, и output=<имя файла> если печать идёт в файл.

Далее, если output == null, output берётся из physDev->job.output. В данном случае output='LPR:HpTest'

Значение скорее всего появляется после вызова CUPS_LoadPrinters. Записать туда количество копий и collate не получится.

Думаю надо переписать обработку комманды "LPR:" и добавить туда количество копий и collate
Comment 19 Виталий Перов 2009-03-02 19:36:03 MSK
Ура! проблема решена.
Осталось только привести весь код в порядок и сделать патч
Comment 20 Виталий Перов 2009-03-02 20:39:44 MSK
Патч в репозитории eterwine.
Всё работает.

Ещё раз напомнинаю:
Чтобы раскладка по копиям начала работать необходимо УДАЛИТЬ СТАРЫЕ НАСТРОЙКИ из реестра:
ключ (HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Print\Printers\{Имя
принтера})
нужно удалить DefaultDevMode
Comment 21 Vitaly Lipatov 2009-04-10 23:47:56 MSD
(In reply to comment #20)
> нужно удалить DefaultDevMode
Командой
$ wine --removeprinters 

Comment 22 Andrey Vusik 2009-04-11 00:08:40 MSD
*** Bug 3793 has been marked as a duplicate of this bug. ***