Количество копий API диспетчера очереди печати

Мне действительно не помешала бы помощь, этот вопрос задают многие люди в Интернете. У меня разные настройки, пробовал разные способы тестирования, очень расстраивает.

Первая настройка:

  • локальные принтеры

  • локальный рабочий код

  • распечатать из pdf или блокнота: УСПЕШНО (количество копий 2)

  • печать из слова: FAILED (количество копий равно 1)

Вторая установка:

  • локальные принтеры, которые являются общими

  • локальный рабочий код

  • печатать с другого компьютера на общие принтеры

  • количество копий всегда 1

Так чего всем не хватает? Что происходит, когда некоторые поля отсутствуют, а принтер все равно должен знать, что печатать? Что означает слово, которое также происходит при печати с другого компьютера? Может кто-нибудь сказать мне, почему что-то в окнах так ужасно? Все должно пройти спулер, так почему данные неверны?

Наилучшие пожелания!


person Condra963    schedule 29.06.2016    source источник
comment
Этот поток также работает в MSDN: social.msdn.microsoft.com/Forums/en-US/   -  person Condra963    schedule 29.06.2016


Ответы (2)


Принтер печатает листы и страницы, поэтому копии на каком-то этапе преобразуются в страницы.

Данные уведомлений, которые вы получаете, зависят как от приложения, которое печатает, так и от компонентов системы и драйвера, обрабатывающих буферизацию и рендеринг. По моему опыту, на данные нельзя полагаться, и наилучшие данные получаются при анализе файла спула. Это может содержать или не содержать количество копий.

У Word уже давно есть "проблема с копиями". Был патч, предположительно исправляющий это, но другое мнение состоит в том, что это потому, что использует необычный способ печати. Я процитирую часть содержимого ссылки здесь:

Из-за печально известной ошибки Word Copy Count... поле dmCopies равно 1 в SHD. Правильное значение находится в записи DEVMODE в файле SPL (если это буфер EMF).

Единственный другой способ, который я нашел, - это отслеживать поле PrintedPages структуры JOB_INFO_2, когда задание было отправлено на принтер, и смотреть, кратно ли оно TotalPages.

[...]

Происходит не ошибка Word, а ошибка Windows. Word всегда вызывает startDoc с копиями, установленными на 1. После этого вызывает DocumentProperties, вносит изменения в dmCopies и вызывает ResetDC для выполнения обновления. Это странный способ печати, но он не является неправильным. Проблема в том, что файл shd и информация о принтере не обновляются этой информацией, а просто сохраняют информацию о Devmode, установленную при вызове StartDoc.

Но вызов ResetDC, создающий новый DevMode, сохраняется в файле SPL. Вы также можете получить эту информацию, если перехватите вызовы API DocumentProperties.

person Nick Westgate    schedule 30.06.2016
comment
Я много лет разрабатывал драйверы печати для Windows и могу засвидетельствовать, что все продукты MS Office являются одними из самых плохо работающих приложений для печати. Все они используют странные методы, которые почти не используются в других приложениях. - person Carey Gregory; 17.07.2016

Спасибо за ответ. Есть ли способ отследить свойства документа при их изменении?

Структура JOB_INFO_2 имеет те же значения total_pages, что и pages_printed. Так что это не решение.

Файл SPL содержит правильное количество для принтера, на котором я тестировал. НО мы проверили на многих принтерах, и мы видим, что QTY не всегда установлен. Так что не 100% решение. Но уже хороший запасной вариант.

Поэтому, если бы я мог получить свойства документа, не вызывая файл SPL, это было бы замечательно, потому что я думаю, что здесь все правильно. Не так ли?

person Condra963    schedule 30.06.2016
comment
Невозможно публиковать ваши комментарии в качестве ответа, что вы и сделали. Человек, к которому вы пытаетесь обратиться, вероятно, понятия не имеет, что вы опубликовали это. Опубликуйте комментарий к его ответу, если вам все еще нужно спросить. - person Carey Gregory; 17.07.2016
comment
И чтобы ответить на ваш вопрос, перехват вызовов DocumentProperties потребует какой-то инъекции кода. Эти вызовы идут от приложения к GDI и к драйверу печати, и вам придется их перехватывать. Очевидно, что это дорогой вариант с высоким риском. Как сказал Ник Вестгейт в своем ответе, вашими лучшими данными будет файл спула. Разбор этого тоже не пустяк. - person Carey Gregory; 17.07.2016
comment
Да, если вы можете установить на каждом клиенте, вы можете попробовать подключить API DocumentProperties с помощью инъекции DLL, но IIRC вы все равно можете столкнуться с проблемами с драйверами, использующими нестандартные DEVMODE. Печать Windows GDI — это беспорядок, и о новом пути XPS мало говорят. - person Nick Westgate; 18.07.2016
comment
Можете ли вы привести пример того, как получить эту информацию (реальное количество копий в файле Word) из записи DEVMODE в файле SPL. Теперь я получил dmCopies из DEVMODE Jobinfo_2, но, как вы говорите, я не знаю, как это сделать. - person karelp90; 31.10.2017
comment
@karelp90: Это похоже на вопрос. Кого ты спрашиваешь? Condra963, который не заходил с июня? Это должно быть опубликовано как отдельный вопрос с тегами, аналогичными приведенному выше вопросу, и тогда те, кто отметит теги, будут уведомлены. Ответят ли они, будет зависеть от того, хотят ли они провести драгоценные моменты своей жизни, печатая ответ, который, вероятно, никогда не будет принят или даже не будет одобрен. Используйте ТАК с умом. Ваш вопрос связан с этим? - person Nick Westgate; 31.10.2017
comment
@ Condra963 Condra963 ты нашел решение о dmCopies из документа Word??? У меня такая же проблема - person karelp90; 02.11.2017
comment
@ karelp90 Это просто ошибка, возможно, есть другие способы узнать количество копий, я не знаю, как вы это делаете в данный момент? Вы всегда можете отправить мне письмо или сообщение здесь, в stackoverflow. - person Condra963; 03.05.2018