Bug 8718

Summary: WINE формирует неправильные задания для двусторонней печати при альбомной ориентации листа
Product: WINE@Etersoft Reporter: Денис Баранов <baraka>
Component: Печать ; Диалог печатиAssignee: Евгений <evcalipt>
Status: CLOSED FIXED QA Contact: Константин Кондратюк <kondratyuk>
Severity: major    
Priority: P1 CC: baraka, kondratyuk, lav, oren-ibc
Version: unspecified   
Target Milestone: ---   
Hardware: PC   
OS: All   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Deadline: 2012-10-18   

Description Денис Баранов 2012-09-24 19:24:53 MSK
При альбомной печати (горизонт) из 1С тыльная сторона листа приобретает неверную ориентацию "вверх ногами", при портретной печати (вертикаль) - двусторонняя печать проходит успешно.

Нужно проверить и передать на исправление.
Comment 1 Danil Michailov 2012-09-24 21:41:28 MSK
Думал над решением
Comment 2 Danil Michailov 2012-09-24 21:42:18 MSK
Добавить в CUPS принтер поддерживающий двустороннюю печать и постскрипт.
Comment 3 Danil Michailov 2012-09-27 20:48:23 MSK
Какая модель принтера у пользователя?
Comment 4 Денис Баранов 2012-10-01 14:26:51 MSK
HP 2055D
Comment 5 Danil Michailov 2012-10-01 20:15:02 MSK
Как воспроизвести:
1) зайти в бутылку:
swine -h eter-2.0 autotest/1c82_1 --force 
2) перейти в пакпку 1с82 и запустить
WINEDEBUG=+winspool wine 1cv8.exe 2> 1111aaa_log_duplex
3) покликать далее в правом нижнем углу, открыть вкладку Предприятие, справа  внизу Отчеты, нажать ОСВ, нажать печать, выбрать дополнительные настройки печати, например альбомная long-edge
4) открыть файл и поискать по слову lpr

в выводе видно, что альбомная ориентация и книжная не меняют формат lpr запроса, возможно проблема в этом, возможно где-то другом месте

*альбомная шорт
 trace:winspool:ScheduleJob Destination string = 'L"|lpr -P'duplex' -T'Табличный документ' 
  -# 1 -o Collate=False -o sides=two-sided-short-edge"'
 trace:winspool:schedule_pipe printing with: lpr -P'duplex' -T'Табличный документ' 
  -# 1 -o Collate=False -o sides=two-sided-short-edge
*альбомная лонг
 trace:winspool:ScheduleJob Destination string = 'L"|lpr -P'duplex' -T'Табличный документ'
  -# 1 -o Collate=False -o sides=two-sided-long-edge"'
 trace:winspool:schedule_pipe printing with: lpr -P'duplex' -T'Табличный документ'
  -# 1 -o Collate=False -o sides=two-sided-long-edge
*книжная шорт
 trace:winspool:ScheduleJob Destination string = 'L"|lpr -P'duplex' -T'Табличный документ'
  -# 1 -o Collate=False -o sides=two-sided-short-edge"'
 trace:winspool:schedule_pipe printing with: lpr -P'duplex' -T'Табличный документ'
  -# 1 -o Collate=False -o sides=two-sided-short-edge
*книжная лонг
 trace:winspool:ScheduleJob Destination string = 'L"|lpr -P'duplex' -T'Табличный документ'
  -# 1 -o Collate=False -o sides=two-sided-long-edge"'
 trace:winspool:schedule_pipe printing with: lpr -P'duplex' -T'Табличный документ'.
  -# 1 -o Collate=False -o sides=two-sided-long-edge
*книжная офф
 trace:winspool:ScheduleJob Destination string = 'L"|lpr -P'duplex' -T'Табличный документ'
  -# 1 -o Collate=False -o sides=one-sided"'
 trace:winspool:schedule_pipe printing with: lpr -P'duplex' -T'Табличный документ' 
  -# 1 -o Collate=False -o sides=one-sided
