Aracılığıyla paylaş


Yazdırma iş akışını özelleştirme

Yazdırma iş akışı uygulaması kullanarak özel yazdırma iş akışı deneyimleri oluşturun.

Genel Bakış

Yazdırma iş akışı uygulamaları,Microsoft Store cihaz uygulamalarının (WSDA) işlevselliğini genişleten UWP uygulamalarıdır, bu nedenle daha fazla bilgi edinmeden önce WSDA'lar hakkında bilgi sahibi olmanız yararlı olacaktır.

WSDA'larda olduğu gibi, bir kaynak uygulamanın kullanıcısı bir şeyi yazdırmayı seçer ve yazdırma iletişim kutusunda gezindiğinde, sistem bir iş akışı uygulamasının bu yazıcıyla ilişkili olup olmadığını denetler. Bu durumda, yazdırma iş akışı uygulaması başlatılır (öncelikle bir arka plan görevi olarak; aşağıda daha fazla bilgi bulabilirsiniz). İş akışı uygulaması hem yazdırma biletini (geçerli yazdırma görevi için yazıcı cihazı ayarlarını yapılandıran XML belgesi) hem de yazdırılacak olan gerçek XPS içeriğini değiştirebilir. İsteğe bağlı olarak işlem boyunca bir kullanıcı arabirimi başlatarak bu işlevi kullanıcıya sunabilir. Çalışmasını yaptıktan sonra, baskı içeriğini ve baskı biletini sürücüye geçirir.

Arka plan ve ön plan bileşenlerini içerdiğinden ve diğer uygulamalarla işlevsel olarak birleştiğinden, yazdırma iş akışı uygulamasının uygulanması diğer UWP uygulamaları kategorilerine göre daha karmaşık olabilir. Farklı özelliklerin nasıl uygulanabileceğini daha iyi anlamak için bu kılavuzu okurken İş Akışı uygulaması örneği incelemeniz önerilir. Basitlik açısından çeşitli hata denetimleri ve kullanıcı arabirimi yönetimi gibi bazı özellikler bu kılavuzda yoktur.

Başlangıç Yapmak

İş akışı uygulamasının uygun zamanda başlatılabilmesi için yazdırma sistemine giriş noktasını belirtmesi gerekir. Bu, UWP projesinin Application/Extensions dosyasının öğesine aşağıdaki bildirimin eklenmesiyle gerçekleştirilir.

<uap:Extension Category="windows.printWorkflowBackgroundTask"  
    EntryPoint="WFBackgroundTasks.WfBackgroundTask" />

Önemli

Yazdırma özelleştirmesinin kullanıcı girişi gerektirmediği birçok senaryo vardır. Bu nedenle, yazdırma iş akışı uygulamaları varsayılan olarak arka plan görevleri olarak çalışır.

Bir iş akışı uygulaması yazdırma işini başlatan kaynak uygulamayla ilişkiliyse (bu konudaki yönergeler için sonraki bölüme bakın), yazdırma sistemi bildirim dosyalarını bir arka plan görev giriş noktası için inceler.

Yazdırma bileti üzerinde arka plan çalışması yap.

Yazdırma sisteminin iş akışı uygulamasıyla yaptığı ilk şey, arka plan görevini (bu durumda, WfBackgroundTask ad alanında WFBackgroundTasks sınıfı) etkinleştirmektir. Arka plan görevinin Run yönteminde, görevin tetikleyici ayrıntılarını PrintWorkflowTriggerDetails örneği olarak atamanız gerekir. Bu, yazdırma iş akışı arka plan görevi için özel işlevsellik sağlar. PrintWorkflowSession özelliği, PrintWorkFlowBackgroundSessionörneğini ortaya koyar. Hem arka plan hem de ön plan çeşitleri olan yazdırma iş akışı oturum sınıfları, yazdırma iş akışı uygulamasının sıralı adımlarını denetler.

Ardından bu oturum sınıfının oluşturacağı iki olay için işleyici yöntemlerini kaydedin. Bu yöntemleri daha sonra tanımlayacaksınız.

public void Run(IBackgroundTaskInstance taskInstance) {
    // Take out a deferral here and complete once all the callbacks are done
    runDeferral = taskInstance.GetDeferral();

    // Associate a cancellation handler with the background task.
    taskInstance.Canceled += new BackgroundTaskCanceledEventHandler(OnCanceled);

    // cast the task's trigger details as PrintWorkflowTriggerDetails
    PrintWorkflowTriggerDetails workflowTriggerDetails = taskInstance.TriggerDetails as PrintWorkflowTriggerDetails;

    // Get the session manager, which is unique to this print job
    PrintWorkflowBackgroundSession sessionManager = workflowTriggerDetails.PrintWorkflowSession;

    // add the event handler callback routines
    sessionManager.SetupRequested += OnSetupRequested;
    sessionManager.Submitted += OnXpsOMPrintSubmitted;

    // Allow the event source to start
    // This call blocks until all of the workflow callbacks complete
    sessionManager.Start();
}

