2014-02-18 2 views
6

В настоящее время я работаю над приложением печати. Это приложение требует, чтобы определенные страницы приходили с определенных лотков на принтер. Вот кишки, что у меня до сих пор:XPSDocumentWriter - Печать конкретных страниц в определенные лотки

foreach (var dto in dispensersToPrint) 
    { 
     var documents = FilterDocumentSections(DispenserDocumentsToPrint.RetrieveByDispenserId(dto.DispenserId)); 
     var groupedDocs = documents.GroupBy(t => t.DocumentTypeId); 
     var queueName = Properties.Settings.Default.PrinterName; 
     var queue = RawPrinterHelper.GetPrintQueue(queueName); 
     var seq = new FixedDocumentSequence(); 
     var xpsWriter = PrintQueue.CreateXpsDocumentWriter(queue); 

     foreach (var docGroup in groupedDocs) 
     { 
      var printTicket = queue.DefaultPrintTicket.Clone(); 
      var printTray = MapPrintTray((DocumentSectionType)docGroup.Key); 
      if (!printTray.IsNullOrEmpty()) 
      { 
       printTicket = RawPrinterHelper.ModifyPrintTicket(printTicket, "psk:JobInputBin", printTray); 
      } 
      var fixedDoc = new FixedDocument(); 
      fixedDoc.PrintTicket = printTicket; 

      foreach (var doc in docGroup) 
      { 
       var pageContent = new PageContent(); 
       var fixedPage = new FixedPage(); 

       var localFileName = string.Empty; 
       var unzippedFileName = string.Empty; 
       //copy files locally 
       localFileName = CopyFileToLocalMachine(doc.FileName); 
       //unzip file 
       unzippedFileName = EmfPrintingHelper.UnzipEmfFile(localFileName); 
       var itemToPrint = new PrintableEmfImage 
              { 
               DataContext = new EmfImageViewModel { FileName = unzippedFileName } 
              }; 
       fixedPage.Children.Add(itemToPrint); 
       pageContent.Child = fixedPage; 
       fixedDoc.Pages.Add(pageContent); 
      } 
      var docRef = new DocumentReference(); 
      docRef.SetDocument(fixedDoc); 
      seq.References.Add(docRef); 
     } 
     xpsWriter.Write(seq); 
    } 

на реальном высоком уровне:

  • Для каждого диспенсера (Work Order), мне нужно напечатать; Сначала я начинаю с группировки с помощью типа DocumentType (то есть типа печати A в лоток 1)
  • Затем я создаю новый параметр FixedDocumentSequence
  • Для каждого типа DocumentType; Затем я создаю фиксированный документ. Затем я изменяю билет на печать, чтобы посмотреть соответствующий лоток.
  • Затем я создаю каждую отдельную страницу для каждого типа документа; и добавить их в FixedDocument
  • Как только здание FixedDocument будет завершено; Я добавляю его в DocumentSequence.
  • Затем я отправляю FixedDocumentSequence в xpsWriter.

Но почему-то; эти настройки не выполняются. Я получаю все документы, распечатывающие один лоток.

Вот некоторые из моих наблюдений до сих пор:

  • Модифицирующая билета печати делает работу; Я проверил это, отправив измененный printTicket в xpsWriter; но это относится к настройкам ко всему заданию; это не для меня.
  • При запросе моих возможностей печати; я заметил, что у меня только JobInputBin. Я не совсем думаю, что это означает, что этот принтер не поддерживает функциональность; поскольку печать с несколькими лотками работает из аналогичного приложения WindowsForms (которое использует PageSettings.PaperSource)

Любые идеи о том, что я мог бы попробовать дальше? Кто-нибудь успешно делал что-то подобное раньше?

ответ

3

Начну с того, что у меня нет доступа к принтеру с лотками, поэтому, к сожалению, я не могу проверить это решение. Тем не менее, я обращу ваше внимание на сообщение форума MSDN, here, где исходный плакат преследовал одно и то же поведение на панели.

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

В сообщении есть несколько разных пользователей, каждый из которых ссылается на решение своей конкретной проблемы. Тем не менее, тот, который кажется наиболее актуальным в этом случае, является решением, касающимся пространств имен, которые неправильно учитываются в ModifyPrintTicket() (как опубликовано Jo0815). Я говорю «самое актуальное», потому что плакат говорит о том, что лоток для печати не учитывается. Они (wittersworld) предоставляют альтернативную реализацию для исправления проблемы. В сообщении на MSDN ссылка на полный источник не работает, но может быть расположена here.

Суть в том, на ModifyPrintTicket(), они добавляют параметр namespaceUri, то жгутов изменил это:

if (node != null) 
{ 
    node.Attributes["name"].Value = newValue; 
} 

к этому:

if (node != null) 
{ 
    if (newValue.StartsWith("ns0000")) 
    { 
     // add namespace to xml doc 
     XmlAttribute namespaceAttribute = xmlDoc.CreateAttribute("xmlns:ns0000");     
     namespaceAttribute.Value = namespaceUri;     
     xmlDoc.DocumentElement.Attributes.Append(namespaceAttribute); 
    } 
    node.Attributes["name"].Value = newValue; 
} 

позволяет пользователю указать специфическую для принтера пространство имен используется ,

Надеюсь, это полезно.

Смежные вопросы