Comment 6 Danil Michailov 2012-10-01 20:18:07 MSK
Как воспроизвести:
1) зайти в бутылку:
swine -h eter-2.0 autotest/1c82_1 --force 
2) перейти в пакпку 1с82 и запустить
WINEDEBUG=+winspool wine 1cv8.exe 2> 1111aaa_log_duplex
3) покликать далее в правом нижнем углу, открыть вкладку Предприятие, справа  внизу Отчеты, нажать ОСВ, нажать печать, выбрать принтер duplex, выбрать дополнительные настройки печати, например альбомная long-edge
4) открыть файл и поискать по слову lpr

в выводе видно, что альбомная ориентация и книжная не меняют формат lpr запроса,  возможно проблема в этом, возможно где-то другом месте.
Так же не влияет выбор принтера

*альбомная шорт
 trace:winspool:ScheduleJob Destination string = 'L"|lpr -P'duplex' -T'Табличный документ' 
  -# 1 -o Collate=False -o sides=two-sided-short-edge"'
 trace:winspool:schedule_pipe printing with: lpr -P'duplex' -T'Табличный документ' 
  -# 1 -o Collate=False -o sides=two-sided-short-edge
*альбомная лонг
 trace:winspool:ScheduleJob Destination string = 'L"|lpr -P'duplex' -T'Табличный документ'
  -# 1 -o Collate=False -o sides=two-sided-long-edge"'
 trace:winspool:schedule_pipe printing with: lpr -P'duplex' -T'Табличный документ'
  -# 1 -o Collate=False -o sides=two-sided-long-edge
*книжная шорт
 trace:winspool:ScheduleJob Destination string = 'L"|lpr -P'duplex' -T'Табличный документ'
  -# 1 -o Collate=False -o sides=two-sided-short-edge"'
 trace:winspool:schedule_pipe printing with: lpr -P'duplex' -T'Табличный документ'
  -# 1 -o Collate=False -o sides=two-sided-short-edge
*книжная лонг
 trace:winspool:ScheduleJob Destination string = 'L"|lpr -P'duplex' -T'Табличный документ'
  -# 1 -o Collate=False -o sides=two-sided-long-edge"'
 trace:winspool:schedule_pipe printing with: lpr -P'duplex' -T'Табличный документ'.
  -# 1 -o Collate=False -o sides=two-sided-long-edge
*книжная офф
 trace:winspool:ScheduleJob Destination string = 'L"|lpr -P'duplex' -T'Табличный документ'
  -# 1 -o Collate=False -o sides=one-sided"'
 trace:winspool:schedule_pipe printing with: lpr -P'duplex' -T'Табличный документ' 
  -# 1 -o Collate=False -o sides=one-sided
Comment 8 Danil Michailov 2012-10-16 16:49:44 MSK
Не ясно как тестировать дальше без наличия двустороннего принтера, в lpr запросе не идет речи об ориентации листа.
Я спрашивал у Дениса какие есть варианты еще, он никаких других способов проверки не предложил.
Comment 9 Евгений 2012-10-17 17:00:42 MSK
Разбирался с задачей.

В wwo ошибок еще больше, чем у нас. Это и понятно - Виталий Перов делал хаки в winspool.

Необходимо тестирование на стороне клиента, которое разбивается на 3 этапа:

I Этап. Создание файла PostScript.

Описание для пользователя:
1. Зайти в 1с82 (через wine, естественно), выбрать документ для печати, выбрать интересующий принтер, в свойствах принтера нужную ориентацию (книжная, альбомная - portrait, landscape) и нужный вариант двухсторонней печати (long-edge, short-edge).

2. Выбрать настройку "печатать в файл" и начать напечатать файл. (можно указать любое расширение файла)
3. В итоге получится файл PostScript. Он то нам и нужен.



II Этап. Передача файла PostScript на печать командой lpr с нужными параметрами. 

Далее:
1. Полученный файл запустить на печать в bash (не в wine) командой lpr. (Естественно нужно находиться в каталоге с файлом)

2. Теперь варианты:
Если Вас изначально интересовала портретная печать с long-edge то написать так:
lpr -P ИмяПринтера -o orientation-requested=3 -o sides=two-sided-long-edge ИмяФайла

Если Вас изначально интересовала портретная печать с short-edge то написать так:
lpr -P ИмяПринтера -o orientation-requested=3 -o sides=two-sided-short-edge ИмяФайла

Если Вас изначально интересовала альбомная печать с long-edge то написать так:
lpr -P ИмяПринтера -o orientation-requested=4 -o sides=two-sided-long-edge ИмяФайла

