Области действия PrintTicket (по умолчанию, пользователь, задание, документ, страница и т. д.)

Я завершаю создание веб-службы, которая создает и распечатывает XPS-документы, отправляя их в различные очереди печати на разных серверах печати. Веб-сервис работает в 2 режимах в зависимости от развертывания сайта. Первый использует учетную запись удостоверения пула приложений в качестве пользователя печати, второй режим использует олицетворение пользователя для принтеров типа «следуй за мной», так что пользователь регистрируется для задания печати. Это все работает нормально.

Мне нужно ориентироваться на определенные лотки в очередях на печать и устанавливать различные другие параметры для каждого задания, поэтому я сгенерировал билеты на печать, добавив пространство имен лотков в xml, и это также работает.

Меня беспокоит это (и именно здесь мне нужно немного подержать руку), потому что я делаю всю эту потоковую серверную часть STA, скажем, Боб работает, пока Боб печатает 200 документов микса (A4, A5, конверт), и билеты выключаются скажем, двусторонняя печать на принтере, и моя учетная запись удостоверения пула приложений работает, скажем, 20 потоков печати с несколькими документами из разных целевых лотков с различными параметрами одновременно, у меня возникнут какие-либо проблемы или я собираюсь взломать настройки очереди принтера по умолчанию?

Согласно MS, MergeAndValidatePrintTicket может быть ограничен на разных уровнях (я соглашусь на уровне работы), но мне просто интересно, может ли кто-нибудь, имеющий опыт работы с этим сценарием, подтвердить это как истину и есть ли какие-либо ошибки, потому что вся эта печать .Net маларки, кажется, пронизан ими.

Маленький совет для тех, кто этим занимается. Если ваши целевые принтеры просты, скажем, только с 3 лотками разных размеров, просто установите размер носителя (ISOA4 или любой другой) в билете и установите входной лоток на неизвестный, и принтер обработает его. К сожалению, принтеры, на которые я ориентируюсь, имеют около 7 лотков, поэтому мне нужно выбрать конкретный лоток.

Спасибо за чтение.


person user1999476    schedule 15.03.2013    source источник
comment
Это зависит от того, что вы делаете с билетами. Если вы прикрепите билет к заданию, все в порядке. Если вы устанавливаете билет в очередь, вы этого не делаете. У вас есть пример кода, где вы используете билеты?   -  person Jon    schedule 16.03.2013
comment
Привет, Джон... Я буду анализировать на уровне работы, так что спасибо за уверенность. Перекодирую завтра. У меня есть административный сайт, который сканирует очередь печати каждого сервера печати и извлекает имена лотков для этого принтера. Когда я это сделаю, я хочу создать билеты для печати и сохранить всю эту информацию в базе данных. У меня есть таблица сопоставления (то есть ручная), в которой указаны размер носителя, тип принтера и пространство имен лотков, которые я присоединю к представлению с данными принтера и присоединю к таблице документов, поэтому doc A4 -> A4 Lex ns0000:Tray 2 -› Lex ns0000:Лоток 2 для печати билета. Я буду использовать .net 4.5 addjob с перегрузкой билетов.   -  person user1999476    schedule 17.03.2013
comment
закончилось место ... Я буду использовать queue.userPrintTicket, затем validationResult.mergeAndValidatePrintTicket, а затем, надеюсь, использовать эту перегрузку .Net 4.5 queue.addjob, которая имеет переменную printticket. Я постараюсь написать код завтра вечером (пн)   -  person user1999476    schedule 17.03.2013


Ответы (1)


Отредактировано, чтобы показать решение

Джон... это соответствующий раздел...

PrintTicket ptclone = pqTarget.UserPrintTicket*.Clone();* ‹ -- удалить Clone()

//мой способ ниже для указания лотка, который будет использоваться для задания, и других настроек. poj — это мой класс printJob.

PrintTicket pt = GetPrintTicketForJob(ptclone, poj.trayMediaSize, poj.trayNameSpace, poj.trayUri);

ValidationResult vr= pqTarget.MergeAndValidatePrintTicket(ptclone, pt, PrintTicketScope.JobScope);

pqTarget.UserPrintTicket = vr.ValidatedPrintTicket; ‹ — удалите это

//pqTarget.Commit() // принт-серверу в режиме localPrintServer не понравилось это под олицетворением пользователя

PrintSystemJobInfo pj = pqTarget.AddJob(poj.id, poj.fileName, false) ‹ — не делайте этого

Я попытался использовать перегрузку .Net 4.5, в которой есть билет на печать, но сервер в режиме localPrintServer не понял этот метод, хотя на сервере есть .Net 4.5, который был...

PrintSystemJobInfo pj = pqTarget.AddJob(poj.id.ToString(), poj.fileName, false, vr.ValidatedPrintTicket) ‹ — сделайте это вместо .Net 4.5, и все заработает

Все работает нормально за исключением следующих....

1) на МФУ, которые управляются сторонним программным обеспечением и используют олицетворение пользователя, настройка двусторонней печати по умолчанию остается активной для первого напечатанного документа, после этого все в порядке. Он работает нормально для Lexmarks (используется идентификатор пула приложений). Лотки правильно назначены для обоих типов, как и другие настройки.

2) Даты и числа (которые вставляются в документы в виде строк) и выглядят нормально в средстве просмотра XPS, переформатируются как шрифт без засечек, даже если абзац, в котором они находятся, написан, скажем, Times New Roman, что сбивает с толку.

Можете ли вы обнаружить какие-либо ошибки?

С уважением

Нил

person user1999476    schedule 18.03.2013
comment
pqTarget.UserPrintTicket = vr.ValidatedPrintTicket; пытается изменить билет в очереди. Это определенно не то, чем вы хотите заниматься. Вы убедились, что ваш проект ориентирован на платформу .net 4.5? Просто его установить недостаточно. - person Jon; 18.03.2013
comment
Кроме того, вы должны отредактировать свои обновления в исходном вопросе, а не добавлять их в качестве ответа. - person Jon; 18.03.2013
comment
Проект нацелен на 4.5, я проверил, и если это не так, вы не видите перегрузок. В комментариях не хватило места, но извиняюсь за дурной тон. Я запутался (потерял) относительно того, где я тогда применяю vr.ValidatedPrintTicket? Я попробую еще раз сегодня утром. Спасибо за ответ - person user1999476; 19.03.2013
comment
Кстати, проблема с датой и номером, похоже, является ошибкой в ​​​​dll, которую я использую для преобразования, и ее производитель предоставляет мне исправление, так что на одну проблему меньше. Сегодня я потратил много времени, пробуя разные способы привязки билетов к заданию, но ни один из них не сработал. Первоначальный билет пользователя на печать всегда остается нетронутым и сохраняет свои настройки, поэтому я не знаю, в чем проблема. - person user1999476; 19.03.2013
comment
Я был немым. Удалите Clone() из первой строки, не указывайте проверенный билет на билет печати пользователя, и он работает - person user1999476; 20.03.2013