Start yöntemi çağrıldığında, oturum yöneticisi önce SetupRequested olayını başlatır. Bu olay, yazdırma görevi ve yazdırma bileti hakkında genel bilgileri sağlar. Bu aşamada, yazdırma bileti arka planda düzenlenebilir.

private void OnSetupRequested(PrintWorkflowBackgroundSession sessionManager, PrintWorkflowBackgroundSetupRequestedEventArgs printTaskSetupArgs) {
    // Take out a deferral here and complete once all the callbacks are done
    Deferral setupRequestedDeferral = printTaskSetupArgs.GetDeferral();

    // Get general information about the source application, print job title, and session ID
    string sourceApplicationName = printTaskSetupArgs.Configuration.SourceAppDisplayName;
    string jobTitle = printTaskSetupArgs.Configuration.JobTitle;
    string sessionId = printTaskSetupArgs.Configuration.SessionId;

    // edit the print ticket
    WorkflowPrintTicket printTicket = printTaskSetupArgs.GetUserPrintTicketAsync();

    // ...

Önemli olan, SetupRequested işleminin, uygulamanın ön plan bileşenini başlatıp başlatmayacağını belirlemesidir. Bu, daha önce yerel depolamaya kaydedilmiş bir ayara veya yazdırma biletinin düzenlenmesi sırasında gerçekleşen bir olaya bağlı olabilir veya uygulamanızın statik bir ayarı olabilir.

// ...

if (UIrequested) {
    printTaskSetupArgs.SetRequiresUI();

    // Any data that is to be passed to the foreground task must be stored the app's local storage.
    // It should be prefixed with the sourceApplicationName string and the SessionId string, so that
    // it can be identified as pertaining to this workflow app session.
}

// Complete the deferral taken out at the start of OnSetupRequested
setupRequestedDeferral.Complete();

Yazdırma işinde ön plan işi yapma (isteğe bağlı)

SetRequiresUI yöntemi çağrıldıysa, yazdırma sistemi ön plan uygulamasına giriş noktası için bildirim dosyasını inceler. Application/Extensions dosyanızın öğesi aşağıdaki satırlara sahip olmalıdır. EntryPoint değerini ön plan uygulamasının adıyla değiştirin.

<uap:Extension Category="windows.printWorkflowForegroundTask"  
    EntryPoint="MyWorkFlowForegroundApp.App" />

Ardından, yazdırma sistemi, verilen uygulama giriş noktası için OnActivated yöntemini çağırır. App.xaml.cs dosyasının OnActivated yönteminde, iş akışı uygulamasının bir iş akışı etkinleştirmesi olduğunu doğrulamak için etkinleştirme türünü denetlemesi gerekir. Bu durumda, iş akışı uygulaması etkinleştirme bağımsız değişkenlerini bir PrintWorkflowUIActivatedEventArgs nesnesine dönüştürebilir ve bu nesne, bir PrintWorkflowForegroundSession nesnesini bir özellik olarak sunar. Bu nesne, önceki bölümdeki arka plan karşılığı gibi, yazdırma sistemi tarafından tetiklenen olayları içerir ve bunlara işleyiciler atayabilirsiniz. Bu durumda, olay işleme işlevi WorkflowPageadlı ayrı bir sınıfta uygulanır.

İlk olarak, App.xaml.cs dosyasında:

protected override void OnActivated(IActivatedEventArgs args){

    if (args.Kind == ActivationKind.PrintWorkflowForegroundTask) {

        // the app should instantiate a new UI view so that it can properly handle the case when
        // several print jobs are active at the same time.
        Frame rootFrame = new Frame();
        if (null == Window.Current.Content)
        {
            rootFrame.Navigate(typeof(WorkflowPage));
            Window.Current.Content = rootFrame;
        }

        // Get the main page
        WorkflowPage workflowPage = (WorkflowPage)rootFrame.Content;

        // Make sure the page knows it's handling a foreground task activation
        workflowPage.LaunchType = WorkflowPage.WorkflowPageLaunchType.ForegroundTask;

        // Get the activation arguments
        PrintWorkflowUIActivatedEventArgs printTaskUIEventArgs = args as PrintWorkflowUIActivatedEventArgs;

        // Get the session manager
        PrintWorkflowForegroundSession taskSessionManager = printTaskUIEventArgs.PrintWorkflowSession;

        // Add the callback handlers - these methods are in the workflowPage class
        taskSessionManager.SetupRequested += workflowPage.OnSetupRequested;
        taskSessionManager.XpsDataAvailable += workflowPage.OnXpsDataAvailable;

        // start raising the print workflow events
        taskSessionManager.Start();
    }
}

Kullanıcı arabirimi olay işleyicilerini ekledikten ve OnActivated yönteminden çıktıktan sonra, yazdırma sistemi kullanıcı arabiriminin işlemesi için SetupRequested olayını başlatır. Bu olay, yazdırma işi bilgileri ve yazdırma bileti belgesi de dahil olmak üzere, ancak ek kullanıcı arabiriminin başlatılmasını isteme olanağı olmadan arka plan görevi kurulum olayının sağladığı verileri sağlar. WorkflowPage.xaml.cs dosyasında:

internal void OnSetupRequested(PrintWorkflowForegroundSession sessionManager, PrintWorkflowForegroundSetupRequestedEventArgs printTaskSetupArgs) {
    // If anything asynchronous is going to be done, you need to take out a deferral here,
    // since otherwise the next callback happens once this one exits, which may be premature
    Deferral setupRequestedDeferral = printTaskSetupArgs.GetDeferral();

    // Get information about the source application, print job title, and session ID
    string sourceApplicationName = printTaskSetupArgs.Configuration.SourceAppDisplayName;
    string jobTitle = printTaskSetupArgs.Configuration.JobTitle;
    string sessionId = printTaskSetupArgs.Configuration.SessionId;
    // the following string should be used when storing data that pertains to this workflow session
    // (such as user input data that is meant to change the print content later on)
    string localStorageVariablePrefix = string.Format("{0}::{1}::", sourceApplicationName, sessionID);

    try
    {
        // receive and store user input
        // ...
    }
    catch (Exception ex)
    {
        string errorMessage = ex.Message;
        Debug.WriteLine(errorMessage);
    }
    finally
    {
        // Complete the deferral taken out at the start of OnSetupRequested
        setupRequestedDeferral.Complete();
    }
}

Ardından, yazdırma sistemi kullanıcı arabirimi için XpsDataAvailable olayını tetikler. Bu olayın işleyicisinde, iş akışı uygulaması kurulum olayında kullanılabilen tüm verilere erişebilir ve ayrıca ham bayt akışı veya nesne modeli olarak XPS verilerini doğrudan okuyabilir. XPS verilerine erişim, kullanıcı arabiriminin baskı önizleme hizmetleri sağlamasına ve kullanıcıya iş akışı uygulamasının veriler üzerinde yürüteceği işlemler hakkında ek bilgi sağlamasına olanak tanır.

Bu olay işleyicisinin bir parçası olarak, iş akışı uygulaması kullanıcıyla etkileşime devam edecekse bir erteleme nesnesi almalıdır. Erteleme olmadan, XpsDataAvailable olay işleyicisi çıktığında veya eşzamanlı olmayan bir yöntem çağırdığında yazdırma sistemi, kullanıcı arabirimi görevinin tamamlanmasını dikkate alır. Uygulama kullanıcının kullanıcı arabirimiyle etkileşiminden tüm gerekli bilgileri topladığında, yazdırma sisteminin daha sonra ilerleyebilmesi için ertelemeyi tamamlaması gerekir.

internal async void OnXpsDataAvailable(PrintWorkflowForegroundSession sessionManager, PrintWorkflowXpsDataAvailableEventArgs printTaskXpsAvailableEventArgs)
{
    // Take out a deferral
    Deferral xpsDataAvailableDeferral = printTaskXpsAvailableEventArgs.GetDeferral();

    SpoolStreamContent xpsStream = printTaskXpsAvailableEventArgs.Operation.XpsContent.GetSourceSpoolDataAsStreamContent();

    IInputStream inputStream = xpsStream.GetInputSpoolStream();

    using (var inputReader = new Windows.Storage.Streams.DataReader(inputStream))
    {
        // Read the XPS data from input stream
        byte[] xpsData = new byte[inputReader.UnconsumedBufferLength];
        while (inputReader.UnconsumedBufferLength > 0)
        {
            inputReader.ReadBytes(xpsData);
            // Do something with the XPS data, e.g. preview
            // ...
        }
    }

    // Complete the deferral taken out at the start of this method
    xpsDataAvailableDeferral.Complete();
}

Ayrıca, olay bağımsız değişkenleri tarafından sunulan PrintWorkflowSubmittedOperation örneği, yazdırma işini iptal etme veya işin başarılı olduğunu ancak çıktı yazdırma işine gerek olmadığını belirtme seçeneği sunar. Bu, PrintWorkflowSubmittedStatus değeriyle Complete yöntemi çağrılarak yapılır.

Uyarı

İş akışı uygulaması yazdırma işini iptal ederse, işin neden iptal edildiğine dair bir bildirim sağlaması kesinlikle önerilir.

Yazdırma içeriğinde son arka plan çalışmasını yapma

Kullanıcı arabirimi, PrintTaskXpsDataAvailable olayında erteleme işlemini tamamladıktan sonra (veya UI adımı atlandıysa), yazdırma sistemi arka plan görevi için Gönderilen olayını tetikler. Bu olayın işleyicisinde iş akışı uygulaması, XpsDataAvailable olayı tarafından sağlanan tüm verilere erişebilir. Ancak, önceki olayların aksine, GönderildiPrintWorkflowTarget örneği aracılığıyla son yazdırma işi içeriğine yazma erişimi de sağlar.

Son yazdırma için verileri biriktirmek için kullanılan nesne, kaynak verilere ham bayt akışı olarak mı yoksa XPS nesne modeli olarak mı erişildiğini bağlıdır. İş akışı uygulaması bir bayt akışı aracılığıyla kaynak verilere eriştiğinde, son iş verilerini yazmak için bir çıkış bayt akışı sağlanır. İş akışı uygulaması nesne modeli aracılığıyla kaynak verilere eriştiğinde, çıkış işine nesne yazmak için bir belge yazıcısı sağlanır. Her iki durumda da iş akışı uygulamasının tüm kaynak verileri okuması, gerekli verileri değiştirmesi ve değiştirilen verileri çıkış hedefine yazması gerekir.

Arka plan görevi verileri yazmayı bitirdiğinde, ilgili PrintWorkflowSubmittedOperation nesnesinde Complete çağırmalıdır. İş akışı uygulaması bu adımı tamamladıktan ve Gönderilen olay işleyicisi çıkış yaptıktan sonra, iş akışı oturumu kapatılır ve kullanıcı standart yazdırma iletişim kutuları aracılığıyla son yazdırma görevinin durumunu izleyebilir.

Son adımlar

Yazdırma iş akışı uygulamasını yazıcıya kaydetme

İş akışı uygulamanız, WSDA'larla aynı türde meta veri dosyası gönderimi kullanan bir yazıcıyla ilişkilendirildi. Aslında tek bir UWP uygulaması hem iş akışı uygulaması hem de yazdırma görevi ayarları işlevselliği sağlayan bir WSDA işlevi görebilir. meta veri ilişkilendirmesi oluşturmak için ilgili WSDA adımlarını izleyin.

Aradaki fark, WSDA'lar kullanıcı için otomatik olarak etkinleştirilirken (kullanıcı ilişkili cihazda yazdırdığında uygulama her zaman başlatılır), iş akışı uygulamalarının etkinleştirilmemesidir. Onların ayarlanması gereken ayrı bir politikası vardır.

İş akışı uygulamasının ilkesini ayarlama

İş akışı uygulaması ilkesi, cihazdaki iş akışı uygulamasını çalıştırmak için kullanılan PowerShell komutları tarafından ayarlanır. Yazıcı Ayarla, Add-Printer (var olan bağlantı noktası) ve Add-Printer (yeni WSD bağlantı noktası) komutları, İş Akışı ilkelerinin ayarlanmasına izin verecek şekilde değiştirilir.

  • Disabled: İş akışı uygulamaları etkinleştirilmez.
  • Uninitialized: İş Akışı DCA'sı sistemde yüklüyse iş akışı uygulamaları etkinleştirilir. Uygulama yüklü değilse yazdırma işlemi devam eder.
  • Enabled: İş Akışı DCA'sı sistemde yüklüyse iş akışı sözleşmesi etkinleştirilir. Uygulama yüklü değilse yazdırma başarısız olur.

Aşağıdaki komut, belirtilen yazıcıda iş akışı uygulamasını gerekli kılar.

Set-Printer –Name "Microsoft XPS Document Writer" -WorkflowPolicy Enabled

Yerel bir kullanıcı bu ilkeyi yerel bir yazıcıda çalıştırabilir veya kuruluş uygulaması için yazıcı yöneticisi bu ilkeyi Yazdırma Sunucusu'nda çalıştırabilir. Politika daha sonra tüm istemci bağlantılarıyla senkronize edilecek. Yazıcı yöneticisi yeni bir yazıcı eklendiğinde bu ilkeyi kullanabilir.

Ayrıca bakınız

İş Akışı uygulaması örneği

Windows.Graphics.Printing.Workflow ad alanı