Если Вас изначально интересовала альбомная печать с long-edge то написать так:
lpr -P ИмяПринтера -o orientation-requested=4 -o sides=two-sided-long-edge ИмяФайла

Note: Хотя имя принтера по умолчанию можно не указывать, но так как проблема может быть специфична для какого-то принтера, советуем указать имя принтера на котором у Вас возникают проблемы явно.

III Этап. Выводы:

Если все получилось так как хотел пользователь, то сообщение нам, тех параметров lpr и того что он хотел изначально.
Если нет - все информация об ошибке и последовательности действий пользователя.

User Guide have completed.)
Comment 10 Константин Кондратюк 2012-10-22 10:19:45 MSK
[09:18:25] <[ИБК] Евгений Васильев> я кажись нашел в чем косяк и почему у меня все работает на линуксе и не работает в wine
[09:19:08] <[ИБК] Евгений Васильев> опция 'sides=two-sided-short-edge' тут не работает вообще...
[09:19:14] <[ИБК] Евгений Васильев> почему не знаю....
[09:19:58] <[ИБК] Евгений Васильев> линукс делает альбомной печать в PostScript
[09:20:29] <[ИБК] Евгений Васильев> то есть, если открыть файлик, то он там альбомный, если ты указал альбомный
[09:21:09] <[ИБК] Евгений Васильев> а wine делает PostScript файлы только планшетными
[09:21:44] <[ИБК] Евгений Васильев> и пытается перевернуть их при помощи именно опций lpr, которые не работают
[09:24:33] <[ИБК] Евгений Васильев> если же ты его крутишь через lpr -o orientation-requested=4 , то он переворачивает саму картинку, а лист оставляет планшетным
Comment 11 Vitaly Lipatov 2012-10-22 11:40:18 MSK
См. похожую проблему в https://bugs.etersoft.ru/show_bug.cgi?id=3688
Возможно у человека действительно игнорируются параметры lpr. поэтому ничего и не поворачивается нужным образом.
Comment 18 Евгений 2012-10-30 21:45:36 MSK
Разбирался с задачей. 

Как я уже говорил wwo не печетает ничего хорошего.

В функции prepare_destination_string в winspool.drv не происходит формирование lpr запроса с ориентацией. Эта функция используется в ScheduleJob, которая отправляет задание на печать. Возможно в prepare_destination_string нужно будет явно задавать -o orientation. По сути ориентация и поворот для двухсторонней печати задается пользователем в Wine при печати и это должно обрабатываться как-то внутри и не касаться ScheduleJob. Получается рассогласование - в разных частях кода формируются разные куски задания для печати. Хотя возможно так и надо, нужно разобраться. 

Лог:  
trace:winspool:ScheduleJob Destination string = 'L"|lpr -P'duplex' -T'Табличный документ' -# 48 -o Collate=True -o sides=one-sided"'
trace:winspool:schedule_pipe printing with: lpr -P'duplex' -T'Табличный документ' -# 48 -o Collate=True -o sides=one-sided
Comment 19 Константин Кондратюк 2012-11-14 11:52:43 MSK
У lpr есть опция Duplex, которая влияет на двустороннюю печать. Возможно, они должны добавляться при выборе двусторонней печати и long/short-sided способа печати.

[11:43:51] <[ИБК] Евгений Васильев> нужные опции: 
[11:44:06] <[ИБК] Евгений Васильев> lpr -P HP2055 -o Duplex=DuplexTumble test.ps - для короткой строны 
[11:44:23] <[ИБК] Евгений Васильев> lpr -P HP2055 -o Duplex=DuplexNoTumble test.ps - для длинной стороны 
[11:46:00] <[ИБК] Евгений Васильев> lpr -P HP2055 -o Duplex=Node test.ps - для односторонней печати
Comment 20 Евгений 2012-11-14 17:54:11 MSK
Не понятно в чем проблема. Я долго медитировал над исходным кодом - смысл в том, что в нем нет и намека на формирование запроса -o Duplex=Duplex[что-то там]. И так как парсер PostScript в Wine сделан настолько ужасно (нет поддержки высокоуровнивых конструкций PP и т.д. Кстати, нормальные конструкции преобразует во что-то не читаемое и дьявольское) насколько можно - то, единственным разумным объяснением будет то, что lpr игнорирует то, что написано в PostScript файле. Так может происходить и не только из-за ужасности файла, но по другим очень многим причинам, две из которых - версия lpr и модель принтера. Поэтому...

Проверьте, чтобы у Вас была последняя версия lpr и обновите драйвер принтера, при необходимости. Сообщите результаты. 

P.S. По-хорошему многое из парсера PostScript нужно исправлять.
Comment 21 Евгений Васильев 2012-11-14 23:31:26 MSK
Евгений, Костя написал, что я нашел. Опишу подробнее...
После всех "lpr -o sides=two-sided-short-edge" и т.п. экспериментов нашел интересную штуку.
То что вы сделали с "Orientation: Landscape" - стало верно формировать файл ps. Он стал показывать все как положено. Но ситуацию не исправило, после чего я попробовал напечатать получившийся ps через программу просмотра ps. Та его печатает как есть, то есть ps в spool cups попадал как есть, и при этом печатался как нужно. Далее я посмотрел сопроводительный файлик к ps в spool, откуда и вытащил DuplexTumble.
Далее когда lpr c опцией "-o Duplex=DuplexTumble" стал печатать как нужно, я сравнил сопроводительный файлик в спулере и убедился что они практически идентичны другим файлам сформированным из другого ПО.

Почему работает "-o Duplex=DuplexTumble", а не "-o sides=two-sided-short-edge" не знаю.

Можете конечно по экспериментировать командами PS.
http://forums.adobe.com/message/2057542

Огромная просьба сделать по быстрее.

PS: wine формирует странные названия печати типа Табличный документ предположительно проблема с кодировкой. Если уж копаете систему печать, то может попадется место формирования названия файла.

Косяк с названием формируется в команде отправки, так как сие видел только сопроводительном файле к PS, в самом PS ничего похожего не замечено.
Comment 22 Евгений Васильев 2012-11-15 10:36:08 MSK
Бага старая http://bugs.etersoft.ru/show_bug.cgi?id=3982
Comment 24 Евгений Васильев 2012-11-22 12:39:03 MSK
Бегло осмотрел код cups 1.5.3 и 1.4.7.
Судя по всему значение two-sided-short-edge выставляет значение DuplexTumble в теле cups, потому как именно DuplexTumble используется в PPD файлах, и далее уже в cups крутиться везде DuplexTumble. По крайней мере в patch файлах ничего с дуплексом я не нашел. Могу предположить, что проблема внутри cups и логичнее крутить именно Duplex=DuplexTumble.
Comment 25 Vitaly Lipatov 2012-11-23 21:34:32 MSK
В /etc/wine/config добавлен параметр WINEPRINTING, управляющий способом печати.
Сборка открытой части 2.0.3-alt6, доступная через 2.0-testing.

Просьба проверить на реальном принтере печать при запуске следующим образом:

$ WINEPRINTING=duplex wine 1cv8.exe
и
$ WINEPRINTING=original wine 1cv8.exe

WINEPRINTING=sides (по умолчанию) соответствует старому методу.

commit bddb4481fedba55484d8f01dca31b5f0890708d7
Author: Vitaly Lipatov <lav@etersoft.ru>
Date:   Fri Nov 23 18:42:55 2012 +0400

    intro WINEPRINTING={original,sides,duplex} config var and use it (eterbug #3982)


P.S.
Проблема с названием задания пока не уточнена.
Comment 26 Евгений Васильев 2012-11-26 07:28:42 MSK
WINEPRINTING=duplex, выставил в /etc/wine/config.
HP 2055D запечатал правильно на Ubuntu 10.04.4 x64

Клиент передает спасибо...
От меня спасибо!
Comment 27 Евгений 2012-11-27 12:46:38 MSK
Евгений, Вы писали что имена плохо отображаются в ScheduleJob. Я достаточно бегло ничего подобного не обнаружил. Имена работ принтера (printer jobs) отображались у меня верно. Я тестировал в 1с77 и 1с82. 
Да, Вы правы, проблема с именами если и есть, то в формировании строки lpr. Я проверил и в коде есть вызов специальной функции WideCharToMultiByte, которая меняет кодировку определенной строки. Она как раз применяется ко всей сформированной lpr.
Возможно проблемы у Вас на машине?

Вот несколько логов:
из 1с77
trace:winspool:ScheduleJob Destination string = 'L"|lpr -P'duplex' -T'C:\\Program Files\\1cv82\\bug8778\\Таблица.mxl' -# 112 -o Collate=True -o sides=one-sided"'

из notepad
trace:winspool:ScheduleJob Destination string = 'L"|lpr -P'duplex' -T'noname' -# 112 -o Collate=True -o sides=one-sided"'

из 1с82 
trace:winspool:ScheduleJob Destination string = 'L"|lpr -P'CUPS-PDF' -T'Табличный документ' -# 26465 -o Collate=True -o sides=one-sided"'

Напишите, пожалуйста, подробно последовательность действий как Вы пришли к плохому отображению имен, чтобы наши тестеры смогли локализовать ошибку. Что запускали, какой версии и т.д.
Comment 28 Евгений Васильев 2012-11-28 18:36:02 MSK
Каракули появились после установил wine 2.0 на ubuntu 10.04.4 x64, в wine
1.0.12 их не было.
На тему воспроизводимости прошу обратить на log Danil Michailov 2012-10-01
20:15:02 MSD https://bugs.etersoft.ru/show_bug.cgi?id=8718#c5
Тут четко видны каракули...
Цитата....
-------------------------------------------------------------------------
Отработанное время: 4.0
Как воспроизвести:
1) зайти в бутылку:
swine -h eter-2.0 autotest/1c82_1 --force 
2) перейти в пакпку 1с82 и запустить
WINEDEBUG=+winspool wine 1cv8.exe 2> 1111aaa_log_duplex
3) покликать далее в правом нижнем углу, открыть вкладку Предприятие, справа 
внизу Отчеты, нажать ОСВ, нажать печать, выбрать дополнительные настройки
печати, например альбомная long-edge
4) открыть файл и поискать по слову lpr

в выводе видно, что альбомная ориентация и книжная не меняют формат lpr
запроса, возможно проблема в этом, возможно где-то другом месте

*альбомная шорт
 trace:winspool:ScheduleJob Destination string = 'L"|lpr -P'duplex'
-T'Табличный документ' 
  -# 1 -o Collate=False -o sides=two-sided-short-edge"'
 trace:winspool:schedule_pipe printing with: lpr -P'duplex'
-T'Табличный документ' 
  -# 1 -o Collate=False -o sides=two-sided-short-edge
*альбомная лонг
 trace:winspool:ScheduleJob Destination string = 'L"|lpr -P'duplex'
-T'Табличный документ'
  -# 1 -o Collate=False -o sides=two-sided-long-edge"'
 trace:winspool:schedule_pipe printing with: lpr -P'duplex'
-T'Табличный документ'
  -# 1 -o Collate=False -o sides=two-sided-long-edge
*книжная шорт
 trace:winspool:ScheduleJob Destination string = 'L"|lpr -P'duplex'
-T'Табличный документ'
  -# 1 -o Collate=False -o sides=two-sided-short-edge"'
 trace:winspool:schedule_pipe printing with: lpr -P'duplex'
-T'Табличный документ'
  -# 1 -o Collate=False -o sides=two-sided-short-edge
*книжная лонг
 trace:winspool:ScheduleJob Destination string = 'L"|lpr -P'duplex'
-T'Табличный документ'
  -# 1 -o Collate=False -o sides=two-sided-long-edge"'
 trace:winspool:schedule_pipe printing with: lpr -P'duplex'
-T'Табличный документ'.
  -# 1 -o Collate=False -o sides=two-sided-long-edge
*книжная офф
 trace:winspool:ScheduleJob Destination string = 'L"|lpr -P'duplex'
-T'Табличный документ'
  -# 1 -o Collate=False -o sides=one-sided"'
 trace:winspool:schedule_pipe printing with: lpr -P'duplex'
-T'Табличный документ' 
  -# 1 -o Collate=False -o sides=one-sided
-------------------------------------------------------------
Тут видно, что есть "бутылка" с каракулями. У Danil Michailov есть знание как
он сделал "бутылку" с каракулями. И видно что 1с 8.2 эти каракули печатает.
Могу предположить, что это очередная особенность Ubuntu.
Comment 29 Vitaly Lipatov 2013-04-16 22:27:39 MSK
Решено добавлением WINEPRINTING=sides.